diff --git a/.dockerignore b/.dockerignore
index 74fa836a6..61cb85b98 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -4,4 +4,8 @@ Dockerfile
.gitignore
.DS_Store
node_modules
-.idea
\ No newline at end of file
+.idea
+.env
+.env.*
+scripts/seed
+scripts/seed-data.ts
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 9cbbd586a..000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "env": {
- "browser": true,
- "es2020": true,
- "node": true,
- "jquery": true,
- "jest": true
- },
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true
- },
- "ecmaVersion": 11,
- "sourceType": "module"
- },
- "extends": [
- "plugin:@typescript-eslint/eslint-recommended",
- "plugin:@typescript-eslint/recommended",
- "eslint:recommended",
- "plugin:prettier/recommended",
- "plugin:import/errors",
- "plugin:import/typescript",
- "plugin:css-modules/recommended",
- "plugin:cypress/recommended",
- "prettier",
- "next"
- ],
- "plugins": ["@typescript-eslint", "prettier", "promise", "css-modules", "cypress"],
- "rules": {
- "no-console": "error",
- "react/display-name": "off",
- "react-hooks/exhaustive-deps": "off",
- "react/react-in-jsx-scope": "off",
- "react/prop-types": "off",
- "import/no-anonymous-default-export": "off",
- "import/no-named-as-default": "off",
- "css-modules/no-unused-class": "off",
- "@next/next/no-img-element": "off",
- "@typescript-eslint/no-empty-function": "off",
- "@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/no-var-requires": "off",
- "@typescript-eslint/no-empty-interface": "off",
- "@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }],
- "@typescript-eslint/no-namespace": ["error", { "allowDeclarations": true }]
- },
- "globals": {
- "React": "writable"
- }
-}
diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml
index 2404918b8..d48567e68 100644
--- a/.github/ISSUE_TEMPLATE/1.bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml
@@ -24,13 +24,13 @@ body:
render: shell
- type: input
attributes:
- label: Which Umami version are you using? (if relevant)
+ label: Which Umami version are you using?
description: 'For example: 2.18.0, 2.15.1, 1.39.0, etc'
- type: input
attributes:
- label: Which browser are you using? (if relevant)
- description: 'For example: Chrome, Edge, Firefox, etc'
+ label: How are you deploying your application?
+ description: 'For example: Vercel, Railway, Docker, etc'
- type: input
attributes:
- label: How are you deploying your application? (if relevant)
- description: 'For example: Vercel, Railway, Docker, etc'
+ label: Which browser are you using?
+ description: 'For example: Chrome, Edge, Firefox, etc'
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
index 051d24a22..199cbe617 100644
--- a/.github/workflows/cd.yml
+++ b/.github/workflows/cd.yml
@@ -2,18 +2,19 @@ name: Create docker images
on:
push:
- branches:
- - master
- - main
- - dev
- # Publish semver tags as releases.
- tags: [ 'v*.*.*' ]
- pull_request:
- branches:
- - master
- - main
- - dev
+ tags:
+ - "v*.*.*"
workflow_dispatch:
+ inputs:
+ version:
+ description: "Optional image version (e.g. 3.0.0, v3.0.0, or 3.0.0-beta.1)"
+ required: false
+ default: ""
+ include_latest:
+ description: "Include latest tag"
+ required: false
+ type: boolean
+ default: true
jobs:
build:
@@ -22,80 +23,105 @@ jobs:
permissions:
contents: read
packages: write
- # This is used to complete the identity challenge
- # with sigstore/fulcio when running outside of PRs.
- id-token: write
-
- strategy:
- matrix:
- db-type: [postgresql, mysql]
steps:
- uses: actions/checkout@v5
- # Install the cosign tool except on PR
- # https://github.com/sigstore/cosign-installer
- - name: Install cosign
- if: github.event_name != 'pull_request'
- uses: sigstore/cosign-installer@v3
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- - name: Log into registry docker.io
- if: github.event_name != 'pull_request' && github.repository == 'umami-software/umami'
- uses: docker/login-action@v3
- with:
- registry: docker.io
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
-
- - name: Log into ghcr registry
- if: github.event_name != 'pull_request'
+ - name: Log into GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- - name: Extract Docker metadata
- id: meta
- uses: docker/metadata-action@v5
+ - name: Log into Docker Hub
+ if: github.repository == 'umami-software/umami'
+ uses: docker/login-action@v3
with:
- images: |
- umamisoftware/umami,enable=${{ github.repository == 'umami-software/umami' }}
- ghcr.io/${{ github.repository }}
- flavor: |
- latest=auto
- prefix=${{ matrix.db-type }}-
- tags: |
- type=ref,event=branch
- type=ref,event=pr
+ registry: docker.io
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
- # output 1.1.2
- type=semver,pattern={{version}}
- # output 1.1
- type=semver,pattern={{major}}.{{minor}}
- # output 1
- type=semver,pattern={{major}}
+ - name: Compute version tags
+ id: compute
+ run: |
+ INPUT="${{ github.event.inputs.version }}"
+ REF_TYPE="${{ github.ref_type }}"
+ REF_NAME="${{ github.ref_name }}"
+ INCLUDE_LATEST="${{ github.event.inputs.include_latest }}"
- - name: Build and push Docker image
- id: build-and-push
- uses: docker/build-push-action@v6
+ # Determine version source
+ if [[ -n "$INPUT" ]]; then
+ VERSION="${INPUT#v}"
+ elif [[ "$REF_TYPE" == "tag" ]]; then
+ VERSION="${REF_NAME#v}"
+ else
+ VERSION=""
+ fi
+
+ GHCR_TAGS=""
+ DOCKER_TAGS=""
+
+ if [[ -n "$VERSION" ]]; then
+ MAJOR=$(echo "$VERSION" | cut -d. -f1)
+ MINOR=$(echo "$VERSION" | cut -d. -f2)
+
+ if [[ "$VERSION" == *-* ]]; then
+ # prerelease: only version tag
+ GHCR_TAGS="ghcr.io/${{ github.repository }}:$VERSION"
+ DOCKER_TAGS="umamisoftware/umami:$VERSION"
+ else
+ # stable release: version + hierarchy
+ GHCR_TAGS="ghcr.io/${{ github.repository }}:$VERSION"
+ GHCR_TAGS="$GHCR_TAGS,ghcr.io/${{ github.repository }}:${MAJOR}.${MINOR}"
+ GHCR_TAGS="$GHCR_TAGS,ghcr.io/${{ github.repository }}:${MAJOR}"
+ GHCR_TAGS="$GHCR_TAGS,ghcr.io/${{ github.repository }}:postgresql-latest"
+
+ DOCKER_TAGS="umamisoftware/umami:$VERSION"
+ DOCKER_TAGS="$DOCKER_TAGS,umamisoftware/umami:${MAJOR}.${MINOR}"
+ DOCKER_TAGS="$DOCKER_TAGS,umamisoftware/umami:${MAJOR}"
+ DOCKER_TAGS="$DOCKER_TAGS,umamisoftware/umami:postgresql-latest"
+
+ # Add latest tag based on trigger and input
+ if [[ "$REF_TYPE" == "tag" ]] || [[ "$INCLUDE_LATEST" == "true" ]]; then
+ GHCR_TAGS="$GHCR_TAGS,ghcr.io/${{ github.repository }}:latest"
+ DOCKER_TAGS="$DOCKER_TAGS,umamisoftware/umami:latest"
+ fi
+ fi
+ else
+ # Non-tag build (e.g. from main branch)
+ GHCR_TAGS="ghcr.io/${{ github.repository }}:${REF_NAME}"
+ DOCKER_TAGS="umamisoftware/umami:${REF_NAME}"
+ fi
+
+ echo "ghcr_tags=$GHCR_TAGS" >> $GITHUB_OUTPUT
+ echo "docker_tags=$DOCKER_TAGS" >> $GITHUB_OUTPUT
+ echo "Computed GHCR tags: $GHCR_TAGS"
+ echo "Computed Docker Hub tags: $DOCKER_TAGS"
+
+ - name: Build and push to GHCR
+ uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
- build-args: DATABASE_TYPE=${{ matrix.db-type }}
- push: ${{ github.event_name != 'pull_request' }}
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
+ push: true
+ tags: ${{ steps.compute.outputs.ghcr_tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
- # Sign the resulting Docker image digest except on PRs.
- - name: Sign the published Docker image
- if: ${{ github.event_name != 'pull_request' }}
- env:
- TAGS: ${{ steps.meta.outputs.tags }}
- DIGEST: ${{ steps.build-and-push.outputs.digest }}
- run: echo "${TAGS}" | xargs -I {} cosign sign --yes "{}@${DIGEST}"
+ - name: Build and push to Docker Hub
+ if: github.repository == 'umami-software/umami'
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ platforms: linux/amd64,linux/arm64
+ push: true
+ tags: ${{ steps.compute.outputs.docker_tags }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d2e027cfb..b97dac128 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,44 +1,28 @@
-# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
-# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
-
name: Node.js CI
on: [push]
env:
- DATABASE_TYPE: postgresql
+ DATABASE_URL: "postgresql://user:pass@localhost:5432/dummy"
SKIP_DB_CHECK: 1
jobs:
build:
- # Only run the CI if it belongs to the original repository
if: github.repository == 'umami-software/umami'
runs-on: ubuntu-latest
- strategy:
- matrix:
- include:
- - node-version: 18.18
- pnpm-version: 10
- db-type: postgresql
- - node-version: 18.18
- pnpm-version: 10
- db-type: mysql
-
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v4 # required so that setup-node will work
- with:
- version: ${{ matrix.pnpm-version }}
- run_install: false
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
- with:
- node-version: ${{ matrix.node-version }}
- cache: 'pnpm'
- env:
- DATABASE_TYPE: ${{ matrix.db-type }}
- - run: npm install --global pnpm
- - run: pnpm install
- - run: pnpm test
- - run: pnpm build
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ run_install: false
+ - name: Use Node.js 22
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: "pnpm"
+ - run: npm install --global pnpm
+ - run: pnpm install
+ - run: pnpm test
+ - run: pnpm build
diff --git a/.gitignore b/.gitignore
index 9cf14dd6a..5c98531ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,21 +5,25 @@ node_modules
.pnp
.pnp.js
.pnpm-store
+package-lock.json
# testing
/coverage
# next.js
-/.next/
-/out/
-/prisma/
-/src/generated/
+next-env.d.ts
+/.next
+/out
# production
/build
/public/script.js
+/public/recorder.js
/geo
/dist
+/generated
+/src/generated
+pm2.yml
# misc
.DS_Store
@@ -29,6 +33,11 @@ node_modules
*.log
.vscode
.tool-versions
+.claude
+.agents
+tmpclaude*
+CLAUDE.md
+nul
# debug
npm-debug.log*
@@ -41,4 +50,3 @@ yarn-error.log*
*.env.*
*.dev.yml
-
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100755
index 36af21989..000000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx lint-staged
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 08076d405..000000000
--- a/.prettierignore
+++ /dev/null
@@ -1 +0,0 @@
-/public/script.js
\ No newline at end of file
diff --git a/.prettierrc.json b/.prettierrc.json
deleted file mode 100644
index 1193784df..000000000
--- a/.prettierrc.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "arrowParens": "avoid",
- "endOfLine": "lf",
- "printWidth": 100,
- "singleQuote": true,
- "trailingComma": "all"
-}
diff --git a/.stylelintrc.json b/.stylelintrc.json
index b940b63e4..1831c1ffb 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -1,11 +1,6 @@
{
- "extends": [
- "stylelint-config-recommended",
- "stylelint-config-css-modules",
- "stylelint-config-prettier"
- ],
+ "extends": ["stylelint-config-recommended", "stylelint-config-css-modules"],
"rules": {
"no-descending-specificity": null
- },
- "ignoreFiles": ["**/*.js", "**/*.md"]
+ }
}
diff --git a/Dockerfile b/Dockerfile
index 4b156643b..7c2271922 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,7 @@
+ARG NODE_IMAGE_VERSION="22-alpine"
+
# Install dependencies only when needed
-FROM node:22-alpine AS deps
+FROM node:${NODE_IMAGE_VERSION} AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app
@@ -8,25 +10,25 @@ RUN npm install -g pnpm
RUN pnpm install --frozen-lockfile
# Rebuild the source code only when needed
-FROM node:22-alpine AS builder
+FROM node:${NODE_IMAGE_VERSION} AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
+COPY docker/middleware.ts ./src
-ARG DATABASE_TYPE
ARG BASE_PATH
-ENV DATABASE_TYPE=$DATABASE_TYPE
ENV BASE_PATH=$BASE_PATH
-
ENV NEXT_TELEMETRY_DISABLED=1
+ENV DATABASE_URL="postgresql://user:pass@localhost:5432/dummy"
RUN npm run build-docker
# Production image, copy all the files and run next
-FROM node:22-alpine AS runner
+FROM node:${NODE_IMAGE_VERSION} AS runner
WORKDIR /app
+ARG PRISMA_VERSION="7.3.0"
ARG NODE_OPTIONS
ENV NODE_ENV=production
@@ -35,29 +37,26 @@ ENV NODE_OPTIONS=$NODE_OPTIONS
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
-RUN npm install -g pnpm
-
RUN set -x \
- && apk add --no-cache curl
+ && apk add --no-cache curl \
+ && npm install -g pnpm
# Script dependencies
-RUN pnpm add npm-run-all dotenv prisma@6.7.0
-
-# Permissions for prisma
-RUN chown -R nextjs:nodejs node_modules/.pnpm/
+RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver \
+ prisma@${PRISMA_VERSION} \
+ @prisma/client@${PRISMA_VERSION} \
+ @prisma/adapter-pg@${PRISMA_VERSION}
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/scripts ./scripts
+COPY --from=builder /app/generated ./generated
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
-# Custom routes
-RUN mv ./.next/routes-manifest.json ./.next/routes-manifest-orig.json
-
USER nextjs
EXPOSE 3000
@@ -65,4 +64,4 @@ EXPOSE 3000
ENV HOSTNAME=0.0.0.0
ENV PORT=3000
-CMD ["pnpm", "start-docker"]
+CMD ["pnpm", "start-docker"]
\ No newline at end of file
diff --git a/README.md b/README.md
index fcbe856f1..cd365a68d 100644
--- a/README.md
+++ b/README.md
@@ -9,18 +9,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
---
@@ -35,10 +27,10 @@ A detailed getting started guide can be found at [umami.is/docs](https://umami.i
### Requirements
-- A server with Node.js version 18.18 or newer
-- A database. Umami supports [MariaDB](https://www.mariadb.org/) (minimum v10.5), [MySQL](https://www.mysql.com/) (minimum v8.0) and [PostgreSQL](https://www.postgresql.org/) (minimum v12.14) databases.
+- A server with Node.js version 18.18+.
+- A PostgreSQL database version v12.14+.
-### Get the Source Code and Install Packages
+### Get the source code and install packages
```bash
git clone https://github.com/umami-software/umami.git
@@ -58,7 +50,6 @@ The connection URL format:
```bash
postgresql://username:mypassword@localhost:5432/mydb
-mysql://username:mypassword@localhost:3306/mydb
```
### Build the Application
@@ -67,7 +58,7 @@ mysql://username:mypassword@localhost:3306/mydb
pnpm run build
```
-_The build step will create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**._
+The build step will create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**.
### Start the Application
@@ -75,30 +66,26 @@ _The build step will create tables in your database if you are installing for th
pnpm run start
```
-_By default, this will launch the application on `http://localhost:3000`. You will need to either [proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) requests from your web server or change the [port](https://nextjs.org/docs/api-reference/cli#production) to serve the application directly._
+By default, this will launch the application on `http://localhost:3000`. You will need to either [proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) requests from your web server or change the [port](https://nextjs.org/docs/api-reference/cli#production) to serve the application directly.
---
## 🐳 Installing with Docker
-To build the Umami container and start up a Postgres database, run:
+Umami provides Docker images as well as a Docker compose file for easy deployment.
+
+Docker image:
+
+```bash
+docker pull docker.umami.is/umami-software/umami:latest
+```
+
+Docker compose (Runs Umami with a PostgreSQL database):
```bash
docker compose up -d
```
-Alternatively, to pull just the Umami Docker image with PostgreSQL support:
-
-```bash
-docker pull docker.umami.is/umami-software/umami:postgresql-latest
-```
-
-Or with MySQL support:
-
-```bash
-docker pull docker.umami.is/umami-software/umami:mysql-latest
-```
-
---
## 🔄 Getting Updates
@@ -108,7 +95,7 @@ To get the latest features, simply do a pull, install any new dependencies, and
```bash
git pull
pnpm install
-pnpm run build
+pnpm build
```
To update the Docker image, simply pull the new images and rebuild:
@@ -123,18 +110,10 @@ docker compose up --force-recreate -d
## 🛟 Support
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
[release-shield]: https://img.shields.io/github/release/umami-software/umami.svg
diff --git a/biome.json b/biome.json
new file mode 100644
index 000000000..61d094cac
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,65 @@
+{
+ "$schema": "https://biomejs.dev/schemas/2.3.6/schema.json",
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ },
+ "files": {
+ "includes": ["**", "!!**/dist"]
+ },
+ "formatter": {
+ "enabled": true,
+ "lineWidth": 100,
+ "indentStyle": "space",
+ "indentWidth": 2,
+ "lineEnding": "lf"
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "a11y": "off",
+ "correctness": {
+ "useExhaustiveDependencies": "off"
+ },
+ "style": {
+ "noDescendingSpecificity": "off"
+ },
+ "complexity": {
+ "noImportantStyles": "off"
+ },
+ "suspicious": {
+ "noArrayIndexKey": "off",
+ "noExplicitAny": "off",
+ "noImplicitAnyLet": "off"
+ },
+ "performance": {
+ "noImgElement": "off"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "quoteStyle": "single",
+ "trailingCommas": "all",
+ "arrowParentheses": "asNeeded"
+ }
+ },
+ "css": {
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "space",
+ "indentWidth": 2,
+ "lineEnding": "lf"
+ }
+ },
+ "assist": {
+ "enabled": true,
+ "actions": {
+ "source": {
+ "organizeImports": "on"
+ }
+ }
+ }
+}
diff --git a/db/clickhouse/migrations/09_add_performance.sql b/db/clickhouse/migrations/09_add_performance.sql
new file mode 100644
index 000000000..12f631eb6
--- /dev/null
+++ b/db/clickhouse/migrations/09_add_performance.sql
@@ -0,0 +1,105 @@
+-- Add performance columns to website_event
+ALTER TABLE umami.website_event ADD COLUMN lcp Nullable(Decimal(10, 1)) AFTER twclid;
+ALTER TABLE umami.website_event ADD COLUMN inp Nullable(Decimal(10, 1)) AFTER lcp;
+ALTER TABLE umami.website_event ADD COLUMN cls Nullable(Decimal(10, 4)) AFTER inp;
+ALTER TABLE umami.website_event ADD COLUMN fcp Nullable(Decimal(10, 1)) AFTER cls;
+ALTER TABLE umami.website_event ADD COLUMN ttfb Nullable(Decimal(10, 1)) AFTER fcp;
+
+-- Update materialized view to exclude performance events from view counts
+DROP TABLE umami.website_event_stats_hourly_mv;
+
+CREATE MATERIALIZED VIEW umami.website_event_stats_hourly_mv
+TO umami.website_event_stats_hourly
+AS
+SELECT
+ website_id,
+ session_id,
+ visit_id,
+ hostnames as hostname,
+ browser,
+ os,
+ device,
+ screen,
+ language,
+ country,
+ region,
+ city,
+ entry_url,
+ exit_url,
+ url_paths as url_path,
+ url_query,
+ utm_source,
+ utm_medium,
+ utm_campaign,
+ utm_content,
+ utm_term,
+ referrer_domain,
+ page_title,
+ gclid,
+ fbclid,
+ msclkid,
+ ttclid,
+ li_fat_id,
+ twclid,
+ event_type,
+ event_name,
+ views,
+ min_time,
+ max_time,
+ tag,
+ distinct_id,
+ timestamp as created_at
+FROM (SELECT
+ website_id,
+ session_id,
+ visit_id,
+ arrayFilter(x -> x != '', groupArray(hostname)) hostnames,
+ browser,
+ os,
+ device,
+ screen,
+ language,
+ country,
+ region,
+ city,
+ argMinState(url_path, created_at) entry_url,
+ argMaxState(url_path, created_at) exit_url,
+ arrayFilter(x -> x != '', groupArray(url_path)) as url_paths,
+ arrayFilter(x -> x != '', groupArray(url_query)) url_query,
+ arrayFilter(x -> x != '', groupArray(utm_source)) utm_source,
+ arrayFilter(x -> x != '', groupArray(utm_medium)) utm_medium,
+ arrayFilter(x -> x != '', groupArray(utm_campaign)) utm_campaign,
+ arrayFilter(x -> x != '', groupArray(utm_content)) utm_content,
+ arrayFilter(x -> x != '', groupArray(utm_term)) utm_term,
+ arrayFilter(x -> x != '' and x != hostname, groupArray(referrer_domain)) referrer_domain,
+ arrayFilter(x -> x != '', groupArray(page_title)) page_title,
+ arrayFilter(x -> x != '', groupArray(gclid)) gclid,
+ arrayFilter(x -> x != '', groupArray(fbclid)) fbclid,
+ arrayFilter(x -> x != '', groupArray(msclkid)) msclkid,
+ arrayFilter(x -> x != '', groupArray(ttclid)) ttclid,
+ arrayFilter(x -> x != '', groupArray(li_fat_id)) li_fat_id,
+ arrayFilter(x -> x != '', groupArray(twclid)) twclid,
+ event_type,
+ if(event_type = 2, groupArray(event_name), []) event_name,
+ sumIf(1, event_type NOT IN (2, 5)) views,
+ min(created_at) min_time,
+ max(created_at) max_time,
+ arrayFilter(x -> x != '', groupArray(tag)) tag,
+ distinct_id,
+ toStartOfHour(created_at) timestamp
+FROM umami.website_event
+GROUP BY website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ screen,
+ language,
+ country,
+ region,
+ city,
+ event_type,
+ distinct_id,
+ timestamp);
diff --git a/db/clickhouse/migrations/10_add_session_replay.sql b/db/clickhouse/migrations/10_add_session_replay.sql
new file mode 100644
index 000000000..c6df19c53
--- /dev/null
+++ b/db/clickhouse/migrations/10_add_session_replay.sql
@@ -0,0 +1,18 @@
+-- Create session_replay
+CREATE TABLE umami.session_replay
+(
+ replay_id UUID,
+ website_id UUID,
+ session_id UUID,
+ visit_id UUID,
+ chunk_index UInt32,
+ events String CODEC(ZSTD(3)),
+ event_count UInt32,
+ started_at DateTime64(6),
+ ended_at DateTime64(6),
+ created_at DateTime64(6) DEFAULT now64(6)
+)
+ENGINE = MergeTree()
+PARTITION BY toYYYYMM(created_at)
+ORDER BY (replay_id, website_id, session_id, visit_id, chunk_index)
+SETTINGS index_granularity = 8192;
\ No newline at end of file
diff --git a/db/clickhouse/schema.sql b/db/clickhouse/schema.sql
index 41b3a1b3e..f8add3569 100644
--- a/db/clickhouse/schema.sql
+++ b/db/clickhouse/schema.sql
@@ -34,6 +34,12 @@ CREATE TABLE umami.website_event
ttclid String,
li_fat_id String,
twclid String,
+ --performance
+ lcp Nullable(Decimal(10, 1)),
+ inp Nullable(Decimal(10, 1)),
+ cls Nullable(Decimal(10, 4)),
+ fcp Nullable(Decimal(10, 1)),
+ ttfb Nullable(Decimal(10, 1)),
--events
event_type UInt32,
event_name String,
@@ -57,7 +63,7 @@ CREATE TABLE umami.event_data
event_name String,
data_key String,
string_value Nullable(String),
- number_value Nullable(Decimal64(4)),
+ number_value Nullable(Decimal(22, 4)),
date_value Nullable(DateTime('UTC')),
data_type UInt32,
created_at DateTime('UTC'),
@@ -73,7 +79,7 @@ CREATE TABLE umami.session_data
session_id UUID,
data_key String,
string_value Nullable(String),
- number_value Nullable(Decimal64(4)),
+ number_value Nullable(Decimal(22, 4)),
date_value Nullable(DateTime('UTC')),
data_type UInt32,
distinct_id String,
@@ -209,7 +215,7 @@ FROM (SELECT
arrayFilter(x -> x != '', groupArray(twclid)) twclid,
event_type,
if(event_type = 2, groupArray(event_name), []) event_name,
- sumIf(1, event_type = 1) views,
+ sumIf(1, event_type NOT IN (2, 5)) views,
min(created_at) min_time,
max(created_at) max_time,
arrayFilter(x -> x != '', groupArray(tag)) tag,
@@ -281,3 +287,22 @@ JOIN (SELECT event_id, string_value as currency
WHERE positionCaseInsensitive(data_key, 'currency') > 0) c
ON c.event_id = ed.event_id
WHERE positionCaseInsensitive(data_key, 'revenue') > 0;
+
+-- Create session_replay
+CREATE TABLE umami.session_replay
+(
+ replay_id UUID,
+ website_id UUID,
+ session_id UUID,
+ visit_id UUID,
+ chunk_index UInt32,
+ events String CODEC(ZSTD(3)),
+ event_count UInt32,
+ started_at DateTime64(6),
+ ended_at DateTime64(6),
+ created_at DateTime64(6) DEFAULT now64(6)
+)
+ENGINE = MergeTree()
+PARTITION BY toYYYYMM(created_at)
+ORDER BY (replay_id, website_id, session_id, visit_id, chunk_index)
+SETTINGS index_granularity = 8192;
\ No newline at end of file
diff --git a/db/mysql/migrations/01_init/migration.sql b/db/mysql/migrations/01_init/migration.sql
deleted file mode 100644
index d66e2a9cc..000000000
--- a/db/mysql/migrations/01_init/migration.sql
+++ /dev/null
@@ -1,143 +0,0 @@
--- CreateTable
-CREATE TABLE `user` (
- `user_id` VARCHAR(36) NOT NULL,
- `username` VARCHAR(255) NOT NULL,
- `password` VARCHAR(60) NOT NULL,
- `role` VARCHAR(50) NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
- `deleted_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `user_user_id_key`(`user_id`),
- UNIQUE INDEX `user_username_key`(`username`),
- PRIMARY KEY (`user_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `session` (
- `session_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `hostname` VARCHAR(100) NULL,
- `browser` VARCHAR(20) NULL,
- `os` VARCHAR(20) NULL,
- `device` VARCHAR(20) NULL,
- `screen` VARCHAR(11) NULL,
- `language` VARCHAR(35) NULL,
- `country` CHAR(2) NULL,
- `subdivision1` CHAR(20) NULL,
- `subdivision2` VARCHAR(50) NULL,
- `city` VARCHAR(50) NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
-
- UNIQUE INDEX `session_session_id_key`(`session_id`),
- INDEX `session_created_at_idx`(`created_at`),
- INDEX `session_website_id_idx`(`website_id`),
- PRIMARY KEY (`session_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `website` (
- `website_id` VARCHAR(36) NOT NULL,
- `name` VARCHAR(100) NOT NULL,
- `domain` VARCHAR(500) NULL,
- `share_id` VARCHAR(50) NULL,
- `reset_at` TIMESTAMP(0) NULL,
- `user_id` VARCHAR(36) NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
- `deleted_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `website_website_id_key`(`website_id`),
- UNIQUE INDEX `website_share_id_key`(`share_id`),
- INDEX `website_user_id_idx`(`user_id`),
- INDEX `website_created_at_idx`(`created_at`),
- INDEX `website_share_id_idx`(`share_id`),
- PRIMARY KEY (`website_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `website_event` (
- `event_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `session_id` VARCHAR(36) NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `url_path` VARCHAR(500) NOT NULL,
- `url_query` VARCHAR(500) NULL,
- `referrer_path` VARCHAR(500) NULL,
- `referrer_query` VARCHAR(500) NULL,
- `referrer_domain` VARCHAR(500) NULL,
- `page_title` VARCHAR(500) NULL,
- `event_type` INTEGER UNSIGNED NOT NULL DEFAULT 1,
- `event_name` VARCHAR(50) NULL,
-
- INDEX `website_event_created_at_idx`(`created_at`),
- INDEX `website_event_session_id_idx`(`session_id`),
- INDEX `website_event_website_id_idx`(`website_id`),
- INDEX `website_event_website_id_created_at_idx`(`website_id`, `created_at`),
- INDEX `website_event_website_id_session_id_created_at_idx`(`website_id`, `session_id`, `created_at`),
- PRIMARY KEY (`event_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `event_data` (
- `event_id` VARCHAR(36) NOT NULL,
- `website_event_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `event_key` VARCHAR(500) NOT NULL,
- `event_string_value` VARCHAR(500) NULL,
- `event_numeric_value` DECIMAL(19, 4) NULL,
- `event_date_value` TIMESTAMP(0) NULL,
- `event_data_type` INTEGER UNSIGNED NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
-
- INDEX `event_data_created_at_idx`(`created_at`),
- INDEX `event_data_website_id_idx`(`website_id`),
- INDEX `event_data_website_event_id_idx`(`website_event_id`),
- INDEX `event_data_website_id_website_event_id_created_at_idx`(`website_id`, `website_event_id`, `created_at`),
- PRIMARY KEY (`event_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `team` (
- `team_id` VARCHAR(36) NOT NULL,
- `name` VARCHAR(50) NOT NULL,
- `access_code` VARCHAR(50) NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `team_team_id_key`(`team_id`),
- UNIQUE INDEX `team_access_code_key`(`access_code`),
- INDEX `team_access_code_idx`(`access_code`),
- PRIMARY KEY (`team_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `team_user` (
- `team_user_id` VARCHAR(36) NOT NULL,
- `team_id` VARCHAR(36) NOT NULL,
- `user_id` VARCHAR(36) NOT NULL,
- `role` VARCHAR(50) NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `team_user_team_user_id_key`(`team_user_id`),
- INDEX `team_user_team_id_idx`(`team_id`),
- INDEX `team_user_user_id_idx`(`user_id`),
- PRIMARY KEY (`team_user_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `team_website` (
- `team_website_id` VARCHAR(36) NOT NULL,
- `team_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
-
- UNIQUE INDEX `team_website_team_website_id_key`(`team_website_id`),
- INDEX `team_website_team_id_idx`(`team_id`),
- INDEX `team_website_website_id_idx`(`website_id`),
- PRIMARY KEY (`team_website_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- AddSystemUser
-INSERT INTO user (user_id, username, role, password) VALUES ('41e2b680-648e-4b09-bcd7-3e2b10c06264' , 'admin', 'admin', '$2b$10$BUli0c.muyCW1ErNJc3jL.vFRFtFJWrT8/GcR4A.sUdCznaXiqFXa');
\ No newline at end of file
diff --git a/db/mysql/migrations/02_report_schema_session_data/migration.sql b/db/mysql/migrations/02_report_schema_session_data/migration.sql
deleted file mode 100644
index b165383a6..000000000
--- a/db/mysql/migrations/02_report_schema_session_data/migration.sql
+++ /dev/null
@@ -1,53 +0,0 @@
--- AlterTable
-ALTER TABLE `event_data` CHANGE `event_data_type` `data_type` INTEGER UNSIGNED NOT NULL;
-ALTER TABLE `event_data` CHANGE `event_date_value` `date_value` TIMESTAMP(0) NULL;
-ALTER TABLE `event_data` CHANGE `event_id` `event_data_id` VARCHAR(36) NOT NULL;
-ALTER TABLE `event_data` CHANGE `event_numeric_value` `number_value` DECIMAL(19,4) NULL;
-ALTER TABLE `event_data` CHANGE `event_string_value` `string_value` VARCHAR(500) NULL;
-
--- CreateTable
-CREATE TABLE `session_data` (
- `session_data_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `session_id` VARCHAR(36) NOT NULL,
- `event_key` VARCHAR(500) NOT NULL,
- `string_value` VARCHAR(500) NULL,
- `number_value` DECIMAL(19, 4) NULL,
- `date_value` TIMESTAMP(0) NULL,
- `data_type` INTEGER UNSIGNED NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
-
- INDEX `session_data_created_at_idx`(`created_at`),
- INDEX `session_data_website_id_idx`(`website_id`),
- INDEX `session_data_session_id_idx`(`session_id`),
- PRIMARY KEY (`session_data_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- CreateTable
-CREATE TABLE `report` (
- `report_id` VARCHAR(36) NOT NULL,
- `user_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `type` VARCHAR(200) NOT NULL,
- `name` VARCHAR(200) NOT NULL,
- `description` VARCHAR(500) NOT NULL,
- `parameters` VARCHAR(6000) NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `report_report_id_key`(`report_id`),
- INDEX `report_user_id_idx`(`user_id`),
- INDEX `report_website_id_idx`(`website_id`),
- INDEX `report_type_idx`(`type`),
- INDEX `report_name_idx`(`name`),
- PRIMARY KEY (`report_id`)
-) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
--- EventData migration
-UPDATE event_data
-SET string_value = number_value
-WHERE data_type = 2;
-
-UPDATE event_data
-SET string_value = CONCAT(REPLACE(DATE_FORMAT(date_value, '%Y-%m-%d %T'), ' ', 'T'), 'Z')
-WHERE data_type = 4;
diff --git a/db/mysql/migrations/03_metric_performance_index/migration.sql b/db/mysql/migrations/03_metric_performance_index/migration.sql
deleted file mode 100644
index 646813647..000000000
--- a/db/mysql/migrations/03_metric_performance_index/migration.sql
+++ /dev/null
@@ -1,50 +0,0 @@
--- CreateIndex
-CREATE INDEX `event_data_website_id_created_at_idx` ON `event_data`(`website_id`, `created_at`);
-
--- CreateIndex
-CREATE INDEX `event_data_website_id_created_at_event_key_idx` ON `event_data`(`website_id`, `created_at`, `event_key`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_idx` ON `session`(`website_id`, `created_at`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_hostname_idx` ON `session`(`website_id`, `created_at`, `hostname`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_browser_idx` ON `session`(`website_id`, `created_at`, `browser`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_os_idx` ON `session`(`website_id`, `created_at`, `os`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_device_idx` ON `session`(`website_id`, `created_at`, `device`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_screen_idx` ON `session`(`website_id`, `created_at`, `screen`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_language_idx` ON `session`(`website_id`, `created_at`, `language`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_country_idx` ON `session`(`website_id`, `created_at`, `country`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_subdivision1_idx` ON `session`(`website_id`, `created_at`, `subdivision1`);
-
--- CreateIndex
-CREATE INDEX `session_website_id_created_at_city_idx` ON `session`(`website_id`, `created_at`, `city`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_url_path_idx` ON `website_event`(`website_id`, `created_at`, `url_path`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_url_query_idx` ON `website_event`(`website_id`, `created_at`, `url_query`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_referrer_domain_idx` ON `website_event`(`website_id`, `created_at`, `referrer_domain`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_page_title_idx` ON `website_event`(`website_id`, `created_at`, `page_title`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_event_name_idx` ON `website_event`(`website_id`, `created_at`, `event_name`);
diff --git a/db/mysql/migrations/04_team_redesign/migration.sql b/db/mysql/migrations/04_team_redesign/migration.sql
deleted file mode 100644
index bf64d45f2..000000000
--- a/db/mysql/migrations/04_team_redesign/migration.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the `team_website` table. If the table is not empty, all the data it contains will be lost.
-
-*/
--- AlterTable
-ALTER TABLE `team` ADD COLUMN `deleted_at` TIMESTAMP(0) NULL,
- ADD COLUMN `logo_url` VARCHAR(2183) NULL;
-
--- AlterTable
-ALTER TABLE `user` ADD COLUMN `display_name` VARCHAR(255) NULL,
- ADD COLUMN `logo_url` VARCHAR(2183) NULL;
-
--- AlterTable
-ALTER TABLE `website` ADD COLUMN `created_by` VARCHAR(36) NULL,
- ADD COLUMN `team_id` VARCHAR(36) NULL;
-
--- MigrateData
-UPDATE `website` SET created_by = user_id WHERE team_id IS NULL;
-
--- DropTable
-DROP TABLE `team_website`;
-
--- CreateIndex
-CREATE INDEX `website_team_id_idx` ON `website`(`team_id`);
-
--- CreateIndex
-CREATE INDEX `website_created_by_idx` ON `website`(`created_by`);
diff --git a/db/mysql/migrations/05_add_visit_id/migration.sql b/db/mysql/migrations/05_add_visit_id/migration.sql
deleted file mode 100644
index 7a833a885..000000000
--- a/db/mysql/migrations/05_add_visit_id/migration.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- AlterTable
-ALTER TABLE `website_event` ADD COLUMN `visit_id` VARCHAR(36) NULL;
-
-UPDATE `website_event` we
-JOIN (SELECT DISTINCT
- s.session_id,
- s.visit_time,
- BIN_TO_UUID(RANDOM_BYTES(16) & 0xffffffffffff0fff3fffffffffffffff | 0x00000000000040008000000000000000) uuid
- FROM (SELECT DISTINCT session_id,
- DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') visit_time
- FROM `website_event`) s) a
- ON we.session_id = a.session_id and DATE_FORMAT(we.created_at, '%Y-%m-%d %H:00:00') = a.visit_time
-SET we.visit_id = a.uuid
-WHERE we.visit_id IS NULL;
-
-ALTER TABLE `website_event` MODIFY `visit_id` VARCHAR(36) NOT NULL;
-
--- CreateIndex
-CREATE INDEX `website_event_visit_id_idx` ON `website_event`(`visit_id`);
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_visit_id_created_at_idx` ON `website_event`(`website_id`, `visit_id`, `created_at`);
diff --git a/db/mysql/migrations/06_session_data/migration.sql b/db/mysql/migrations/06_session_data/migration.sql
deleted file mode 100644
index 97ed60adf..000000000
--- a/db/mysql/migrations/06_session_data/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- DropIndex
-DROP INDEX `event_data_website_id_created_at_event_key_idx` ON `event_data`;
-
--- DropIndex
-DROP INDEX `event_data_website_id_website_event_id_created_at_idx` ON `event_data`;
-
--- AlterTable
-ALTER TABLE `event_data` RENAME COLUMN `event_key` TO `data_key`;
-
--- AlterTable
-ALTER TABLE `session_data` RENAME COLUMN `event_key` TO `data_key`;
-
--- CreateIndex
-CREATE INDEX `event_data_website_id_created_at_data_key_idx` ON `event_data`(`website_id`, `created_at`, `data_key`);
-
--- CreateIndex
-CREATE INDEX `session_data_session_id_created_at_idx` ON `session_data`(`session_id`, `created_at`);
-
--- CreateIndex
-CREATE INDEX `session_data_website_id_created_at_data_key_idx` ON `session_data`(`website_id`, `created_at`, `data_key`);
diff --git a/db/mysql/migrations/07_add_tag/migration.sql b/db/mysql/migrations/07_add_tag/migration.sql
deleted file mode 100644
index f1c349bd4..000000000
--- a/db/mysql/migrations/07_add_tag/migration.sql
+++ /dev/null
@@ -1,5 +0,0 @@
--- AlterTable
-ALTER TABLE `website_event` ADD COLUMN `tag` VARCHAR(50) NULL;
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_tag_idx` ON `website_event`(`website_id`, `created_at`, `tag`);
diff --git a/db/mysql/migrations/08_add_utm_clid/migration.sql b/db/mysql/migrations/08_add_utm_clid/migration.sql
deleted file mode 100644
index 1fc3f4c16..000000000
--- a/db/mysql/migrations/08_add_utm_clid/migration.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- AlterTable
-ALTER TABLE `website_event`
-ADD COLUMN `fbclid` VARCHAR(255) NULL,
-ADD COLUMN `gclid` VARCHAR(255) NULL,
-ADD COLUMN `li_fat_id` VARCHAR(255) NULL,
-ADD COLUMN `msclkid` VARCHAR(255) NULL,
-ADD COLUMN `ttclid` VARCHAR(255) NULL,
-ADD COLUMN `twclid` VARCHAR(255) NULL,
-ADD COLUMN `utm_campaign` VARCHAR(255) NULL,
-ADD COLUMN `utm_content` VARCHAR(255) NULL,
-ADD COLUMN `utm_medium` VARCHAR(255) NULL,
-ADD COLUMN `utm_source` VARCHAR(255) NULL,
-ADD COLUMN `utm_term` VARCHAR(255) NULL;
diff --git a/db/mysql/migrations/09_update_hostname_region/migration.sql b/db/mysql/migrations/09_update_hostname_region/migration.sql
deleted file mode 100644
index 5443628b0..000000000
--- a/db/mysql/migrations/09_update_hostname_region/migration.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- AlterTable
-ALTER TABLE `website_event` ADD COLUMN `hostname` VARCHAR(100) NULL;
-
--- DataMigration
-UPDATE `website_event` w
-JOIN `session` s
-ON s.website_id = w.website_id
- and s.session_id = w.session_id
-SET w.hostname = s.hostname;
-
--- DropIndex
-DROP INDEX `session_website_id_created_at_hostname_idx` ON `session`;
-DROP INDEX `session_website_id_created_at_subdivision1_idx` ON `session`;
-
--- AlterTable
-ALTER TABLE `session` RENAME COLUMN `subdivision1` TO `region`;
-ALTER TABLE `session` DROP COLUMN `subdivision2`;
-ALTER TABLE `session` DROP COLUMN `hostname`;
-
--- CreateIndex
-CREATE INDEX `website_event_website_id_created_at_hostname_idx` ON `website_event`(`website_id`, `created_at`, `hostname`);
-CREATE INDEX `session_website_id_created_at_region_idx` ON `session`(`website_id`, `created_at`, `region`);
\ No newline at end of file
diff --git a/db/mysql/migrations/10_add_distinct_id/migration.sql b/db/mysql/migrations/10_add_distinct_id/migration.sql
deleted file mode 100644
index fa3942e45..000000000
--- a/db/mysql/migrations/10_add_distinct_id/migration.sql
+++ /dev/null
@@ -1,5 +0,0 @@
--- AlterTable
-ALTER TABLE `session` ADD COLUMN `distinct_id` VARCHAR(50) NULL;
-
--- AlterTable
-ALTER TABLE `session_data` ADD COLUMN `distinct_id` VARCHAR(50) NULL;
diff --git a/db/mysql/migrations/11_add_segment/migration.sql b/db/mysql/migrations/11_add_segment/migration.sql
deleted file mode 100644
index c79e916d6..000000000
--- a/db/mysql/migrations/11_add_segment/migration.sql
+++ /dev/null
@@ -1,14 +0,0 @@
--- CreateTable
-CREATE TABLE `segment` (
- `segment_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `type` VARCHAR(200) NOT NULL,
- `name` VARCHAR(200) NOT NULL,
- `parameters` JSON NOT NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
- `updated_at` TIMESTAMP(0) NULL,
-
- UNIQUE INDEX `segment_segment_id_key`(`segment_id`),
- INDEX `segment_website_id_idx`(`website_id`),
- PRIMARY KEY (`segment_id`)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
diff --git a/db/mysql/migrations/12_update_report_parameter/migration.sql b/db/mysql/migrations/12_update_report_parameter/migration.sql
deleted file mode 100644
index f6a99c3f8..000000000
--- a/db/mysql/migrations/12_update_report_parameter/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE `report` MODIFY `parameters` JSON NOT NULL;
diff --git a/db/mysql/migrations/13_add_revenue/migration.sql b/db/mysql/migrations/13_add_revenue/migration.sql
deleted file mode 100644
index 96115a33a..000000000
--- a/db/mysql/migrations/13_add_revenue/migration.sql
+++ /dev/null
@@ -1,18 +0,0 @@
--- CreateTable
-CREATE TABLE `revenue` (
- `revenue_id` VARCHAR(36) NOT NULL,
- `website_id` VARCHAR(36) NOT NULL,
- `session_id` VARCHAR(36) NOT NULL,
- `event_id` VARCHAR(36) NOT NULL,
- `event_name` VARCHAR(50) NOT NULL,
- `currency` VARCHAR(100) NOT NULL,
- `revenue` DECIMAL(19, 4) NULL,
- `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
-
- UNIQUE INDEX `revenue_revenue_id_key`(`revenue_id`),
- INDEX `revenue_website_id_idx`(`website_id`),
- INDEX `revenue_session_id_idx`(`session_id`),
- INDEX `revenue_website_id_created_at_idx`(`website_id`, `created_at`),
- INDEX `revenue_website_id_session_id_created_at_idx`(`website_id`, `session_id`, `created_at`),
- PRIMARY KEY (`revenue_id`)
-) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
diff --git a/db/mysql/migrations/migration_lock.toml b/db/mysql/migrations/migration_lock.toml
deleted file mode 100644
index 592fc0b32..000000000
--- a/db/mysql/migrations/migration_lock.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Please do not edit this file manually
-# It should be added in your version-control system (e.g., Git)
-provider = "mysql"
diff --git a/db/mysql/schema.prisma b/db/mysql/schema.prisma
deleted file mode 100644
index 67bd24d22..000000000
--- a/db/mysql/schema.prisma
+++ /dev/null
@@ -1,271 +0,0 @@
-generator client {
- provider = "prisma-client-js"
-}
-
-datasource db {
- provider = "mysql"
- url = env("DATABASE_URL")
- relationMode = "prisma"
-}
-
-model User {
- id String @id @unique @map("user_id") @db.VarChar(36)
- username String @unique @db.VarChar(255)
- password String @db.VarChar(60)
- role String @map("role") @db.VarChar(50)
- logoUrl String? @map("logo_url") @db.VarChar(2183)
- displayName String? @map("display_name") @db.VarChar(255)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
- deletedAt DateTime? @map("deleted_at") @db.Timestamp(0)
-
- websiteUser Website[] @relation("user")
- websiteCreateUser Website[] @relation("createUser")
- teamUser TeamUser[]
- report Report[]
-
- @@map("user")
-}
-
-model Session {
- id String @id @unique @map("session_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- browser String? @db.VarChar(20)
- os String? @db.VarChar(20)
- device String? @db.VarChar(20)
- screen String? @db.VarChar(11)
- language String? @db.VarChar(35)
- country String? @db.Char(2)
- region String? @db.Char(20)
- city String? @db.VarChar(50)
- distinctId String? @map("distinct_id") @db.VarChar(50)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
-
- websiteEvent WebsiteEvent[]
- sessionData SessionData[]
- revenue Revenue[]
-
- @@index([createdAt])
- @@index([websiteId])
- @@index([websiteId, createdAt])
- @@index([websiteId, createdAt, browser])
- @@index([websiteId, createdAt, os])
- @@index([websiteId, createdAt, device])
- @@index([websiteId, createdAt, screen])
- @@index([websiteId, createdAt, language])
- @@index([websiteId, createdAt, country])
- @@index([websiteId, createdAt, region])
- @@index([websiteId, createdAt, city])
- @@map("session")
-}
-
-model Website {
- id String @id @unique @map("website_id") @db.VarChar(36)
- name String @db.VarChar(100)
- domain String? @db.VarChar(500)
- shareId String? @unique @map("share_id") @db.VarChar(50)
- resetAt DateTime? @map("reset_at") @db.Timestamp(0)
- userId String? @map("user_id") @db.VarChar(36)
- teamId String? @map("team_id") @db.VarChar(36)
- createdBy String? @map("created_by") @db.VarChar(36)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
- deletedAt DateTime? @map("deleted_at") @db.Timestamp(0)
-
- user User? @relation("user", fields: [userId], references: [id])
- createUser User? @relation("createUser", fields: [createdBy], references: [id])
- team Team? @relation(fields: [teamId], references: [id])
- eventData EventData[]
- report Report[]
- revenue Revenue[]
- sessionData SessionData[]
- segment Segment[]
-
- @@index([userId])
- @@index([teamId])
- @@index([createdAt])
- @@index([shareId])
- @@index([createdBy])
- @@map("website")
-}
-
-model WebsiteEvent {
- id String @id() @map("event_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- sessionId String @map("session_id") @db.VarChar(36)
- visitId String @map("visit_id") @db.VarChar(36)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- urlPath String @map("url_path") @db.VarChar(500)
- urlQuery String? @map("url_query") @db.VarChar(500)
- utmSource String? @map("utm_source") @db.VarChar(255)
- utmMedium String? @map("utm_medium") @db.VarChar(255)
- utmCampaign String? @map("utm_campaign") @db.VarChar(255)
- utmContent String? @map("utm_content") @db.VarChar(255)
- utmTerm String? @map("utm_term") @db.VarChar(255)
- referrerPath String? @map("referrer_path") @db.VarChar(500)
- referrerQuery String? @map("referrer_query") @db.VarChar(500)
- referrerDomain String? @map("referrer_domain") @db.VarChar(500)
- pageTitle String? @map("page_title") @db.VarChar(500)
- gclid String? @map("gclid") @db.VarChar(255)
- fbclid String? @map("fbclid") @db.VarChar(255)
- msclkid String? @map("msclkid") @db.VarChar(255)
- ttclid String? @map("ttclid") @db.VarChar(255)
- lifatid String? @map("li_fat_id") @db.VarChar(255)
- twclid String? @map("twclid") @db.VarChar(255)
- eventType Int @default(1) @map("event_type") @db.UnsignedInt
- eventName String? @map("event_name") @db.VarChar(50)
- tag String? @db.VarChar(50)
- hostname String? @db.VarChar(100)
-
- eventData EventData[]
- session Session @relation(fields: [sessionId], references: [id])
-
- @@index([createdAt])
- @@index([sessionId])
- @@index([visitId])
- @@index([websiteId])
- @@index([websiteId, createdAt])
- @@index([websiteId, createdAt, urlPath])
- @@index([websiteId, createdAt, urlQuery])
- @@index([websiteId, createdAt, referrerDomain])
- @@index([websiteId, createdAt, pageTitle])
- @@index([websiteId, createdAt, eventName])
- @@index([websiteId, createdAt, tag])
- @@index([websiteId, sessionId, createdAt])
- @@index([websiteId, visitId, createdAt])
- @@index([websiteId, createdAt, hostname])
- @@map("website_event")
-}
-
-model EventData {
- id String @id() @map("event_data_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- websiteEventId String @map("website_event_id") @db.VarChar(36)
- dataKey String @map("data_key") @db.VarChar(500)
- stringValue String? @map("string_value") @db.VarChar(500)
- numberValue Decimal? @map("number_value") @db.Decimal(19, 4)
- dateValue DateTime? @map("date_value") @db.Timestamp(0)
- dataType Int @map("data_type") @db.UnsignedInt
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
-
- website Website @relation(fields: [websiteId], references: [id])
- websiteEvent WebsiteEvent @relation(fields: [websiteEventId], references: [id])
-
- @@index([createdAt])
- @@index([websiteId])
- @@index([websiteEventId])
- @@index([websiteId, createdAt])
- @@index([websiteId, createdAt, dataKey])
- @@map("event_data")
-}
-
-model SessionData {
- id String @id() @map("session_data_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- sessionId String @map("session_id") @db.VarChar(36)
- dataKey String @map("data_key") @db.VarChar(500)
- stringValue String? @map("string_value") @db.VarChar(500)
- numberValue Decimal? @map("number_value") @db.Decimal(19, 4)
- dateValue DateTime? @map("date_value") @db.Timestamp(0)
- dataType Int @map("data_type") @db.UnsignedInt
- distinctId String? @map("distinct_id") @db.VarChar(50)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
-
- website Website @relation(fields: [websiteId], references: [id])
- session Session @relation(fields: [sessionId], references: [id])
-
- @@index([createdAt])
- @@index([websiteId])
- @@index([sessionId])
- @@index([sessionId, createdAt])
- @@index([websiteId, createdAt, dataKey])
- @@map("session_data")
-}
-
-model Team {
- id String @id() @unique() @map("team_id") @db.VarChar(36)
- name String @db.VarChar(50)
- accessCode String? @unique @map("access_code") @db.VarChar(50)
- logoUrl String? @map("logo_url") @db.VarChar(2183)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
- deletedAt DateTime? @map("deleted_at") @db.Timestamp(0)
-
- website Website[]
- teamUser TeamUser[]
-
- @@index([accessCode])
- @@map("team")
-}
-
-model TeamUser {
- id String @id() @unique() @map("team_user_id") @db.VarChar(36)
- teamId String @map("team_id") @db.VarChar(36)
- userId String @map("user_id") @db.VarChar(36)
- role String @map("role") @db.VarChar(50)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
-
- team Team @relation(fields: [teamId], references: [id])
- user User @relation(fields: [userId], references: [id])
-
- @@index([teamId])
- @@index([userId])
- @@map("team_user")
-}
-
-model Report {
- id String @id() @unique() @map("report_id") @db.VarChar(36)
- userId String @map("user_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- type String @db.VarChar(200)
- name String @db.VarChar(200)
- description String @db.VarChar(500)
- parameters Json
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
-
- user User @relation(fields: [userId], references: [id])
- website Website @relation(fields: [websiteId], references: [id])
-
- @@index([userId])
- @@index([websiteId])
- @@index([type])
- @@index([name])
- @@map("report")
-}
-
-model Segment {
- id String @id() @unique() @map("segment_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- type String @db.VarChar(200)
- name String @db.VarChar(200)
- parameters Json
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0)
-
- website Website @relation(fields: [websiteId], references: [id])
-
- @@index([websiteId])
- @@map("segment")
-}
-
-model Revenue {
- id String @id() @unique() @map("revenue_id") @db.VarChar(36)
- websiteId String @map("website_id") @db.VarChar(36)
- sessionId String @map("session_id") @db.VarChar(36)
- eventId String @map("event_id") @db.VarChar(36)
- eventName String @map("event_name") @db.VarChar(50)
- currency String @db.VarChar(100)
- revenue Decimal? @db.Decimal(19, 4)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0)
-
- website Website @relation(fields: [websiteId], references: [id])
- session Session @relation(fields: [sessionId], references: [id])
-
- @@index([websiteId])
- @@index([sessionId])
- @@index([websiteId, createdAt])
- @@index([websiteId, sessionId, createdAt])
- @@map("revenue")
-}
\ No newline at end of file
diff --git a/scripts/data-migrations/convert-utm-clid-columns.sql b/db/postgresql/data-migrations/convert-utm-clid-columns.sql
similarity index 100%
rename from scripts/data-migrations/convert-utm-clid-columns.sql
rename to db/postgresql/data-migrations/convert-utm-clid-columns.sql
diff --git a/scripts/data-migrations/populate-revenue-table.sql b/db/postgresql/data-migrations/populate-revenue-table.sql
similarity index 100%
rename from scripts/data-migrations/populate-revenue-table.sql
rename to db/postgresql/data-migrations/populate-revenue-table.sql
diff --git a/docker-compose.yml b/docker-compose.yml
index 7b51db66c..348c294ca 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,12 +1,11 @@
---
services:
umami:
- image: ghcr.io/umami-software/umami:postgresql-latest
+ image: ghcr.io/umami-software/umami:latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
- DATABASE_TYPE: postgresql
APP_SECRET: replace-me-with-a-random-string
depends_on:
db:
diff --git a/docker/middleware.ts b/docker/middleware.ts
new file mode 100644
index 000000000..15111884d
--- /dev/null
+++ b/docker/middleware.ts
@@ -0,0 +1,80 @@
+import { type NextRequest, NextResponse } from 'next/server';
+import { matchesConfiguredPath } from '@/lib/match-configured-path';
+
+export const config = {
+ matcher: '/:path*',
+};
+
+const TRACKER_PATH = '/script.js';
+const COLLECT_PATH = '/api/send';
+const LOGIN_PATH = '/login';
+const BASE_PATH = process.env.BASE_PATH || '';
+
+const apiHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers': '*',
+ 'Access-Control-Allow-Methods': 'GET, DELETE, POST, PUT',
+ 'Access-Control-Max-Age': process.env.CORS_MAX_AGE || '86400',
+ 'Cache-Control': 'no-cache',
+};
+
+const trackerHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Cache-Control': 'public, max-age=86400, must-revalidate',
+};
+
+function customCollectEndpoint(request: NextRequest) {
+ const collectEndpoint = process.env.COLLECT_API_ENDPOINT;
+
+ if (collectEndpoint) {
+ const url = request.nextUrl.clone();
+
+ if (matchesConfiguredPath(url.pathname, collectEndpoint, BASE_PATH)) {
+ url.pathname = COLLECT_PATH;
+ return NextResponse.rewrite(url, { headers: apiHeaders });
+ }
+ }
+}
+
+function customScriptName(request: NextRequest) {
+ const scriptName = process.env.TRACKER_SCRIPT_NAME;
+
+ if (scriptName) {
+ const url = request.nextUrl.clone();
+ const names = scriptName.split(',').map(name => name.trim().replace(/^\/+/, ''));
+
+ if (names.find(name => matchesConfiguredPath(url.pathname, name, BASE_PATH))) {
+ url.pathname = TRACKER_PATH;
+ return NextResponse.rewrite(url, { headers: trackerHeaders });
+ }
+ }
+}
+
+function customScriptUrl(request: NextRequest) {
+ const scriptUrl = process.env.TRACKER_SCRIPT_URL;
+
+ if (scriptUrl && matchesConfiguredPath(request.nextUrl.pathname, TRACKER_PATH, BASE_PATH)) {
+ return NextResponse.rewrite(scriptUrl, { headers: trackerHeaders });
+ }
+}
+
+function disableLogin(request: NextRequest) {
+ const loginDisabled = process.env.DISABLE_LOGIN;
+
+ if (loginDisabled && matchesConfiguredPath(request.nextUrl.pathname, LOGIN_PATH, BASE_PATH)) {
+ return new NextResponse('Access denied', { status: 403 });
+ }
+}
+
+export default function middleware(req: NextRequest) {
+ const fns = [customCollectEndpoint, customScriptName, customScriptUrl, disableLogin];
+
+ for (const fn of fns) {
+ const res = fn(req);
+ if (res) {
+ return res;
+ }
+ }
+
+ return NextResponse.next();
+}
diff --git a/lang-ignore.json b/lang-ignore.json
deleted file mode 100644
index e278a52ea..000000000
--- a/lang-ignore.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "cs-CZ": ["label.reset", "metrics.device.tablet"],
- "de-CH": [
- "label.admin",
- "label.analytics",
- "label.desktop",
- "label.details",
- "label.domain",
- "label.laptop",
- "label.tablet",
- "label.name",
- "label.sessions",
- "label.team",
- "label.team-id",
- "label.teams"
- ],
- "de-DE": [
- "label.admin",
- "label.analytics",
- "label.desktop",
- "label.details",
- "label.domain",
- "label.laptop",
- "label.tablet",
- "label.name",
- "label.sessions",
- "label.team",
- "label.team-id",
- "label.teams"
- ],
- "en-GB": "*",
- "fr-FR": ["metrics.actions", "metrics.pages"],
- "lt-LT": [
- "metrics.device.desktop",
- "metrics.device.laptop",
- "metrics.referrers",
- "message.powered-by"
- ],
- "mn-MN": ["label.max", "label.min", "label.os", "label.query", "label.url", "label.urls"],
- "nb-NO": ["label.administrator", "label.dashboard"],
- "nl-NL": [
- "label.analytics",
- "label.browsers",
- "label.laptop",
- "label.tablet",
- "label.team",
- "label.team-id",
- "label.teams",
- "label.website-id",
- "label.websites"
- ],
- "it-IT": [
- "label.password",
- "label.reset",
- "message.powered-by",
- "metrics.device.desktop",
- "metrics.device.tablet",
- "metrics.filter.raw"
- ],
- "pt-PT": ["label.websites", "metrics.device.desktop", "metrics.device.tablet"]
-}
diff --git a/next-env.d.ts b/next-env.d.ts
deleted file mode 100644
index 1b3be0840..000000000
--- a/next-env.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-///
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.mjs b/next.config.ts
similarity index 58%
rename from next.config.mjs
rename to next.config.ts
index 7f4020084..ab7fbf484 100644
--- a/next.config.mjs
+++ b/next.config.ts
@@ -1,30 +1,35 @@
import 'dotenv/config';
-import { createRequire } from 'module';
+import createNextIntlPlugin from 'next-intl/plugin';
+import pkg from './package.json' with { type: 'json' };
-const require = createRequire(import.meta.url);
-const pkg = require('./package.json');
+const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts');
const TRACKER_SCRIPT = '/script.js';
-const basePath = process.env.BASE_PATH;
-const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT;
-const cloudMode = process.env.CLOUD_MODE;
-const cloudUrl = process.env.CLOUD_URL;
-const corsMaxAge = process.env.CORS_MAX_AGE;
-const defaultLocale = process.env.DEFAULT_LOCALE;
-const forceSSL = process.env.FORCE_SSL;
-const frameAncestors = process.env.ALLOWED_FRAME_URLS ?? '';
-const trackerScriptName = process.env.TRACKER_SCRIPT_NAME;
-const trackerScriptURL = process.env.TRACKER_SCRIPT_URL;
+const isProd = process.env.NODE_ENV === 'production';
-const contentSecurityPolicy = [
- `default-src 'self'`,
- `img-src * data:`,
- `script-src 'self' 'unsafe-eval' 'unsafe-inline'`,
- `style-src 'self' 'unsafe-inline'`,
- `connect-src 'self' api.umami.is cloud.umami.is`,
- `frame-ancestors 'self' ${frameAncestors}`,
-];
+const basePath = process.env.BASE_PATH || '';
+const cloudMode = process.env.CLOUD_MODE || '';
+const cloudUrl = process.env.CLOUD_URL || '';
+const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT || '';
+const corsMaxAge = process.env.CORS_MAX_AGE || '';
+const defaultCurrency = process.env.DEFAULT_CURRENCY || '';
+const defaultLocale = process.env.DEFAULT_LOCALE || '';
+const forceSSL = process.env.FORCE_SSL || '';
+const frameAncestors = process.env.ALLOWED_FRAME_URLS || '';
+const trackerScriptName = process.env.TRACKER_SCRIPT_NAME || '';
+const trackerScriptURL = process.env.TRACKER_SCRIPT_URL || '';
+const selfTrack = process.env.UMAMI_SELF_TRACK || '';
+const selfRecord = process.env.UMAMI_SELF_RECORD || '';
+
+const contentSecurityPolicy = `
+ default-src 'self';
+ img-src 'self' https: data:;
+ script-src 'self' 'unsafe-eval' 'unsafe-inline';
+ style-src 'self' 'unsafe-inline';
+ connect-src 'self' https:;
+ frame-ancestors 'self' ${frameAncestors};
+`;
const defaultHeaders = [
{
@@ -33,10 +38,7 @@ const defaultHeaders = [
},
{
key: 'Content-Security-Policy',
- value: contentSecurityPolicy
- .join(';')
- .replace(/\s{2,}/g, ' ')
- .trim(),
+ value: contentSecurityPolicy.replace(/\s{2,}/g, ' ').trim(),
},
];
@@ -90,11 +92,14 @@ const headers = [
source: '/:path*',
headers: defaultHeaders,
},
- {
+];
+
+if (isProd) {
+ headers.push({
source: TRACKER_SCRIPT,
headers: trackerHeaders,
- },
-];
+ });
+}
const rewrites = [];
@@ -118,20 +123,35 @@ if (collectApiEndpoint) {
}
const redirects = [
+ {
+ source: '/teams/:id/dashboard/edit',
+ destination: '/dashboard/edit',
+ permanent: false,
+ },
+ {
+ source: '/teams/:id/dashboard',
+ destination: '/dashboard',
+ permanent: false,
+ },
{
source: '/settings',
- destination: '/settings/websites',
- permanent: true,
+ destination: '/settings/preferences',
+ permanent: false,
},
{
source: '/teams/:id',
- destination: '/teams/:id/dashboard',
- permanent: true,
+ destination: '/teams/:id/websites',
+ permanent: false,
},
{
source: '/teams/:id/settings',
- destination: '/teams/:id/settings/team',
- permanent: true,
+ destination: '/teams/:id/settings/preferences',
+ permanent: false,
+ },
+ {
+ source: '/admin',
+ destination: '/admin/users',
+ permanent: false,
},
];
@@ -156,60 +176,32 @@ if (trackerScriptName) {
}
}
-if (cloudMode && cloudUrl) {
- redirects.push({
- source: '/settings/:path*',
- destination: `${cloudUrl}/settings/:path*`,
- permanent: false,
- });
-
- redirects.push({
- source: '/teams/:id/settings/:path*',
- destination: `${cloudUrl}/teams/:id/settings/:path*`,
- permanent: false,
- });
-
- redirects.push({
- source: '/login',
- destination: cloudUrl,
- permanent: false,
+if (isProd && cloudMode) {
+ rewrites.push({
+ source: '/script.js',
+ destination: 'https://cloud.umami.is/script.js',
});
}
/** @type {import('next').NextConfig} */
-export default {
+export default withNextIntl({
reactStrictMode: false,
env: {
basePath,
cloudMode,
cloudUrl,
currentVersion: pkg.version,
+ defaultCurrency,
defaultLocale,
+ selfTrack,
+ selfRecord,
},
basePath,
output: 'standalone',
- eslint: {
- ignoreDuringBuilds: true,
- },
typescript: {
ignoreBuildErrors: true,
},
- turbopack: {
- rules: {
- '*.svg': {
- loaders: ['@svgr/webpack'],
- as: '*.js',
- },
- },
- },
- webpack(config) {
- config.module.rules.push({
- test: /\.svg$/,
- issuer: /\.(js|ts)x?$/,
- use: ['@svgr/webpack'],
- });
- return config;
- },
+ devIndicators: false,
async headers() {
return headers;
},
@@ -221,7 +213,7 @@ export default {
destination: '/api/scripts/telemetry',
},
{
- source: '/teams/:teamId/:path((?!settings).*)*',
+ source: '/teams/:teamId/:path*',
destination: '/:path*',
},
];
@@ -229,4 +221,4 @@ export default {
async redirects() {
return [...redirects];
},
-};
+});
diff --git a/package.components.json b/package.components.json
index 2ca9458d5..ab3454c07 100644
--- a/package.components.json
+++ b/package.components.json
@@ -1,24 +1,10 @@
{
"name": "@umami/components",
- "version": "0.1.0",
+ "version": "0.130.0",
"description": "Umami React components.",
"author": "Mike Cao ",
"license": "MIT",
"type": "module",
"main": "./index.js",
- "types": "./index.d.ts",
- "peerDependencies": {
- "@tanstack/react-query": "^4.33.0",
- "classnames": "^2.3.1",
- "colord": "^2.9.2",
- "date-fns-tz": "^1.1.4",
- "immer": "^9.0.12",
- "moment-timezone": "^0.5.35",
- "next": "^13.4.0",
- "next-basics": "^0.36.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-intl": "^5.24.7",
- "zustand": "^4.3.8"
- }
+ "types": "./index.d.ts"
}
diff --git a/package.json b/package.json
index 8b7b31fed..790e961df 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "2.19.0",
+ "version": "3.1.0",
"description": "A modern, privacy-focused alternative to Google Analytics.",
"author": "Umami Software, Inc. ",
"license": "MIT",
@@ -9,177 +9,152 @@
"type": "git",
"url": "https://github.com/umami-software/umami.git"
},
+ "type": "module",
"scripts": {
- "dev": "next dev",
- "dev-turbo": "next dev -p 3000 --turbopack",
- "build": "npm-run-all check-env build-db check-db build-tracker build-geo build-app",
+ "dev": "dotenv next dev --turbo",
+ "build": "npm-run-all check-env build-db check-db build-tracker build-recorder build-geo build-app",
"start": "next start",
"build-docker": "npm-run-all build-db build-tracker build-geo build-app",
- "start-docker": "npm-run-all check-db update-tracker set-routes-manifest start-server",
+ "start-docker": "npm-run-all check-db update-tracker start-server",
"start-env": "node scripts/start-env.js",
"start-server": "node server.js",
- "build-app": "next build",
- "build-components": "rollup -c rollup.components.config.mjs",
- "build-tracker": "rollup -c rollup.tracker.config.mjs",
- "build-db": "npm-run-all copy-db-files build-db-client",
- "build-lang": "npm-run-all format-lang compile-lang download-country-names download-language-names clean-lang",
+ "build-app": "next build --turbo",
+ "build-icons": "svgr ./src/assets --out-dir src/components/svg --typescript",
+ "build-components": "node scripts/bump-components.js && tsup",
+ "build-tracker": "rollup -c rollup.tracker.config.js",
+ "build-recorder": "rollup -c rollup.recorder.config.js",
+ "build-prisma-client": "node scripts/build-prisma-client.js",
+ "build-lang": "npm-run-all download-country-names download-language-names",
"build-geo": "node scripts/build-geo.js",
+ "build-db": "npm-run-all build-db-client build-prisma-client",
"build-db-schema": "prisma db pull",
"build-db-client": "prisma generate",
- "set-routes-manifest": "node scripts/set-routes-manifest.js",
"update-tracker": "node scripts/update-tracker.js",
"update-db": "prisma migrate deploy",
"check-db": "node scripts/check-db.js",
"check-env": "node scripts/check-env.js",
+ "check-missing-messages": "node scripts/check-missing-messages.js",
"copy-db-files": "node scripts/copy-db-files.js",
- "extract-messages": "formatjs extract \"src/components/messages.ts\" --out-file build/extracted-messages.json",
- "merge-messages": "node scripts/merge-messages.js",
- "generate-lang": "npm-run-all extract-messages merge-messages",
- "format-lang": "node scripts/format-lang.js",
- "compile-lang": "formatjs compile-folder --ast build/messages public/intl/messages",
- "clean-lang": "prettier --write ./public/intl/**/*.json",
- "check-lang": "node scripts/check-lang.js",
"download-country-names": "node scripts/download-country-names.js",
"download-language-names": "node scripts/download-language-names.js",
"change-password": "node scripts/change-password.js",
- "lint": "next lint --quiet",
- "prepare": "node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky install",
"postbuild": "node scripts/postbuild.js",
"test": "jest",
"cypress-open": "cypress open cypress run",
- "cypress-run": "cypress run cypress run"
- },
- "lint-staged": {
- "**/*.{js,jsx,ts,tsx}": [
- "prettier --write",
- "eslint"
- ],
- "**/*.css": [
- "stylelint --fix",
- "prettier --write"
- ],
- "**/*.json": [
- "prettier --write"
- ]
+ "cypress-run": "cypress run cypress run",
+ "seed-data": "tsx scripts/seed-data.ts",
+ "lint": "biome lint .",
+ "format": "biome format --write .",
+ "check": "biome check --write"
},
"cacheDirectories": [
".next/cache"
],
"dependencies": {
- "@clickhouse/client": "^1.10.1",
+ "@clickhouse/client": "^1.18.2",
"@date-fns/utc": "^1.2.0",
- "@dicebear/collection": "^9.2.1",
- "@dicebear/core": "^9.2.1",
- "@fontsource/inter": "^4.5.15",
+ "@dicebear/collection": "^9.4.2",
+ "@dicebear/core": "^9.4.2",
"@hello-pangea/dnd": "^17.0.0",
- "@prisma/client": "6.7.0",
- "@prisma/extension-read-replicas": "^0.4.1",
- "@react-spring/web": "^9.7.3",
- "@tanstack/react-query": "^5.28.6",
- "@umami/redis-client": "^0.26.0",
- "bcryptjs": "^2.4.3",
- "chalk": "^4.1.1",
- "chart.js": "^4.4.9",
+ "@prisma/adapter-pg": "^7.6.0",
+ "@prisma/client": "^7.6.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",
+ "@umami/react-zen": "^0.245.0",
+ "bcryptjs": "^3.0.2",
+ "chalk": "^5.6.2",
+ "chart.js": "^4.5.1",
"chartjs-adapter-date-fns": "^3.0.0",
"classnames": "^2.3.1",
"colord": "^2.9.2",
- "cors": "^2.8.5",
+ "cors": "^2.8.6",
"cross-spawn": "^7.0.3",
"date-fns": "^2.23.0",
"date-fns-tz": "^1.1.4",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"del": "^6.0.0",
"detect-browser": "^5.2.0",
- "dotenv": "^10.0.0",
- "eslint-plugin-promise": "^6.1.1",
- "fs-extra": "^10.0.1",
- "immer": "^9.0.12",
- "ipaddr.js": "^2.0.1",
+ "dotenv": "^17.3.1",
+ "esbuild": "^0.27.4",
+ "immer": "^11.1.4",
+ "ipaddr.js": "^2.3.0",
"is-ci": "^3.0.1",
"is-docker": "^3.0.0",
- "is-localhost-ip": "^1.4.0",
- "isbot": "^5.1.16",
- "jsonwebtoken": "^9.0.2",
+ "is-localhost-ip": "^2.0.0",
+ "isbot": "^5.1.37",
+ "jsonwebtoken": "^9.0.3",
"jszip": "^3.10.1",
"kafkajs": "^2.1.0",
- "maxmind": "^4.3.24",
- "md5": "^2.3.0",
- "next": "15.4.7",
+ "lucide-react": "^1.7.0",
+ "maxmind": "^5.0.5",
+ "next": "16.2.1",
+ "next-intl": "4.8.3",
"node-fetch": "^3.2.8",
"npm-run-all": "^4.1.5",
"papaparse": "^5.5.3",
- "prisma": "6.7.0",
- "pure-rand": "^6.1.0",
- "react": "^19.0.0",
- "react-basics": "^0.126.0",
- "react-dom": "^19.0.0",
+ "pg": "^8.20.0",
+ "prisma": "^7.6.0",
+ "pure-rand": "^7.0.1",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
"react-error-boundary": "^4.0.4",
- "react-intl": "^6.5.5",
+ "react-resizable-panels": "^4.8.0",
"react-simple-maps": "^2.3.0",
"react-use-measure": "^2.0.4",
"react-window": "^1.8.6",
+ "redis": "^4.5.1",
"request-ip": "^3.3.0",
- "semver": "^7.5.4",
+ "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",
- "uuid": "^9.0.0",
- "zod": "^3.24.3",
- "zustand": "^4.5.5"
+ "ua-parser-js": "^2.0.9",
+ "uuid": "^13.0.0",
+ "zod": "^4.3.6",
+ "zustand": "^5.0.12"
},
"devDependencies": {
- "@formatjs/cli": "^4.2.29",
- "@netlify/plugin-nextjs": "^5.10.6",
+ "@biomejs/biome": "^2.4.10",
+ "@netlify/plugin-nextjs": "^5.15.9",
"@rollup/plugin-alias": "^5.0.0",
"@rollup/plugin-commonjs": "^25.0.4",
"@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",
- "@svgr/rollup": "^8.1.0",
- "@svgr/webpack": "^8.1.0",
- "@types/jest": "^29.5.14",
- "@types/node": "^22.13.4",
- "@types/react": "^19.0.8",
- "@types/react-dom": "^19.0.2",
- "@types/react-window": "^1.8.8",
- "@typescript-eslint/eslint-plugin": "^6.7.3",
- "@typescript-eslint/parser": "^6.7.3",
- "cross-env": "^7.0.3",
+ "@rollup/plugin-typescript": "^12.3.0",
+ "@types/jest": "^30.0.0",
+ "@types/node": "^24.12.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",
- "esbuild": "^0.25.0",
- "eslint": "^8.33.0",
- "eslint-config-next": "^14.0.4",
- "eslint-config-prettier": "^8.5.0",
- "eslint-import-resolver-alias": "^1.1.2",
- "eslint-plugin-css-modules": "^2.12.0",
- "eslint-plugin-cypress": "^2.15.1",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jest": "^27.9.0",
- "eslint-plugin-prettier": "^4.0.0",
- "extract-react-intl-messages": "^4.1.1",
- "husky": "^8.0.3",
+ "dotenv-cli": "^11.0.0",
"jest": "^29.7.0",
- "lint-staged": "^14.0.1",
- "postcss": "^8.4.31",
+ "postcss": "^8.5.8",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-import": "^15.1.0",
"postcss-preset-env": "7.8.3",
- "prettier": "^2.6.2",
"prompts": "2.4.2",
- "rollup": "^3.28.0",
+ "rollup": "^4.60.1",
"rollup-plugin-copy": "^3.4.0",
- "rollup-plugin-delete": "^2.0.0",
- "rollup-plugin-dts": "^5.3.1",
- "rollup-plugin-esbuild": "^5.0.0",
- "rollup-plugin-node-externals": "^6.1.1",
+ "rollup-plugin-delete": "^3.0.2",
+ "rollup-plugin-dts": "^6.4.1",
+ "rollup-plugin-node-externals": "^8.1.1",
+ "rollup-plugin-peer-deps-external": "^2.2.4",
"rollup-plugin-postcss": "^4.0.2",
- "stylelint": "^15.10.1",
- "stylelint-config-css-modules": "^4.4.0",
+ "stylelint-config-css-modules": "^4.6.0",
"stylelint-config-prettier": "^9.0.3",
- "stylelint-config-recommended": "^14.0.0",
- "tar": "^6.1.2",
- "ts-jest": "^29.1.2",
+ "tar": "^7.5.13",
+ "ts-jest": "^29.4.6",
+ "ts-morph": "^27.0.2",
"ts-node": "^10.9.1",
- "typescript": "^5.5.3"
+ "tsup": "^8.5.0",
+ "tsx": "^4.19.0",
+ "typescript": "^5.9.3"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f962ce3f2..00d2efde6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,50 +9,53 @@ importers:
.:
dependencies:
'@clickhouse/client':
- specifier: ^1.10.1
- version: 1.11.2
+ specifier: ^1.18.2
+ version: 1.18.2
'@date-fns/utc':
specifier: ^1.2.0
version: 1.2.0
'@dicebear/collection':
- specifier: ^9.2.1
- version: 9.2.3(@dicebear/core@9.2.3)
+ specifier: ^9.4.2
+ version: 9.4.2(@dicebear/core@9.4.2)
'@dicebear/core':
- specifier: ^9.2.1
- version: 9.2.3
- '@fontsource/inter':
- specifier: ^4.5.15
- version: 4.5.15
+ specifier: ^9.4.2
+ version: 9.4.2
'@hello-pangea/dnd':
specifier: ^17.0.0
- version: 17.0.0(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 17.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@prisma/adapter-pg':
+ specifier: ^7.6.0
+ version: 7.6.0
'@prisma/client':
- specifier: 6.7.0
- version: 6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3)
+ specifier: ^7.6.0
+ version: 7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)
'@prisma/extension-read-replicas':
- specifier: ^0.4.1
- version: 0.4.1(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3))
+ specifier: ^0.5.0
+ version: 0.5.0(@prisma/client@7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))
'@react-spring/web':
- specifier: ^9.7.3
- version: 9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ specifier: ^10.0.3
+ version: 10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@svgr/cli':
+ specifier: ^8.1.0
+ version: 8.1.0(typescript@5.9.3)
'@tanstack/react-query':
- specifier: ^5.28.6
- version: 5.83.0(react@19.1.0)
- '@umami/redis-client':
- specifier: ^0.26.0
- version: 0.26.0
+ specifier: ^5.96.0
+ version: 5.96.0(react@19.2.4)
+ '@umami/react-zen':
+ specifier: ^0.245.0
+ version: 0.245.0(@types/react@19.2.14)(immer@11.1.4)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4))
bcryptjs:
- specifier: ^2.4.3
- version: 2.4.3
+ specifier: ^3.0.2
+ version: 3.0.3
chalk:
- specifier: ^4.1.1
- version: 4.1.2
+ specifier: ^5.6.2
+ version: 5.6.2
chart.js:
- specifier: ^4.4.9
- version: 4.5.0
+ specifier: ^4.5.1
+ version: 4.5.1
chartjs-adapter-date-fns:
specifier: ^3.0.0
- version: 3.0.0(chart.js@4.5.0)(date-fns@2.30.0)
+ version: 3.0.0(chart.js@4.5.1)(date-fns@2.30.0)
classnames:
specifier: ^2.3.1
version: 2.5.1
@@ -60,8 +63,8 @@ importers:
specifier: ^2.9.2
version: 2.9.3
cors:
- specifier: ^2.8.5
- version: 2.8.5
+ specifier: ^2.8.6
+ version: 2.8.6
cross-spawn:
specifier: ^7.0.3
version: 7.0.6
@@ -72,8 +75,8 @@ importers:
specifier: ^1.1.4
version: 1.3.8(date-fns@2.30.0)
debug:
- specifier: ^4.3.4
- version: 4.4.1(supports-color@8.1.1)
+ specifier: ^4.4.3
+ version: 4.4.3(supports-color@8.1.1)
del:
specifier: ^6.0.0
version: 6.1.1
@@ -81,20 +84,17 @@ importers:
specifier: ^5.2.0
version: 5.3.0
dotenv:
- specifier: ^10.0.0
- version: 10.0.0
- eslint-plugin-promise:
- specifier: ^6.1.1
- version: 6.6.0(eslint@8.57.1)
- fs-extra:
- specifier: ^10.0.1
- version: 10.1.0
+ specifier: ^17.3.1
+ version: 17.3.1
+ esbuild:
+ specifier: ^0.27.4
+ version: 0.27.4
immer:
- specifier: ^9.0.12
- version: 9.0.21
+ specifier: ^11.1.4
+ version: 11.1.4
ipaddr.js:
- specifier: ^2.0.1
- version: 2.2.0
+ specifier: ^2.3.0
+ version: 2.3.0
is-ci:
specifier: ^3.0.1
version: 3.0.1
@@ -102,29 +102,32 @@ importers:
specifier: ^3.0.0
version: 3.0.0
is-localhost-ip:
- specifier: ^1.4.0
- version: 1.4.0
+ specifier: ^2.0.0
+ version: 2.0.0
isbot:
- specifier: ^5.1.16
- version: 5.1.28
+ specifier: ^5.1.37
+ version: 5.1.37
jsonwebtoken:
- specifier: ^9.0.2
- version: 9.0.2
+ specifier: ^9.0.3
+ version: 9.0.3
jszip:
specifier: ^3.10.1
version: 3.10.1
kafkajs:
specifier: ^2.1.0
version: 2.2.4
+ lucide-react:
+ specifier: ^1.7.0
+ version: 1.7.0(react@19.2.4)
maxmind:
- specifier: ^4.3.24
- version: 4.3.28
- md5:
- specifier: ^2.3.0
- version: 2.3.0
+ specifier: ^5.0.5
+ version: 5.0.5
next:
- specifier: 15.4.7
- version: 15.4.7(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ specifier: 16.2.1
+ version: 16.2.1(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ next-intl:
+ specifier: 4.8.3
+ version: 4.8.3(@swc/helpers@0.5.20)(next@16.2.1(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
node-fetch:
specifier: ^3.2.8
version: 3.3.2
@@ -134,42 +137,217 @@ importers:
papaparse:
specifier: ^5.5.3
version: 5.5.3
+ pg:
+ specifier: ^8.20.0
+ version: 8.20.0
prisma:
- specifier: 6.7.0
- version: 6.7.0(typescript@5.8.3)
+ specifier: ^7.6.0
+ version: 7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
pure-rand:
- specifier: ^6.1.0
- version: 6.1.0
+ specifier: ^7.0.1
+ version: 7.0.1
react:
- specifier: ^19.0.0
- version: 19.1.0
- react-basics:
- specifier: ^0.126.0
- version: 0.126.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ specifier: ^19.2.4
+ version: 19.2.4
react-dom:
- specifier: ^19.0.0
- version: 19.1.0(react@19.1.0)
+ specifier: ^19.2.4
+ version: 19.2.4(react@19.2.4)
react-error-boundary:
specifier: ^4.0.4
- version: 4.1.2(react@19.1.0)
- react-intl:
- specifier: ^6.5.5
- version: 6.8.9(react@19.1.0)(typescript@5.8.3)
+ version: 4.1.2(react@19.2.4)
+ react-resizable-panels:
+ specifier: ^4.8.0
+ version: 4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react-simple-maps:
specifier: ^2.3.0
- version: 2.3.0(prop-types@15.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react-use-measure:
specifier: ^2.0.4
- version: 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react-window:
specifier: ^1.8.6
- version: 1.8.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 1.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ redis:
+ specifier: ^4.5.1
+ version: 4.7.1
request-ip:
specifier: ^3.3.0
version: 3.3.0
+ rrweb:
+ specifier: 2.0.0-alpha.4
+ version: 2.0.0-alpha.4
+ rrweb-player:
+ specifier: 1.0.0-alpha.4
+ version: 1.0.0-alpha.4
semver:
- specifier: ^7.5.4
- version: 7.7.2
+ specifier: ^7.7.4
+ version: 7.7.4
+ serialize-error:
+ specifier: ^12.0.0
+ version: 12.0.0
+ thenby:
+ specifier: ^1.3.4
+ version: 1.3.4
+ ua-parser-js:
+ specifier: ^2.0.9
+ version: 2.0.9
+ uuid:
+ specifier: ^13.0.0
+ version: 13.0.0
+ zod:
+ specifier: ^4.3.6
+ version: 4.3.6
+ zustand:
+ specifier: ^5.0.12
+ version: 5.0.12(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
+ devDependencies:
+ '@biomejs/biome':
+ specifier: ^2.4.10
+ version: 2.4.10
+ '@netlify/plugin-nextjs':
+ specifier: ^5.15.9
+ version: 5.15.9
+ '@rollup/plugin-alias':
+ specifier: ^5.0.0
+ version: 5.1.1(rollup@4.60.1)
+ '@rollup/plugin-commonjs':
+ specifier: ^25.0.4
+ version: 25.0.8(rollup@4.60.1)
+ '@rollup/plugin-json':
+ specifier: ^6.0.0
+ version: 6.1.0(rollup@4.60.1)
+ '@rollup/plugin-node-resolve':
+ specifier: ^15.2.0
+ version: 15.3.1(rollup@4.60.1)
+ '@rollup/plugin-replace':
+ specifier: ^5.0.2
+ version: 5.0.7(rollup@4.60.1)
+ '@rollup/plugin-terser':
+ specifier: ^0.4.4
+ version: 0.4.4(rollup@4.60.1)
+ '@rollup/plugin-typescript':
+ specifier: ^12.3.0
+ version: 12.3.0(rollup@4.60.1)(tslib@2.8.1)(typescript@5.9.3)
+ '@types/jest':
+ specifier: ^30.0.0
+ version: 30.0.0
+ '@types/node':
+ specifier: ^24.12.0
+ version: 24.12.0
+ '@types/react':
+ specifier: ^19.2.14
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.2
+ version: 19.2.3(@types/react@19.2.14)
+ babel-plugin-react-compiler:
+ specifier: 19.1.0-rc.2
+ version: 19.1.0-rc.2
+ cross-env:
+ specifier: ^10.1.0
+ version: 10.1.0
+ cypress:
+ specifier: ^13.6.6
+ version: 13.17.0
+ dotenv-cli:
+ specifier: ^11.0.0
+ version: 11.0.0
+ jest:
+ specifier: ^29.7.0
+ version: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
+ postcss:
+ specifier: ^8.5.8
+ version: 8.5.8
+ postcss-flexbugs-fixes:
+ specifier: ^5.0.2
+ version: 5.0.2(postcss@8.5.8)
+ postcss-import:
+ specifier: ^15.1.0
+ version: 15.1.0(postcss@8.5.8)
+ postcss-preset-env:
+ specifier: 7.8.3
+ version: 7.8.3(postcss@8.5.8)
+ prompts:
+ specifier: 2.4.2
+ version: 2.4.2
+ rollup:
+ specifier: ^4.60.1
+ version: 4.60.1
+ rollup-plugin-copy:
+ specifier: ^3.4.0
+ version: 3.5.0
+ rollup-plugin-delete:
+ specifier: ^3.0.2
+ version: 3.0.2(rollup@4.60.1)
+ rollup-plugin-dts:
+ specifier: ^6.4.1
+ version: 6.4.1(rollup@4.60.1)(typescript@5.9.3)
+ rollup-plugin-node-externals:
+ specifier: ^8.1.1
+ version: 8.1.2(rollup@4.60.1)
+ rollup-plugin-peer-deps-external:
+ specifier: ^2.2.4
+ version: 2.2.4(rollup@4.60.1)
+ rollup-plugin-postcss:
+ specifier: ^4.0.2
+ version: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
+ stylelint-config-css-modules:
+ specifier: ^4.6.0
+ version: 4.6.0
+ stylelint-config-prettier:
+ specifier: ^9.0.3
+ version: 9.0.5
+ tar:
+ specifier: ^7.5.13
+ version: 7.5.13
+ ts-jest:
+ specifier: ^29.4.6
+ version: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.27.4)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)))(typescript@5.9.3)
+ ts-morph:
+ specifier: ^27.0.2
+ version: 27.0.2
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)
+ tsup:
+ specifier: ^8.5.0
+ version: 8.5.1(@swc/core@1.15.11(@swc/helpers@0.5.20))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1)
+ tsx:
+ specifier: ^4.19.0
+ version: 4.21.0
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+
+ dist:
+ dependencies:
+ chart.js:
+ specifier: ^4.5.0
+ version: 4.5.1
+ chartjs-adapter-date-fns:
+ specifier: ^3.0.0
+ version: 3.0.0(chart.js@4.5.1)(date-fns@2.30.0)
+ colord:
+ specifier: ^2.9.2
+ version: 2.9.3
+ jsonwebtoken:
+ specifier: ^9.0.2
+ version: 9.0.3
+ lucide-react:
+ specifier: ^0.542.0
+ version: 0.542.0(react@19.2.4)
+ pure-rand:
+ specifier: ^7.0.1
+ version: 7.0.1
+ react-simple-maps:
+ specifier: ^2.3.0
+ version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react-use-measure:
+ specifier: ^2.0.4
+ version: 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react-window:
+ specifier: ^1.8.6
+ version: 1.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
serialize-error:
specifier: ^12.0.0
version: 12.0.0
@@ -177,177 +355,8 @@ importers:
specifier: ^1.3.4
version: 1.3.4
uuid:
- specifier: ^9.0.0
- version: 9.0.1
- zod:
- specifier: ^3.24.3
- version: 3.25.76
- zustand:
- specifier: ^4.5.5
- version: 4.5.7(@types/react@19.1.8)(immer@9.0.21)(react@19.1.0)
- devDependencies:
- '@formatjs/cli':
- specifier: ^4.2.29
- version: 4.8.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))
- '@netlify/plugin-nextjs':
- specifier: ^5.10.6
- version: 5.11.6
- '@rollup/plugin-alias':
- specifier: ^5.0.0
- version: 5.1.1(rollup@3.29.5)
- '@rollup/plugin-commonjs':
- specifier: ^25.0.4
- version: 25.0.8(rollup@3.29.5)
- '@rollup/plugin-json':
- specifier: ^6.0.0
- version: 6.1.0(rollup@3.29.5)
- '@rollup/plugin-node-resolve':
- specifier: ^15.2.0
- version: 15.3.1(rollup@3.29.5)
- '@rollup/plugin-replace':
- specifier: ^5.0.2
- version: 5.0.7(rollup@3.29.5)
- '@rollup/plugin-terser':
- specifier: ^0.4.4
- version: 0.4.4(rollup@3.29.5)
- '@svgr/rollup':
- specifier: ^8.1.0
- version: 8.1.0(rollup@3.29.5)(typescript@5.8.3)
- '@svgr/webpack':
- specifier: ^8.1.0
- version: 8.1.0(typescript@5.8.3)
- '@types/jest':
- specifier: ^29.5.14
- version: 29.5.14
- '@types/node':
- specifier: ^22.13.4
- version: 22.16.5
- '@types/react':
- specifier: ^19.0.8
- version: 19.1.8
- '@types/react-dom':
- specifier: ^19.0.2
- version: 19.1.6(@types/react@19.1.8)
- '@types/react-window':
- specifier: ^1.8.8
- version: 1.8.8
- '@typescript-eslint/eslint-plugin':
- specifier: ^6.7.3
- version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)
- '@typescript-eslint/parser':
- specifier: ^6.7.3
- version: 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- cross-env:
- specifier: ^7.0.3
- version: 7.0.3
- cypress:
- specifier: ^13.6.6
- version: 13.17.0
- esbuild:
- specifier: ^0.25.0
- version: 0.25.8
- eslint:
- specifier: ^8.33.0
- version: 8.57.1
- eslint-config-next:
- specifier: ^14.0.4
- version: 14.2.30(eslint@8.57.1)(typescript@5.8.3)
- eslint-config-prettier:
- specifier: ^8.5.0
- version: 8.10.2(eslint@8.57.1)
- eslint-import-resolver-alias:
- specifier: ^1.1.2
- version: 1.1.2(eslint-plugin-import@2.32.0)
- eslint-plugin-css-modules:
- specifier: ^2.12.0
- version: 2.12.0(eslint@8.57.1)
- eslint-plugin-cypress:
- specifier: ^2.15.1
- version: 2.15.2(eslint@8.57.1)
- eslint-plugin-import:
- specifier: ^2.29.1
- version: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
- eslint-plugin-jest:
- specifier: ^27.9.0
- version: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)
- eslint-plugin-prettier:
- specifier: ^4.0.0
- version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8)
- extract-react-intl-messages:
- specifier: ^4.1.1
- version: 4.1.1(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))
- husky:
- specifier: ^8.0.3
- version: 8.0.3
- jest:
- specifier: ^29.7.0
- version: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
- lint-staged:
- specifier: ^14.0.1
- version: 14.0.1(enquirer@2.4.1)
- postcss:
- specifier: ^8.4.31
- version: 8.5.6
- postcss-flexbugs-fixes:
- specifier: ^5.0.2
- version: 5.0.2(postcss@8.5.6)
- postcss-import:
- specifier: ^15.1.0
- version: 15.1.0(postcss@8.5.6)
- postcss-preset-env:
- specifier: 7.8.3
- version: 7.8.3(postcss@8.5.6)
- prettier:
- specifier: ^2.6.2
- version: 2.8.8
- prompts:
- specifier: 2.4.2
- version: 2.4.2
- rollup:
- specifier: ^3.28.0
- version: 3.29.5
- rollup-plugin-copy:
- specifier: ^3.4.0
- version: 3.5.0
- rollup-plugin-delete:
- specifier: ^2.0.0
- version: 2.2.0(rollup@3.29.5)
- rollup-plugin-dts:
- specifier: ^5.3.1
- version: 5.3.1(rollup@3.29.5)(typescript@5.8.3)
- rollup-plugin-esbuild:
- specifier: ^5.0.0
- version: 5.0.0(esbuild@0.25.8)(rollup@3.29.5)
- rollup-plugin-node-externals:
- specifier: ^6.1.1
- version: 6.1.2(rollup@3.29.5)
- rollup-plugin-postcss:
- specifier: ^4.0.2
- version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
- stylelint:
- specifier: ^15.10.1
- version: 15.11.0(typescript@5.8.3)
- stylelint-config-css-modules:
- specifier: ^4.4.0
- version: 4.5.1(stylelint@15.11.0(typescript@5.8.3))
- stylelint-config-prettier:
- specifier: ^9.0.3
- version: 9.0.5(stylelint@15.11.0(typescript@5.8.3))
- stylelint-config-recommended:
- specifier: ^14.0.0
- version: 14.0.1(stylelint@15.11.0(typescript@5.8.3))
- tar:
- specifier: ^6.1.2
- version: 6.2.1
- ts-jest:
- specifier: ^29.1.2
- version: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)
- ts-node:
- specifier: ^10.9.1
- version: 10.9.2(@types/node@22.16.5)(typescript@5.8.3)
- typescript:
- specifier: ^5.5.3
- version: 5.8.3
+ specifier: ^11.1.0
+ version: 11.1.0
packages:
@@ -359,85 +368,44 @@ packages:
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/compat-data@7.28.0':
resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.28.0':
- resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==}
+ '@babel/core@7.28.3':
+ resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.28.0':
- resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-annotate-as-pure@7.27.3':
- resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ '@babel/generator@7.28.3':
+ resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
'@babel/helper-compilation-targets@7.27.2':
resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-create-class-features-plugin@7.27.1':
- resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-create-regexp-features-plugin@7.27.1':
- resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-define-polyfill-provider@0.6.5':
- resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-
'@babel/helper-globals@7.28.0':
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-member-expression-to-functions@7.27.1':
- resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-module-imports@7.27.1':
resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.27.3':
- resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==}
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-optimise-call-expression@7.27.1':
- resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-plugin-utils@7.27.1':
resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-remap-async-to-generator@7.27.1':
- resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-replace-supers@7.27.1':
- resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
- resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
@@ -446,59 +414,23 @@ packages:
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.27.1':
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-wrap-function@7.27.1':
- resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==}
+ '@babel/helpers@7.28.3':
+ resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.27.6':
- resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.28.0':
- resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==}
+ '@babel/parser@7.28.3':
+ resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1':
- resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1':
- resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1':
- resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1':
- resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.13.0
-
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1':
- resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
- resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-async-generators@7.8.4':
resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
peerDependencies:
@@ -520,12 +452,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-assertions@7.27.1':
- resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-import-attributes@7.27.1':
resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
engines: {node: '>=6.9.0'}
@@ -596,401 +522,89 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
- resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-transform-arrow-functions@7.27.1':
- resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-async-generator-functions@7.28.0':
- resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-async-to-generator@7.27.1':
- resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-block-scoped-functions@7.27.1':
- resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-block-scoping@7.28.0':
- resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-class-properties@7.27.1':
- resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-class-static-block@7.27.1':
- resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.12.0
-
- '@babel/plugin-transform-classes@7.28.0':
- resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-computed-properties@7.27.1':
- resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-destructuring@7.28.0':
- resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-dotall-regex@7.27.1':
- resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-duplicate-keys@7.27.1':
- resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1':
- resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-transform-dynamic-import@7.27.1':
- resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-explicit-resource-management@7.28.0':
- resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-exponentiation-operator@7.27.1':
- resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-export-namespace-from@7.27.1':
- resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-for-of@7.27.1':
- resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-function-name@7.27.1':
- resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-json-strings@7.27.1':
- resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-literals@7.27.1':
- resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-logical-assignment-operators@7.27.1':
- resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-member-expression-literals@7.27.1':
- resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-amd@7.27.1':
- resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-commonjs@7.27.1':
- resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-systemjs@7.27.1':
- resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-umd@7.27.1':
- resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-named-capturing-groups-regex@7.27.1':
- resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-transform-new-target@7.27.1':
- resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-nullish-coalescing-operator@7.27.1':
- resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-numeric-separator@7.27.1':
- resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-object-rest-spread@7.28.0':
- resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-object-super@7.27.1':
- resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-optional-catch-binding@7.27.1':
- resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-optional-chaining@7.27.1':
- resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-parameters@7.27.7':
- resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-private-methods@7.27.1':
- resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-private-property-in-object@7.27.1':
- resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-property-literals@7.27.1':
- resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-constant-elements@7.27.1':
- resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-display-name@7.28.0':
- resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-jsx-development@7.27.1':
- resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-jsx@7.27.1':
- resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-pure-annotations@7.27.1':
- resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-regenerator@7.28.1':
- resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-regexp-modifiers@7.27.1':
- resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/plugin-transform-reserved-words@7.27.1':
- resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-shorthand-properties@7.27.1':
- resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-spread@7.27.1':
- resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-sticky-regex@7.27.1':
- resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-template-literals@7.27.1':
- resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-typeof-symbol@7.27.1':
- resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-typescript@7.28.0':
- resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-escapes@7.27.1':
- resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-property-regex@7.27.1':
- resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-regex@7.27.1':
- resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-sets-regex@7.27.1':
- resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/preset-env@7.28.0':
- resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/preset-modules@0.1.6-no-external-plugins':
- resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
-
- '@babel/preset-react@7.27.1':
- resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/preset-typescript@7.27.1':
- resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/runtime@7.27.6':
- resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==}
+ '@babel/runtime@7.28.3':
+ resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
engines: {node: '>=6.9.0'}
'@babel/template@7.27.2':
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.28.0':
- resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==}
+ '@babel/traverse@7.28.3':
+ resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.28.1':
- resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==}
+ '@babel/types@7.28.2':
+ resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
engines: {node: '>=6.9.0'}
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
- '@clickhouse/client-common@1.11.2':
- resolution: {integrity: sha512-H4ECHqaipzMgiZKqpb1Z4N3Ofq+lVTCn8I59XsSynqrsfR4jWZD3PipXVvIzMpDmTMvrlJWrOwAdm0DMNiMQbA==}
+ '@biomejs/biome@2.4.10':
+ resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==}
+ engines: {node: '>=14.21.3'}
+ hasBin: true
- '@clickhouse/client@1.11.2':
- resolution: {integrity: sha512-ZE7Q1qxsDNXCkGPf1zqmhpZpwAKxKT+1s4Z432J1Mb2Gm26Y4tG/sJoug81AfAJTt6s7taO2vzNBAKfSR3SStg==}
+ '@biomejs/cli-darwin-arm64@2.4.10':
+ resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@biomejs/cli-darwin-x64@2.4.10':
+ resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@biomejs/cli-linux-arm64-musl@2.4.10':
+ resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@biomejs/cli-linux-arm64@2.4.10':
+ resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@biomejs/cli-linux-x64-musl@2.4.10':
+ resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+
+ '@biomejs/cli-linux-x64@2.4.10':
+ resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+
+ '@biomejs/cli-win32-arm64@2.4.10':
+ resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@biomejs/cli-win32-x64@2.4.10':
+ resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [win32]
+
+ '@clack/core@0.5.0':
+ resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==}
+
+ '@clack/prompts@0.11.0':
+ resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==}
+
+ '@clickhouse/client-common@1.18.2':
+ resolution: {integrity: sha512-J0SG6q9V31ydxonglpj9xhNRsUxCsF71iEZ784yldqMYwsHixj/9xHFDgBDX3DuMiDx/kPDfXnf+pimp08wIBA==}
+
+ '@clickhouse/client@1.18.2':
+ resolution: {integrity: sha512-fuquQswRSHWM6D079ZeuGqkMOsqtcUPL06UdTnowmoeeYjVrqisfVmvnw8pc3OeKS4kVb91oygb/MfLDiMs0TQ==}
engines: {node: '>=16'}
'@colors/colors@1.5.0':
@@ -1001,23 +615,6 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
- '@csstools/css-parser-algorithms@2.7.1':
- resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==}
- engines: {node: ^14 || ^16 || >=18}
- peerDependencies:
- '@csstools/css-tokenizer': ^2.4.1
-
- '@csstools/css-tokenizer@2.4.1':
- resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==}
- engines: {node: ^14 || ^16 || >=18}
-
- '@csstools/media-query-list-parser@2.1.13':
- resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==}
- engines: {node: ^14 || ^16 || >=18}
- peerDependencies:
- '@csstools/css-parser-algorithms': ^2.7.1
- '@csstools/css-tokenizer': ^2.4.1
-
'@csstools/postcss-cascade-layers@1.1.1':
resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==}
engines: {node: ^12 || ^14 || >=16}
@@ -1108,14 +705,8 @@ packages:
peerDependencies:
postcss-selector-parser: ^6.0.10
- '@csstools/selector-specificity@3.1.1':
- resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==}
- engines: {node: ^14 || ^16 || >=18}
- peerDependencies:
- postcss-selector-parser: ^6.0.13
-
- '@cypress/request@3.0.8':
- resolution: {integrity: sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==}
+ '@cypress/request@3.0.9':
+ resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==}
engines: {node: '>= 6'}
'@cypress/xvfb@1.2.4':
@@ -1124,451 +715,410 @@ packages:
'@date-fns/utc@1.2.0':
resolution: {integrity: sha512-YLq+crMPJiBmIdkRmv9nZuZy1mVtMlDcUKlg4mvI0UsC/dZeIaGoGB5p/C4FrpeOhZ7zBTK03T58S0DFkRNMnw==}
- '@dicebear/adventurer-neutral@9.2.3':
- resolution: {integrity: sha512-yjsflrlGIZolEJDcIhdh5l8R6QoyZ0Fc5ZaRS95Na15GeCA0bcq92fDpyb/87F8QRYR4hcn8wYim+MZKyDnm3A==}
+ '@dicebear/adventurer-neutral@9.4.2':
+ resolution: {integrity: sha512-5xgkG/mNL4j3Q4SJGQLBU/KnU90tng8Ze5ofThD+55wi0oeY/nSAUowg6UFCmHrktjifj/MEx3CQqbpcPWtfIA==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/adventurer@9.2.3':
- resolution: {integrity: sha512-kF97966JCLbLFkavLKLplhubC4k8G19e1V3vtq+XWKKSBNNLMc0yhiEXnFjS6eVI4rnQ6dUpTff4gUmpREmEnQ==}
+ '@dicebear/adventurer@9.4.2':
+ resolution: {integrity: sha512-jqYp834ZmGDA9HBBDQAdgF1O2UTCwHF4vVrktXWa2Dppp1JczPL5HnVOWsjtrLmXNn61Wd6OLmBb2e6rhzp3ig==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/avataaars-neutral@9.2.3':
- resolution: {integrity: sha512-v9Ga01GVKGchqNBc4Z2Gk5Y4P0c/jzNg6l/r4kX0xCMDXNd/vchi6QI464pHnJpDC/I8BzL1wYbpZrUEmTWJmA==}
+ '@dicebear/avataaars-neutral@9.4.2':
+ resolution: {integrity: sha512-/eNrp0YCNJRwQXqOloLm1+3Ss2C+pMpUQIGkbEnGsP1UK+13Ge80ggDDof1HpdqvG9HAZcKa7hnbG/0HSwyDSw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/avataaars@9.2.3':
- resolution: {integrity: sha512-Jh6mGKMA99KCF+S5rnS+QIlrApCy7NJI6SwmCzixJQmlX0GbWrgBuRxPEy2XJo4FWKGI9eFKOQ4QtNFEwGKjWQ==}
+ '@dicebear/avataaars@9.4.2':
+ resolution: {integrity: sha512-3x9jKFkOkFSPmpTbt9xvhiU2E1GX7beCSsX0tXRUShj8x6+5Ks9yBRT1VlkySbnXrZ/GglADGg7vJ/D2uIx1Yw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/big-ears-neutral@9.2.3':
- resolution: {integrity: sha512-y4T8ukm+A/ZXBnwyx3CFZxxJlzoTGJ1xmJL2j4/6zXxjlzl3wkc2mZX36t16i6NKiBs9LJwOUNx6IezbmYjDjg==}
+ '@dicebear/big-ears-neutral@9.4.2':
+ resolution: {integrity: sha512-M8Ozmzza4eY4hpLOYULgJxMYmBA0CsBnrE15/xw6LZkEREXnrX5z0NJsf8hUfdyF6BWZ+RBgzoiav32DAC5zcg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/big-ears@9.2.3':
- resolution: {integrity: sha512-YTZ3QIWlG6HlkDyASAaQoetxYtQgOwq4GTJxDpzzawFbhhtMJabqAU7dzWkPY6IgJfI/MAKVxdeqXK0Aiw4E6w==}
+ '@dicebear/big-ears@9.4.2':
+ resolution: {integrity: sha512-mNfz3ppNA7UBq0IO3nXCiV5pFPG7c1DfzRB0foNU2Wo1XXT8FIcSY2BvDlYqorZTOUOz7dHb0vx06hqvG0HP5w==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/big-smile@9.2.3':
- resolution: {integrity: sha512-/QvZlUmNIjnA6GN5VPUiD5g1MYr+qTOun3CfBSrPAav+tFo8RQGszM6ggvkmn4Q1aHwJ0XQNRiIvTJtQisuqKg==}
+ '@dicebear/big-smile@9.4.2':
+ resolution: {integrity: sha512-hmT5i7rcPPhStjZyg28pbIhdTnnMBzK3RObI0vKCpY30EFrzaPkkdDL6Ck5fAFBdvDIW1EpOJkenyR0XPmhgbQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/bottts-neutral@9.2.3':
- resolution: {integrity: sha512-6wFfWwXHE3kJKP0DqgN/SmSBDPs/s8o46APst8RfHnmcDLEsQExg0WquGwXfP+3XqGjPhsm/LGaA/yXKlE/84w==}
+ '@dicebear/bottts-neutral@9.4.2':
+ resolution: {integrity: sha512-kFNwWt6j+gzZ5n5Pz7WVwePubREAQOF8ZwWA9ztwVYDVMLnOChWbAofy5FED4j5md2MXFH2EgLCFCMr5K2BmIA==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/bottts@9.2.3':
- resolution: {integrity: sha512-udHSuK7uDYMFiCPZsHkaqCyo0hoJFMehsTSBtvOUOQqlQGYA2E7+gLgLmfvBQlYuk61lBM4yLyQdbGj0W7Nl1Q==}
+ '@dicebear/bottts@9.4.2':
+ resolution: {integrity: sha512-tsx+dII7EFUCVA8URj66G1GqORCCVduCAx4dY2prEY2IeFianVpkntXuFsWZ9BBGx1NZFndvDith5oTwKMQPbQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/collection@9.2.3':
- resolution: {integrity: sha512-PWW1x6EnDKw66dtpy3+1/W/UTrxq9jOGaWgRj+PV6Y0Pvc2a7ZMi6tBzfGWpy0r+XdhREUQ3vyFqim+R/iE2Rg==}
+ '@dicebear/collection@9.4.2':
+ resolution: {integrity: sha512-KArubv7if8H7j9sIfpDK2hJJqrdNVR5zMPAMOSpIU2JPyXx8TC9o5wsmXb8il5wOHgaS9Q/cla7jUNIiDD7Gsg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/core@9.2.3':
- resolution: {integrity: sha512-rsWmQO/TxBtnYbQSOrOESmf/XD5TC30cwKw9LBT2+7Q9HwIf5qJKBJT25bmwvn3RPHVe4A6DkTVMtmsoSaErFg==}
+ '@dicebear/core@9.4.2':
+ resolution: {integrity: sha512-MF0042+Z3s8PGZKZLySfhft28bUa3B1iq0e5NSjCvY8gfMi5aIH/iRJGRJa1N9Jz1BNkxYb4yvJ/N9KO8Z6Y+w==}
engines: {node: '>=18.0.0'}
- '@dicebear/croodles-neutral@9.2.3':
- resolution: {integrity: sha512-peurufAge4ZbzqGVAyFxhZ64qKv+MLBuQK2XvXsXX0uHgtEeAgSjFl6+O0wgJ7KVKtHL56qY68Acdhy3U91BYw==}
+ '@dicebear/croodles-neutral@9.4.2':
+ resolution: {integrity: sha512-oG5IeUdtiYshQ89gkAVcl5w3xAEi5UZX2fTzIyelpBPCG176l7VuuFzlxi2umnB3E6LVHYy06DXvUo/p+rXB2Q==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/croodles@9.2.3':
- resolution: {integrity: sha512-dzFhchlmhst+PBMkNbLNVcOyNFWAhaFnxQOMwWluHPzg8ryiFt/LEKWB7bPKMue1jBwta6LfoUv7vDG4LpdXIw==}
+ '@dicebear/croodles@9.4.2':
+ resolution: {integrity: sha512-6VoO0JviIf7dKKMBTL/SMXxWhnXHaZuzufX90G0nXxS77ELG1YkGNMaZzawizN4C09Gbya2gJkozqrWiJN/aGw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/dylan@9.2.3':
- resolution: {integrity: sha512-gtRhE1jxKwgUE4d2N7KHJ/rSdAg8zxgViALygs8/kcs2y4uinNx5NW3OvJwNPMBAwHRqeM6GbLKycbfiYMKdwA==}
+ '@dicebear/dylan@9.4.2':
+ resolution: {integrity: sha512-1vQvRu9x9DrwFxhFaIU2rf0EUL04yDTbAt7fHyAjM0mEsKzTD4mRNf95tCRuavCoW6W48u7A/OY6jyIub6kxLQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/fun-emoji@9.2.3':
- resolution: {integrity: sha512-zR+SmA7hWT8FDkJsdvg5uI7fOabilZfheM8RnMkEXXA0NmKgNKuWX9yFjLxeWESbJwBZFJ/SKasKcZSJP88eyw==}
+ '@dicebear/fun-emoji@9.4.2':
+ resolution: {integrity: sha512-kqB6LPkdYCdEU/mwbyz34xLzoNUKL6ARcoo3fr5ASq9D6ZE07qIKybC3xv5+CPz7VmspJ1Q3c/VVWVMDRP7Twg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/glass@9.2.3':
- resolution: {integrity: sha512-ucaM6TrTt/JsDa26ZQbtxevN0JLu2S06Q2+M/kAT2f0OdR6hSNdPnj/hDIVWg/u4XgW9HXrJ4Lt2KG2nZGq1MA==}
+ '@dicebear/glass@9.4.2':
+ resolution: {integrity: sha512-z5qUogHQ1b6UJ2zCqT848mU2U9DKbVDhiX6GPDjD7tYLisCCJVisH9p6WyNdHvflUd4SHkA6gRqVJIh2v2HnTA==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/icons@9.2.3':
- resolution: {integrity: sha512-2IaSmvgxzEvbtXHxhuxaCrBCtTG7HouxbInzPOetWz/YroTe5qj2k81uhl6ctbviO1PgGgkhIJ12nCIey6O/Tw==}
+ '@dicebear/icons@9.4.2':
+ resolution: {integrity: sha512-QSMMz0NA03ypSGhXC8HQX8FSj8lYT+/5yqH+/N03OH2IjL0q7wwGZ7nqsrtlRp76O5WqMTwGfSbTUUYPjFr+Xw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/identicon@9.2.3':
- resolution: {integrity: sha512-WCMYjOV19ocaJQDgD3E1z2FRgY4Zbnjieb2FSXPwW6zi04l52rhGaywk8YlCbaHilE43Iybyu1v6iDf4I71qKg==}
+ '@dicebear/identicon@9.4.2':
+ resolution: {integrity: sha512-JVDSmZsv11mSWqwAktK5x9Bslht2xY3TFUn8xzu6slAYe1Z7hEXZ76eb+UJ6F4qEzdwZ7xPWzAS6Nb0Y3A0pww==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/initials@9.2.3':
- resolution: {integrity: sha512-Qz668xB/XHRNsxW3vpZ0q9xq/M6tscbv1FaFvAGbnFO2hzfqiCWSK1cfNrrqlPJbz7Pz5LIlL5xObLZ0UYhFRA==}
+ '@dicebear/initials@9.4.2':
+ resolution: {integrity: sha512-yePuIUasmwtl9IrtB6rEzE/zb5fImKP/neW0CdcTC2MwLgMuP1GLHEGRgg1zI8exIh+PMv1YdLGyyUuRTE2Qpw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/lorelei-neutral@9.2.3':
- resolution: {integrity: sha512-C0XcfvB1Td9y1jeaBSkuMrQTAv/RiupQ62cE25f18Mw9UuTC3TwnHR6Ms/4SAEhCZxE2xYHZccs3Lvgkn/b3dA==}
+ '@dicebear/lorelei-neutral@9.4.2':
+ resolution: {integrity: sha512-yspanTthA5vh6iCdeLzn6xZ4yYMYRcfcxblcgSvHTF1ut0bjAXtw5SXzZ6aJTrJWiHkzYOQuTOR6GVYiW80Q7w==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/lorelei@9.2.3':
- resolution: {integrity: sha512-ribIq7I669JyUSZ0s8jDx5N2NqQUhGSoFGK5d82JqI2HYIAury/0WDsMh0fKeuYUJb9KuDEv+e9nO3OJVa8Hog==}
+ '@dicebear/lorelei@9.4.2':
+ resolution: {integrity: sha512-YMv6vnriW6VLFDsreKuOnUFFno6SRe7+7X7R7zPY0rZ+MaHX9V3jcioIG+1PSjIHEDfOLUHpr5vd1JBWv8y7UA==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/micah@9.2.3':
- resolution: {integrity: sha512-CcA/vVqrFEu5oDNAwJRRmLAE1gGJseP6BJTHMOdROkIOMpt1sy7OBqOFmajGnpOxOhvqBmvTZy0bw0G2TnnKSQ==}
+ '@dicebear/micah@9.4.2':
+ resolution: {integrity: sha512-e4D3W/OlChSsLo7Llwsy0J18vk0azJqF/uFoY+EKACCNHBc1HGNsqVvu2CTf+OWOA8wTyAK6UkjBN5p01r7D+g==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/miniavs@9.2.3':
- resolution: {integrity: sha512-l111IVYtbUXypFQz1U4hTFM5DxGThDmluG7mNi1Uu92I5/3mH7Eltm2mX3T6g1HFW8MDaTeSBKee1xGVaHmmaA==}
+ '@dicebear/miniavs@9.4.2':
+ resolution: {integrity: sha512-wLwyFNNUnDRd3BbhSBhXR0XEpX8sG0/xDA5M/OkDoapLqZnnI48YLUSDd2N5QTAVMmcSEuZOYxkcnj7WW79vlg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/notionists-neutral@9.2.3':
- resolution: {integrity: sha512-4WXCE9e9xIe1QdxiGXONxWhAzDVT4nMjoZA0rtgX8Sl0lqSIeBrO4RTnyaqFbGG1V1MiPj9CbE5OB8YbwexFBg==}
+ '@dicebear/notionists-neutral@9.4.2':
+ resolution: {integrity: sha512-AyD9kEfVxQUwDGf4Op059gVmYIOAkTKg3dtE9h9mEKP7zl/kMy5B67BFFOo7sB0mXCjzAegZ6ekGU02E8+hIHw==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/notionists@9.2.3':
- resolution: {integrity: sha512-0bqS1pwAR8aAm6BDShgD5eI+u0f2CtgeFIDsOER6Je3WwFGyIBUTwwVSL7gmiA5qcvQAB9Slohj7vbN0pifTyA==}
+ '@dicebear/notionists@9.4.2':
+ resolution: {integrity: sha512-ZCySq+nxcD/x4xyYgytcj2N9uY3gxrL+qpnmOdp2BdA221KacVrxlsUPpIgEMqxS2rMmBQXfxg129Pzn4ycIpA==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/open-peeps@9.2.3':
- resolution: {integrity: sha512-QcqKF3geA2Aqw1aJo8PO7+mKXz2I882D61I19vm94V1ojWnyw+8ihFmCLPReVcxQatxNjraTXCoKyT37TbgKBg==}
+ '@dicebear/open-peeps@9.4.2':
+ resolution: {integrity: sha512-i01tLgtp2g937T81sVeAOVlqsCtiTck/Kw20g7hN80+7xrXjOUepz2HPLy3HeiMjwjMGRy5o54kSd0/8Ht4Dqg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/personas@9.2.3':
- resolution: {integrity: sha512-YUXyoOwgt9CGhEuWl+dChDLmcVyuoU5UB7GY8PLWyHoy+1K3MzHJI7XFeDXyOYFpfuBiVY2++YjUZg26loqCNw==}
+ '@dicebear/personas@9.4.2':
+ resolution: {integrity: sha512-NJlkvI5F5gugt6t2+7QrYNTwQC7+4IQZS3vG0dYk2BncxOHax0BuLovdSdiAesTL4ZkytFYIydWmKmV2/xcUwg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/pixel-art-neutral@9.2.3':
- resolution: {integrity: sha512-Eblj/m8x0VSsJfN++GRMPdqOXCcTh0TIIf2waLbNlaOEU1xdhkYC9wSdYfjNv3gUIdbButiYWHwPgRZETcx1qQ==}
+ '@dicebear/pixel-art-neutral@9.4.2':
+ resolution: {integrity: sha512-9e9Lz554uQvWaXV2P17ss+hPa6rTyuAKBtB8zk8ECjHiZzIl61N/KcTVLZ4dILVZwj7gYriaLo16QEqvL2GJCg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/pixel-art@9.2.3':
- resolution: {integrity: sha512-4JZS/zbZZXg99P10sza0yxC2v+ugEWcoNy+c4I98ylWOjs2BrKcupSsU/2R11egT4u7hEknlVqR1zxKBGjuIDA==}
+ '@dicebear/pixel-art@9.4.2':
+ resolution: {integrity: sha512-peHf7oKICDgBZ8dUyj+txPnS7VZEWgvKE+xW4mNQqBt6dYZIjmva2shOVHn0b1JU+FDxMx3uIkWVixKdUq4WGg==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/rings@9.2.3':
- resolution: {integrity: sha512-L4gZAzMsf9TNS99Um1ElG7Ncs9VSpQugLL0fCfDkMEkGxvwM+Aqu1UfX7iV3qNsEiu/zaR+3qCMBOEfNGUE1vA==}
+ '@dicebear/rings@9.4.2':
+ resolution: {integrity: sha512-Pc3ymWrRDQPJFNrbbLt7RJrzGvUuuxUiDkrfLhoVE+B6mZWEL1PC78DPbS1yUWYLErJOpJuM2GSwXmTbVjWf+g==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/shapes@9.2.3':
- resolution: {integrity: sha512-4MlhZED2ZDfHymNiPtj67UwW79ECoK1gDjRsUS5BPQUBFIQ22cYrKrRhDcs1CxMZCStnVsH26tt3atIkFeIo9Q==}
+ '@dicebear/shapes@9.4.2':
+ resolution: {integrity: sha512-AFL6jAaiLztvcqyq+ds+lWZu6Vbp3PlGWhJeJRm842jxtiluJpl6r4f6nUXP2fdMz7MNpDzXfLooQK9E04NbUQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@dicebear/thumbs@9.2.3':
- resolution: {integrity: sha512-C9vFXjYpLWa98tc4n+FcWkpJAWaGSJOqPUeaom+KVU/ibXLkr21RlcDCRc63YJfiULlE8bQhDWw7FaUAFV3gew==}
+ '@dicebear/thumbs@9.4.2':
+ resolution: {integrity: sha512-ccWvDBqbkWS5uzHbsg5L6uML6vBfX7jT3J3jHCQksvz8haHItxTK02w+6e1UavZUsvza4lG5X/XY3eji3siJ4Q==}
engines: {node: '>=18.0.0'}
peerDependencies:
'@dicebear/core': ^9.0.0
- '@emnapi/core@1.4.5':
- resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==}
+ '@dicebear/toon-head@9.4.2':
+ resolution: {integrity: sha512-lwFeSXyAnaKnCfMt9TiJwnD1cXQUGkey/0h6i/+4TVHVMCz5/Ri5u1ynovPNHy1SnBf858QwoXHkxilGLwQX/g==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@dicebear/core': ^9.0.0
- '@emnapi/runtime@1.5.0':
- resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
+ '@electric-sql/pglite-socket@0.1.1':
+ resolution: {integrity: sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==}
+ hasBin: true
+ peerDependencies:
+ '@electric-sql/pglite': 0.4.1
- '@emnapi/wasi-threads@1.0.4':
- resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==}
+ '@electric-sql/pglite-tools@0.3.1':
+ resolution: {integrity: sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==}
+ peerDependencies:
+ '@electric-sql/pglite': 0.4.1
- '@esbuild/aix-ppc64@0.25.8':
- resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==}
+ '@electric-sql/pglite@0.4.1':
+ resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==}
+
+ '@emnapi/runtime@1.9.1':
+ resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
+
+ '@epic-web/invariant@1.0.0':
+ resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==}
+
+ '@esbuild/aix-ppc64@0.27.4':
+ resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.25.8':
- resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==}
+ '@esbuild/android-arm64@0.27.4':
+ resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.25.8':
- resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==}
+ '@esbuild/android-arm@0.27.4':
+ resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.25.8':
- resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==}
+ '@esbuild/android-x64@0.27.4':
+ resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.25.8':
- resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==}
+ '@esbuild/darwin-arm64@0.27.4':
+ resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.8':
- resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==}
+ '@esbuild/darwin-x64@0.27.4':
+ resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.25.8':
- resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==}
+ '@esbuild/freebsd-arm64@0.27.4':
+ resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.8':
- resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==}
+ '@esbuild/freebsd-x64@0.27.4':
+ resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.25.8':
- resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==}
+ '@esbuild/linux-arm64@0.27.4':
+ resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.25.8':
- resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==}
+ '@esbuild/linux-arm@0.27.4':
+ resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.25.8':
- resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==}
+ '@esbuild/linux-ia32@0.27.4':
+ resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.25.8':
- resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==}
+ '@esbuild/linux-loong64@0.27.4':
+ resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.8':
- resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==}
+ '@esbuild/linux-mips64el@0.27.4':
+ resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.25.8':
- resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==}
+ '@esbuild/linux-ppc64@0.27.4':
+ resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.8':
- resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==}
+ '@esbuild/linux-riscv64@0.27.4':
+ resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.25.8':
- resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==}
+ '@esbuild/linux-s390x@0.27.4':
+ resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.25.8':
- resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==}
+ '@esbuild/linux-x64@0.27.4':
+ resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.8':
- resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==}
+ '@esbuild/netbsd-arm64@0.27.4':
+ resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.8':
- resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==}
+ '@esbuild/netbsd-x64@0.27.4':
+ resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.25.8':
- resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==}
+ '@esbuild/openbsd-arm64@0.27.4':
+ resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.8':
- resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==}
+ '@esbuild/openbsd-x64@0.27.4':
+ resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.8':
- resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==}
+ '@esbuild/openharmony-arm64@0.27.4':
+ resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.25.8':
- resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==}
+ '@esbuild/sunos-x64@0.27.4':
+ resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.25.8':
- resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==}
+ '@esbuild/win32-arm64@0.27.4':
+ resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.25.8':
- resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==}
+ '@esbuild/win32-ia32@0.27.4':
+ resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.25.8':
- resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==}
+ '@esbuild/win32-x64@0.27.4':
+ resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
- '@eslint-community/eslint-utils@4.7.0':
- resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ '@formatjs/bigdecimal@0.2.0':
+ resolution: {integrity: sha512-GeaxHZbUoYvHL9tC5eltHLs+1zU70aPw0s7LwqgktIzF5oMhNY4o4deEtusJMsq7WFJF3Ye2zQEzdG8beVk73w==}
- '@eslint-community/regexpp@4.12.1':
- resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ '@formatjs/ecma402-abstract@2.3.6':
+ resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==}
- '@eslint/eslintrc@2.1.4':
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@formatjs/ecma402-abstract@3.2.0':
+ resolution: {integrity: sha512-dHnqHgBo6GXYGRsepaE1wmsC2etaivOWd5VaJstZd+HI2zR3DCUjbDVZRtoPGkkXZmyHvBwrdEUuqfvzhF/DtQ==}
- '@eslint/js@8.57.1':
- resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@formatjs/fast-memoize@2.2.7':
+ resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
- '@fontsource/inter@4.5.15':
- resolution: {integrity: sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==}
+ '@formatjs/fast-memoize@3.1.1':
+ resolution: {integrity: sha512-CbNbf+tlJn1baRnPkNePnBqTLxGliG6DDgNa/UtV66abwIjwsliPMOt0172tzxABYzSuxZBZfcp//qI8AvBWPg==}
- '@formatjs/cli@4.8.4':
- resolution: {integrity: sha512-zZI8QYVl5CHaT6j9OHjS+0mMnWzopBVH0un4n5b4IhIJRzIKnxwFTkxBp5Ifqj6FntrwzIGqP+D6v8u7MPYsmw==}
- hasBin: true
+ '@formatjs/icu-messageformat-parser@2.11.4':
+ resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==}
- '@formatjs/ecma402-abstract@1.11.4':
- resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==}
+ '@formatjs/icu-messageformat-parser@3.5.3':
+ resolution: {integrity: sha512-HJWZ9S6JWey6iY5+YXE3Kd0ofWU1sC2KTTp56e1168g/xxWvVvr8k9G4fexIgwYV9wbtjY7kGYK5FjoWB3B2OQ==}
- '@formatjs/ecma402-abstract@1.4.0':
- resolution: {integrity: sha512-Mv027hcLFjE45K8UJ8PjRpdDGfR0aManEFj1KzoN8zXNveHGEygpZGfFf/FTTMl+QEVSrPAUlyxaCApvmv47AQ==}
+ '@formatjs/icu-skeleton-parser@1.8.16':
+ resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==}
- '@formatjs/ecma402-abstract@1.5.0':
- resolution: {integrity: sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==}
+ '@formatjs/icu-skeleton-parser@2.1.3':
+ resolution: {integrity: sha512-9mFp8TJ166ZM2pcjKwsBWXrDnOJGT7vMEScVgLygUODPOsE8S6f/FHoacvrlHK1B4dYZk8vSCNruyPU64AfgJQ==}
- '@formatjs/ecma402-abstract@2.2.4':
- resolution: {integrity: sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==}
+ '@formatjs/intl-localematcher@0.6.2':
+ resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
- '@formatjs/fast-memoize@2.2.3':
- resolution: {integrity: sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==}
-
- '@formatjs/icu-messageformat-parser@2.1.0':
- resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==}
-
- '@formatjs/icu-messageformat-parser@2.9.4':
- resolution: {integrity: sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==}
-
- '@formatjs/icu-skeleton-parser@1.3.6':
- resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==}
-
- '@formatjs/icu-skeleton-parser@1.8.8':
- resolution: {integrity: sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==}
-
- '@formatjs/intl-displaynames@6.8.5':
- resolution: {integrity: sha512-85b+GdAKCsleS6cqVxf/Aw/uBd+20EM0wDpgaxzHo3RIR3bxF4xCJqH/Grbzx8CXurTgDDZHPdPdwJC+May41w==}
-
- '@formatjs/intl-listformat@7.7.5':
- resolution: {integrity: sha512-Wzes10SMNeYgnxYiKsda4rnHP3Q3II4XT2tZyOgnH5fWuHDtIkceuWlRQNsvrI3uiwP4hLqp2XdQTCsfkhXulg==}
-
- '@formatjs/intl-localematcher@0.2.25':
- resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==}
-
- '@formatjs/intl-localematcher@0.5.8':
- resolution: {integrity: sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==}
-
- '@formatjs/intl-numberformat@5.7.6':
- resolution: {integrity: sha512-ZlZfYtvbVHYZY5OG3RXizoCwxKxEKOrzEe2YOw9wbzoxF3PmFn0SAgojCFGLyNXkkR6xVxlylhbuOPf1dkIVNg==}
-
- '@formatjs/intl@2.10.15':
- resolution: {integrity: sha512-i6+xVqT+6KCz7nBfk4ybMXmbKO36tKvbMKtgFz9KV+8idYFyFbfwKooYk8kGjyA5+T5f1kEPQM5IDLXucTAQ9g==}
- peerDependencies:
- typescript: ^4.7 || 5
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@formatjs/ts-transformer@2.13.0':
- resolution: {integrity: sha512-mu7sHXZk1NWZrQ3eUqugpSYo8x5/tXkrI4uIbFqCEC0eNgQaIcoKgVeDFgDAcgG+cEme2atAUYSFF+DFWC4org==}
- peerDependencies:
- ts-jest: ^26.4.0
- peerDependenciesMeta:
- ts-jest:
- optional: true
-
- '@formatjs/ts-transformer@3.9.4':
- resolution: {integrity: sha512-S5q/zsTodaKtxVxNvbRQ9APenJtm5smXE76usS+5yF2vWQdZHkagmOKWfgvfIbesP4SR2B+i3koqlnlpqSIp5w==}
- peerDependencies:
- ts-jest: '27'
- peerDependenciesMeta:
- ts-jest:
- optional: true
+ '@formatjs/intl-localematcher@0.8.2':
+ resolution: {integrity: sha512-q05KMYGJLyqFNFtIb8NhWLF5X3aK/k0wYt7dnRFuy6aLQL+vUwQ1cg5cO4qawEiINybeCPXAWlprY2mSBjSXAQ==}
'@hello-pangea/dnd@17.0.0':
resolution: {integrity: sha512-LDDPOix/5N0j5QZxubiW9T0M0+1PR0rTDWeZF5pu1Tz91UQnuVK4qQ/EjY83Qm2QeX0eM8qDXANfDh3VVqtR4Q==}
@@ -1576,145 +1126,164 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
- '@humanwhocodes/config-array@0.13.0':
- resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
- engines: {node: '>=10.10.0'}
- deprecated: Use @eslint/config-array instead
+ '@hono/node-server@1.19.11':
+ resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==}
+ engines: {node: '>=18.14.1'}
+ peerDependencies:
+ hono: ^4
- '@humanwhocodes/module-importer@1.0.1':
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
-
- '@humanwhocodes/object-schema@2.0.3':
- resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
- deprecated: Use @eslint/object-schema instead
-
- '@img/colour@1.0.0':
- resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
- '@img/sharp-darwin-arm64@0.34.4':
- resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==}
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [darwin]
- '@img/sharp-darwin-x64@0.34.4':
- resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==}
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-darwin-arm64@1.2.3':
- resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==}
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
cpu: [arm64]
os: [darwin]
- '@img/sharp-libvips-darwin-x64@1.2.3':
- resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==}
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-linux-arm64@1.2.3':
- resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==}
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linux-arm@1.2.3':
- resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==}
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
- '@img/sharp-libvips-linux-ppc64@1.2.3':
- resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==}
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
- '@img/sharp-libvips-linux-s390x@1.2.3':
- resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==}
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
- '@img/sharp-libvips-linux-x64@1.2.3':
- resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==}
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-arm64@1.2.3':
- resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==}
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-x64@1.2.3':
- resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==}
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
- '@img/sharp-linux-arm64@0.34.4':
- resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==}
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- '@img/sharp-linux-arm@0.34.4':
- resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==}
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
- '@img/sharp-linux-ppc64@0.34.4':
- resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==}
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
- '@img/sharp-linux-s390x@0.34.4':
- resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==}
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
- '@img/sharp-linux-x64@0.34.4':
- resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==}
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- '@img/sharp-linuxmusl-arm64@0.34.4':
- resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==}
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- '@img/sharp-linuxmusl-x64@0.34.4':
- resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==}
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- '@img/sharp-wasm32@0.34.4':
- resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==}
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32]
- '@img/sharp-win32-arm64@0.34.4':
- resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==}
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [win32]
- '@img/sharp-win32-ia32@0.34.4':
- resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==}
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32]
os: [win32]
- '@img/sharp-win32-x64@0.34.4':
- resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==}
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [win32]
+ '@internationalized/date@3.11.0':
+ resolution: {integrity: sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==}
+
+ '@internationalized/date@3.12.0':
+ resolution: {integrity: sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==}
+
+ '@internationalized/message@3.1.8':
+ resolution: {integrity: sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA==}
+
+ '@internationalized/number@3.6.5':
+ resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==}
+
+ '@internationalized/string@3.2.7':
+ resolution: {integrity: sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A==}
+
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
@@ -1727,6 +1296,10 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
'@istanbuljs/load-nyc-config@1.1.0':
resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
engines: {node: '>=8'}
@@ -1748,6 +1321,10 @@ packages:
node-notifier:
optional: true
+ '@jest/diff-sequences@30.0.1':
+ resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
'@jest/environment@29.7.0':
resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -1756,6 +1333,10 @@ packages:
resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/expect-utils@30.1.1':
+ resolution: {integrity: sha512-5YUHr27fpJ64dnvtu+tt11ewATynrHkGYD+uSFgRr8V2eFJis/vEXgToyLwccIwqBihVfz9jwio+Zr1ab1Zihw==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
'@jest/expect@29.7.0':
resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -1764,10 +1345,18 @@ packages:
resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/get-type@30.1.0':
+ resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
'@jest/globals@29.7.0':
resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/pattern@30.0.1':
+ resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
'@jest/reporters@29.7.0':
resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -1781,6 +1370,10 @@ packages:
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/schemas@30.0.5':
+ resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
'@jest/source-map@29.6.3':
resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -1801,21 +1394,31 @@ packages:
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- '@jridgewell/gen-mapping@0.3.12':
- resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
+ '@jest/types@30.0.5':
+ resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- '@jridgewell/source-map@0.3.10':
- resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==}
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
- '@jridgewell/sourcemap-codec@1.5.4':
- resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
- '@jridgewell/trace-mapping@0.3.29':
- resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==}
+ '@jridgewell/trace-mapping@0.3.30':
+ resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
@@ -1823,63 +1426,57 @@ packages:
'@kurkle/color@0.3.4':
resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==}
- '@napi-rs/wasm-runtime@0.2.12':
- resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
-
- '@netlify/plugin-nextjs@5.11.6':
- resolution: {integrity: sha512-F+HiQaUpISBmooALpwDULoCCwUhI6MugEEBstjuxOL2rh2ROFhK4abv87f4GxVXRSmw0AtXAp2eiP8vHcZ3NKQ==}
+ '@netlify/plugin-nextjs@5.15.9':
+ resolution: {integrity: sha512-4kJvV+wrt4/ncehfaOXfhv1FYKCv9EFjq6/tgXXYSlqPDcbsuTXR0DTz9IvyZ/CpPRadRD/zzIqD9wXgCmA2lg==}
engines: {node: '>=18.0.0'}
- '@next/env@15.4.7':
- resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==}
+ '@next/env@16.2.1':
+ resolution: {integrity: sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==}
- '@next/eslint-plugin-next@14.2.30':
- resolution: {integrity: sha512-mvVsMIutMxQ4NGZEMZ1kiBNc+la8Xmlk30bKUmCPQz2eFkmsLv54Mha8QZarMaCtSPkkFA1TMD+FIZk0l/PpzA==}
-
- '@next/swc-darwin-arm64@15.4.7':
- resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==}
+ '@next/swc-darwin-arm64@16.2.1':
+ resolution: {integrity: sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.4.7':
- resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==}
+ '@next/swc-darwin-x64@16.2.1':
+ resolution: {integrity: sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.4.7':
- resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==}
+ '@next/swc-linux-arm64-gnu@16.2.1':
+ resolution: {integrity: sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.4.7':
- resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==}
+ '@next/swc-linux-arm64-musl@16.2.1':
+ resolution: {integrity: sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.4.7':
- resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==}
+ '@next/swc-linux-x64-gnu@16.2.1':
+ resolution: {integrity: sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.4.7':
- resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==}
+ '@next/swc-linux-x64-musl@16.2.1':
+ resolution: {integrity: sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.4.7':
- resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==}
+ '@next/swc-win32-arm64-msvc@16.2.1':
+ resolution: {integrity: sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.4.7':
- resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==}
+ '@next/swc-win32-x64-msvc@16.2.1':
+ resolution: {integrity: sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -1896,76 +1493,903 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@nolyfill/is-core-module@1.0.39':
- resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
- engines: {node: '>=12.4.0'}
+ '@parcel/watcher-android-arm64@2.5.6':
+ resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.6':
+ resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+ engines: {node: '>= 10.0.0'}
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
- '@prisma/client@6.7.0':
- resolution: {integrity: sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==}
- engines: {node: '>=18.18'}
+ '@prisma/adapter-pg@7.6.0':
+ resolution: {integrity: sha512-BjHNmJqqa42NqJSDPnXUfwUofWo8LJY7Ui2gqxN4DmAOb+H/gGKv+hln2Xq/1kSJXPW5AXMXuNiPDMpywvyIOw==}
+
+ '@prisma/client-runtime-utils@7.6.0':
+ resolution: {integrity: sha512-fD7jlqubsZvVODKvsp9lOpXVecx2aWGxC2l35Ioz2t+teUJ5CfR0SAMsi7UkU1VvaZmmm+DS6BdujF622nY7tQ==}
+
+ '@prisma/client@7.6.0':
+ resolution: {integrity: sha512-7Pe/1ayh3GgWPEg4mmT4ax77LJ1wC+XlnIFvQ94bLP2DsUnOpnruQQR3Jw7r+Frthk94QqDNxo3FjSg8h9PXeQ==}
+ engines: {node: ^20.19 || ^22.12 || >=24.0}
peerDependencies:
prisma: '*'
- typescript: '>=5.1.0'
+ typescript: '>=5.4.0'
peerDependenciesMeta:
prisma:
optional: true
typescript:
optional: true
- '@prisma/config@6.7.0':
- resolution: {integrity: sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==}
+ '@prisma/config@7.6.0':
+ resolution: {integrity: sha512-MuAz1MK4PeG5/03YzfzX3CnFVHQ6qePGwUpQRzPzX5tT0ffJ3Tzi9zJZbBc+VzEGFCM8ghW/gTVDR85Syjt+Yw==}
- '@prisma/debug@6.7.0':
- resolution: {integrity: sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==}
+ '@prisma/debug@7.2.0':
+ resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==}
- '@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed':
- resolution: {integrity: sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==}
+ '@prisma/debug@7.6.0':
+ resolution: {integrity: sha512-LpHr3qos4lQZ6sxwjStf59YBht7m9/QF7NSQsMH6qGENWZu2w3UkQUGn1h5iRkDjnWRj3VHykOu9qFhps4ADvA==}
- '@prisma/engines@6.7.0':
- resolution: {integrity: sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==}
+ '@prisma/dev@0.24.3':
+ resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==}
- '@prisma/extension-read-replicas@0.4.1':
- resolution: {integrity: sha512-mCMDloqUKUwx2o5uedTs1FHX3Nxdt1GdRMoeyp1JggjiwOALmIYWhxfIN08M2BZ0w8SKwvJqicJZMjkQYkkijw==}
+ '@prisma/driver-adapter-utils@7.6.0':
+ resolution: {integrity: sha512-D8j3p0RnhLuufMaRLX6QqtGgPC5Ao3l5oFP6Q5AL0rTHi4vna+NzGEipwCsfvcSvaGFCbsH3lsTMbb4WvY+ovA==}
+
+ '@prisma/engines-version@7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711':
+ resolution: {integrity: sha512-r51DLcJ8bDRSrBEJF3J4cinoWyGA7rfP2mG6lD90VqIbGNOkbfcLcXalSVjq5Y6brQS3vcjrq4GbyUb1Cb7vkw==}
+
+ '@prisma/engines@7.6.0':
+ resolution: {integrity: sha512-Sn5edRzhHqgRV2M+A0eIbY442B4mReWWf3pKs/LKreYgW7oa/up8JtK/s4iv/EQA097cyboZ08mmkpbLp+tZ3w==}
+
+ '@prisma/extension-read-replicas@0.5.0':
+ resolution: {integrity: sha512-t0kLjqFMte4wwGrZFhya4iFoyoOY4kjlyyE60WXZL66PqP6PcBpW/35eKb/3UcxgjJxcDlaJKfmGokFLOyafiQ==}
peerDependencies:
- '@prisma/client': ^6.5.0
+ '@prisma/client': ^7.0.0
- '@prisma/fetch-engine@6.7.0':
- resolution: {integrity: sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==}
+ '@prisma/fetch-engine@7.6.0':
+ resolution: {integrity: sha512-N575Ni95c3FkduWY/eKTHqNYgNbceZ1tQaSknVtJjpKmiiBXmniESn/GTxsDvICC4ZeiNrXxioGInzQrCdx16w==}
- '@prisma/get-platform@6.7.0':
- resolution: {integrity: sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==}
+ '@prisma/get-platform@7.2.0':
+ resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==}
+
+ '@prisma/get-platform@7.6.0':
+ resolution: {integrity: sha512-ohZDwXvtmnbzOcutR2D13lDWpZP1wQjmPyztmt0AwXLzQI7q95EE7NYCvS+M6N6SivT+BM0NOqLmTH3wms4L3A==}
+
+ '@prisma/query-plan-executor@7.2.0':
+ resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==}
+
+ '@prisma/streams-local@0.1.2':
+ resolution: {integrity: sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==}
+ engines: {bun: '>=1.3.6', node: '>=22.0.0'}
+
+ '@prisma/studio-core@0.27.3':
+ resolution: {integrity: sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==}
+ engines: {node: ^20.19 || ^22.12 || >=24.0, pnpm: '8'}
+ peerDependencies:
+ '@types/react': ^18.0.0 || ^19.0.0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+
+ '@radix-ui/primitive@1.1.3':
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+
+ '@radix-ui/react-compose-refs@1.1.2':
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-primitive@2.1.3':
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.2.3':
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-toggle@1.1.10':
+ resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.2.2':
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-effect-event@0.0.2':
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.1':
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@react-aria/autocomplete@3.0.0-rc.4':
+ resolution: {integrity: sha512-4bMMVNaCuYDZX9HM4ZNSAImZMcL/orwhLLe818+lyzmSrvGmW9h433PZxTolb0d+FnJVfn1MDY0zEWLiyI86GA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/breadcrumbs@3.5.32':
+ resolution: {integrity: sha512-S61vh5DJ2PXiXUwD7gk+pvS/b4VPrc3ZJOUZ0yVRLHkVESr5LhIZH+SAVgZkm1lzKyMRG+BH+fiRH/DZRSs7SA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/button@3.14.5':
+ resolution: {integrity: sha512-ZuLx+wQj9VQhH9BYe7t0JowmKnns2XrFHFNvIVBb5RwxL+CIycIOL7brhWKg2rGdxvlOom7jhVbcjSmtAaSyaQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/calendar@3.9.5':
+ resolution: {integrity: sha512-k0kvceYdZZu+DoeqephtlmIvh1CxqdFyoN52iqVzTz9O0pe5Xfhq7zxPGbeCp4pC61xzp8Lu/6uFA/YNfQQNag==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/checkbox@3.16.5':
+ resolution: {integrity: sha512-ZhUT7ELuD52hb+Zpzw0ElLQiVOd5sKYahrh+PK3vq13Wk5TedBscALpjuXetI4pwFfdmAM1Lhgcsrd8+6AmyvA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/collections@3.0.3':
+ resolution: {integrity: sha512-lbC5DEbHeVFvVr4ke9y8D9Nynnr8G8UjVEBoFGRylpAaScU7SX1TN84QI+EjMbsdZ0/5P2H7gUTS+MYd+6U3Rg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/color@3.1.5':
+ resolution: {integrity: sha512-eysWdBRzE8WDhBzh1nfjyUgzseMokXGHjIoJo880T7IPJ8tTavfQni49pU1B2qWrNOWPyrwx4Bd9pzHyboxJSA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/combobox@3.15.0':
+ resolution: {integrity: sha512-qSjQTFwKl3x1jCP2NRSJ6doZqAp6c2GTfoiFwWjaWg1IewwLsglaW6NnzqRDFiqFbDGgXPn4MqtC1VYEJ3NEjA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/datepicker@3.16.1':
+ resolution: {integrity: sha512-6BltCVWt09yefTkGjb2gViGCwoddx9HKJiZbY9u6Es/Q+VhwNJQRtczbnZ3K32p262hIknukNf/5nZaCOI1AKA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/dialog@3.5.34':
+ resolution: {integrity: sha512-/x53Q5ynpW5Kv9637WYu7SrDfj3woSp6jJRj8l6teGnWW/iNZWYJETgzHfbxx+HPKYATCZesRoIeO2LnYIXyEA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/disclosure@3.1.3':
+ resolution: {integrity: sha512-S3k7Wqrj+x0sWcP88Z1stSr5TIZmKEmx2rU7RB1O1/jPpbw5mgKnjtiriOlTh+kwdK11FkeqgxyHzAcBAR+FMQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/dnd@3.11.6':
+ resolution: {integrity: sha512-4YLHUeYJleF+moAYaYt8UZqujudPvpoaHR+QMkWIFzhfridVUhCr6ZjGWrzpSZY3r68k46TG7YCsi4IEiNnysw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/focus@3.21.4':
+ resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/focus@3.21.5':
+ resolution: {integrity: sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/form@3.1.5':
+ resolution: {integrity: sha512-BWlONgHn8hmaMkcS6AgMSLQeNqVBwqPNLhdqjDO/PCfzvV7O8NZw/dFeIzJwfG4aBfSpbHHRdXGdfrk3d8dylQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/grid@3.14.8':
+ resolution: {integrity: sha512-X6rRFKDu/Kh6Sv8FBap3vjcb+z4jXkSOwkYnexIJp5kMTo5/Dqo55cCBio5B70Tanfv32Ev/6SpzYG7ryxnM9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/gridlist@3.14.4':
+ resolution: {integrity: sha512-C/SbwC0qagZatoBrCjx8iZUex9apaJ8o8iRJ9eVHz0cpj7mXg6HuuotYGmDy9q67A2hve4I693RM1Cuwqwm+PQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/i18n@3.12.16':
+ resolution: {integrity: sha512-Km2CAz6MFQOUEaattaW+2jBdWOHUF8WX7VQoNbjlqElCP58nSaqi9yxTWUDRhAcn8/xFUnkFh4MFweNgtrHuEA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/interactions@3.27.0':
+ resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/interactions@3.27.1':
+ resolution: {integrity: sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/label@3.7.25':
+ resolution: {integrity: sha512-oNK3Pqj4LDPwEbQaoM/uCip4QvQmmwGOh08VeW+vzSi6TAwf+KoWTyH/tiAeB0CHWNDK0k3e1iTygTAt4wzBmg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/landmark@3.0.10':
+ resolution: {integrity: sha512-GpNjJaI8/a6WxYDZgzTCLYSzPM6xp2pxCIQ4udiGbTCtxx13Trmm0cPABvPtzELidgolCf05em9Phr+3G0eE8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/link@3.8.9':
+ resolution: {integrity: sha512-UaAFBfs84/Qq6TxlMWkREqqNY6SFLukot+z2Aa1kC+VyStv1kWG6sE5QLjm4SBn1Q3CGRsefhB/5+taaIbB4Pw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/listbox@3.15.3':
+ resolution: {integrity: sha512-C6YgiyrHS5sbS5UBdxGMhEs+EKJYotJgGVtl9l0ySXpBUXERiHJWLOyV7a8PwkUOmepbB4FaLD7Y9EUzGkrGlw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/live-announcer@3.4.4':
+ resolution: {integrity: sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA==}
+
+ '@react-aria/menu@3.21.0':
+ resolution: {integrity: sha512-CKTVZ4izSE1eKIti6TbTtzJAUo+WT8O4JC0XZCYDBpa0f++lD19Kz9aY+iY1buv5xGI20gAfpO474E9oEd4aQA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/meter@3.4.30':
+ resolution: {integrity: sha512-ZmANKW7s/Z4QGylHi46nhwtQ47T1bfMsU9MysBu7ViXXNJ03F4b6JXCJlKL5o2goQ3NbfZ68GeWamIT0BWSgtw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/numberfield@3.12.5':
+ resolution: {integrity: sha512-Fi41IUWXEHLFIeJ/LHuZ9Azs8J/P563fZi37GSBkIq5P1pNt1rPgJJng5CNn4KsHxwqadTRUlbbZwbZraWDtRg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/overlays@3.31.2':
+ resolution: {integrity: sha512-78HYI08r6LvcfD34gyv19ArRIjy1qxOKuXl/jYnjLDyQzD4pVb634IQWcm0zt10RdKgyuH6HTqvuDOgZTLet7Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/progress@3.4.30':
+ resolution: {integrity: sha512-S6OWVGgluSWYSd/A6O8CVjz83eeMUfkuWSra0ewAV9bmxZ7TP9pUmD3bGdqHZEl97nt5vHGjZ3eq/x8eCmzKhA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/radio@3.12.5':
+ resolution: {integrity: sha512-8CCJKJzfozEiWBPO9QAATG1rBGJEJ+xoqvHf9LKU2sPFGsA2/SRnLs6LB9fCG5R3spvaK1xz0any1fjWPl7x8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/searchfield@3.8.12':
+ resolution: {integrity: sha512-kYlUHD/+mWzNroHoR8ojUxYBoMviRZn134WaKPFjfNUGZDOEuh4XzOoj+cjdJfe6N3mwTaYu6rJQtunSHIAfhA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/select@3.17.3':
+ resolution: {integrity: sha512-u0UFWw0S7q9oiSbjetDpRoLLIcC+L89uYlm+YfCrdT8ntbQgABNiJRxdVvxnhR0fR6MC9ASTTvuQnNHNn52+1A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/selection@3.27.2':
+ resolution: {integrity: sha512-GbUSSLX/ciXix95KW1g+SLM9np7iXpIZrFDSXkC6oNx1uhy18eAcuTkeZE25+SY5USVUmEzjI3m/3JoSUcebbg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/separator@3.4.16':
+ resolution: {integrity: sha512-RCUtQhDGnPxKzyG8KM79yOB0fSiEf8r/rxShidOVnGLiBW2KFmBa22/Gfc4jnqg/keN3dxvkSGoqmeXgctyp6g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/slider@3.8.5':
+ resolution: {integrity: sha512-gqkJxznk141mE0JamXF5CXml9PDbPkBz8dyKlihtWHWX4yhEbVYdC9J0otE7iCR3zx69Bm7WHoTGL0BsdpKzVA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/spinbutton@3.7.2':
+ resolution: {integrity: sha512-adjE1wNCWlugvAtVXlXWPtIG9JWurEgYVn1Eeyh19x038+oXGvOsOAoKCXM+SnGleTWQ9J7pEZITFoEI3cVfAw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/ssr@3.9.10':
+ resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/switch@3.7.11':
+ resolution: {integrity: sha512-dYVX71HiepBsKyeMaQgHbhqI+MQ3MVoTd5EnTbUjefIBnmQZavYj1/e4NUiUI4Ix+/C0HxL8ibDAv4NlSW3eLQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/table@3.17.11':
+ resolution: {integrity: sha512-GkYmWPiW3OM+FUZxdS33teHXHXde7TjHuYgDDaG9phvg6cQTQjGilJozrzA3OfftTOq5VB8XcKTIQW3c0tpYsQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/tabs@3.11.1':
+ resolution: {integrity: sha512-3Ppz7yaEDW9L7p9PE9yNOl5caLwNnnLQqI+MX/dwbWlw9HluHS7uIjb21oswNl6UbSxAWyENOka45+KN4Fkh7A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/tag@3.8.1':
+ resolution: {integrity: sha512-VonpO++F8afXGDWc9VUxAc2wefyJpp1n9OGpbnB7zmqWiuPwO/RixjUdcH7iJkiC4vADwx9uLnhyD6kcwGV2ig==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/textfield@3.18.5':
+ resolution: {integrity: sha512-ttwVSuwoV3RPaG2k2QzEXKeQNQ3mbdl/2yy6I4Tjrn1ZNkYHfVyJJ26AjenfSmj1kkTQoSAfZ8p+7rZp4n0xoQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/toast@3.0.11':
+ resolution: {integrity: sha512-2DjZjBAvm8/CWbnZ6s7LjkYCkULKtjMve6GvhPTq98AthuEDLEiBvM1wa3xdecCRhZyRT1g6DXqVca0EfZ9fJA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/toggle@3.12.5':
+ resolution: {integrity: sha512-XXVFLzcV8fr9mz7y/wfxEAhWvaBZ9jSfhCMuxH2bsivO7nTcMJ1jb4g2xJNwZgne17bMWNc7mKvW5dbsdlI6BA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/toolbar@3.0.0-beta.22':
+ resolution: {integrity: sha512-Q1gOj6N4vzvpGrIoNAxpUudEQP82UgQACENH/bcH8FnEMbSP7DHvVfDhj7GTU6ldMXO2cjqLhiidoUK53gkCiA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/toolbar@3.0.0-beta.24':
+ resolution: {integrity: sha512-B2Rmpko7Ghi2RbNfsGdbR7I+RQBDhPGVE4bU3/EwHz+P/vNe5LyGPTeSwqaOMsQTF9lKNCkY8424dVTCr6RUMg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/tooltip@3.9.2':
+ resolution: {integrity: sha512-VrgkPwHiEnAnBhoQ4W7kfry/RfVuRWrUPaJSp0+wKM6u0gg2tmn7OFRDXTxBAm/omQUguIdIjRWg7sf3zHH82A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/tree@3.1.7':
+ resolution: {integrity: sha512-C54yH5NmsOFa2Q+cg6B1BPr5KUlU9vLIoBnVrgrH237FRSXQPIbcM4VpmITAHq1VR7w6ayyS1hgTwFxo67ykWQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/utils@3.33.0':
+ resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/utils@3.33.1':
+ resolution: {integrity: sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/virtualizer@4.1.13':
+ resolution: {integrity: sha512-d5KS+p8GXGNRbGPRE/N6jtth3et3KssQIz52h2+CAoAh7C3vvR64kkTaGdeywClvM+fSo8FxJuBrdfQvqC2ktQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/visually-hidden@3.8.31':
+ resolution: {integrity: sha512-RTOHHa4n56a9A3criThqFHBifvZoV71+MCkSuNP2cKO662SUWjqKkd0tJt/mBRMEJPkys8K7Eirp6T8Wt5FFRA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-spring/animated@10.0.3':
+ resolution: {integrity: sha512-7MrxADV3vaUADn2V9iYhaIL6iOWRx9nCJjYrsk2AHD2kwPr6fg7Pt0v+deX5RnCDmCKNnD6W5fasiyM8D+wzJQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@react-spring/animated@9.7.5':
resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/core@10.0.3':
+ resolution: {integrity: sha512-D4DwNO68oohDf/0HG2G0Uragzb9IA1oXblxrd6MZAcBcUQG2EHUWXewjdECMPLNmQvlYVyyBRH6gPxXM5DX7DQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/core@9.7.5':
resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/rafz@10.0.3':
+ resolution: {integrity: sha512-Ri2/xqt8OnQ2iFKkxKMSF4Nqv0LSWnxXT4jXFzBDsHgeeH/cHxTLupAWUwmV9hAGgmEhBmh5aONtj3J6R/18wg==}
+
'@react-spring/rafz@9.7.5':
resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==}
+ '@react-spring/shared@10.0.3':
+ resolution: {integrity: sha512-geCal66nrkaQzUVhPkGomylo+Jpd5VPK8tPMEDevQEfNSWAQP15swHm+MCRG4wVQrQlTi9lOzKzpRoTL3CA84Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/shared@9.7.5':
resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/types@10.0.3':
+ resolution: {integrity: sha512-H5Ixkd2OuSIgHtxuHLTt7aJYfhMXKXT/rK32HPD/kSrOB6q6ooeiWAXkBy7L8F3ZxdkBb9ini9zP9UwnEFzWgQ==}
+
'@react-spring/types@9.7.5':
resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==}
+ '@react-spring/web@10.0.3':
+ resolution: {integrity: sha512-ndU+kWY81rHsT7gTFtCJ6mrVhaJ6grFmgTnENipzmKqot4HGf5smPNK+cZZJqoGeDsj9ZsiWPW4geT/NyD484A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/web@9.7.5':
resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-stately/autocomplete@3.0.0-beta.4':
+ resolution: {integrity: sha512-K2Uy7XEdseFvgwRQ8CyrYEHMupjVKEszddOapP8deNz4hntYvT1aRm0m+sKa5Kl/4kvg9c/3NZpQcrky/vRZIg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/calendar@3.9.3':
+ resolution: {integrity: sha512-uw7fCZXoypSBBUsVkbNvJMQWTihZReRbyLIGG3o/ZM630N3OCZhb/h4Uxke4pNu7n527H0V1bAnZgAldIzOYqg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/checkbox@3.7.5':
+ resolution: {integrity: sha512-K5R5ted7AxLB3sDkuVAazUdyRMraFT1imVqij2GuAiOUFvsZvbuocnDuFkBVKojyV3GpqLBvViV8IaCMc4hNIw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/collections@3.12.10':
+ resolution: {integrity: sha512-wmF9VxJDyBujBuQ76vXj2g/+bnnj8fx5DdXgRmyfkkYhPB46+g2qnjbVGEvipo7bJuGxDftCUC4SN7l7xqUWfg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/color@3.9.5':
+ resolution: {integrity: sha512-8pZxzXWDRuglzDwyTG7mLw2LQMCHIVNbVc9YmbsxbOjAL+lOqszo60KzyaFKVxeDQczSvrNTHcQZqlbNIC0eyQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/combobox@3.13.0':
+ resolution: {integrity: sha512-dX9g/cK1hjLRjcbWVF6keHxTQDGhKGB2QAgPhWcBmOK3qJv+2dQqsJ6YCGWn/Y2N2acoEseLrAA7+Qe4HWV9cg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/data@3.15.2':
+ resolution: {integrity: sha512-BsmeeGgFwOGwo0g9Waprdyt+846n3KhKggZfpEnp5+sC4dE4uW1VIYpdyupMfr3bQcmX123q6TegfNP3eszrUA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/datepicker@3.16.1':
+ resolution: {integrity: sha512-BtAMDvxd1OZxkxjqq5tN5TYmp6Hm8+o3+IDA4qmem2/pfQfVbOZeWS2WitcPBImj4n4T+W1A5+PI7mT/6DUBVg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/disclosure@3.0.11':
+ resolution: {integrity: sha512-/KjB/0HkxGWbhFAPztCP411LUKZCx9k8cKukrlGqrUWyvrcXlmza90j0g/CuxACBoV+DJP9V+4q+8ide0x750A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/dnd@3.7.4':
+ resolution: {integrity: sha512-YD0TVR5JkvTqskc1ouBpVKs6t/QS4RYCIyu8Ug8RgO122iIizuf2pfKnRLjYMdu5lXzBXGaIgd49dvnLzEXHIw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/flags@3.1.2':
+ resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==}
+
+ '@react-stately/form@3.2.4':
+ resolution: {integrity: sha512-qNBzun8SbLdgahryhKLqL1eqP+MXY6as82sVXYOOvUYLzgU5uuN8mObxYlxJgMI5akSdQJQV3RzyfVobPRE7Kw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/grid@3.11.9':
+ resolution: {integrity: sha512-qQY6F+27iZRn30dt0ZOrSetUmbmNJ0pLe9Weuqw3+XDVSuWT+2O/rO1UUYeK+mO0Acjzdv+IWiYbu9RKf2wS9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/layout@4.6.0':
+ resolution: {integrity: sha512-kBenEsP03nh5rKgfqlVMPcoKTJv0v92CTvrAb5gYY8t9g8LOwzdL89Yannq7f5xv8LFck/MmRQlotpMt2InETg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/list@3.13.4':
+ resolution: {integrity: sha512-HHYSjA9VG7FPSAtpXAjQyM/V7qFHWGg88WmMrDt5QDlTBexwPuH0oFLnW0qaVZpAIxuWIsutZfxRAnme/NhhAA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/menu@3.9.11':
+ resolution: {integrity: sha512-vYkpO9uV2OUecsIkrOc+Urdl/s1xw/ibNH/UXsp4PtjMnS6mK9q2kXZTM3WvMAKoh12iveUO+YkYCZQshmFLHQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/numberfield@3.11.0':
+ resolution: {integrity: sha512-rxfC047vL0LP4tanjinfjKAriAvdVL57Um5RUL5nHML8IOWCB3TBxegQkJ6to6goScC/oZhd0/Y2LSaiRuKbNw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/overlays@3.6.23':
+ resolution: {integrity: sha512-RzWxots9A6gAzQMP4s8hOAHV7SbJRTFSlQbb6ly1nkWQXacOSZSFNGsKOaS0eIatfNPlNnW4NIkgtGws5UYzfw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/radio@3.11.5':
+ resolution: {integrity: sha512-QxA779S4ea5icQ0ja7CeiNzY1cj7c9G9TN0m7maAIGiTSinZl2Ia8naZJ0XcbRRp+LBll7RFEdekne15TjvS/w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/searchfield@3.5.19':
+ resolution: {integrity: sha512-URllgjbtTQEaOCfddbHpJSPKOzG3pE3ajQHJ7Df8qCoHTjKfL6hnm/vp7X5sxPaZaN7VLZ5kAQxTE8hpo6s0+A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/select@3.9.2':
+ resolution: {integrity: sha512-oWn0bijuusp8YI7FRM/wgtPVqiIrgU/ZUfLKe/qJUmT8D+JFaMAJnyrAzKpx98TrgamgtXynF78ccpopPhgrKQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/selection@3.20.9':
+ resolution: {integrity: sha512-RhxRR5Wovg9EVi3pq7gBPK2BoKmP59tOXDMh2r1PbnGevg/7TNdR67DCEblcmXwHuBNS46ELfKdd0XGHqmS8nQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/slider@3.7.5':
+ resolution: {integrity: sha512-OrQMNR5xamLYH52TXtvTgyw3EMwv+JI+1istQgEj1CHBjC9eZZqn5iNCN20tzm+uDPTH0EIGULFjjPIumqYUQg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/table@3.15.4':
+ resolution: {integrity: sha512-fGaNyw3wv7JgRCNzgyDzpaaTFuSy5f4Qekch4UheMXDJX7dOeaMhUXeOfvnXCVg+BGM4ey/D82RvDOGvPy1Nww==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/tabs@3.8.9':
+ resolution: {integrity: sha512-AQ4Xrn6YzIolaVShCV9cnwOjBKPAOGP/PTp7wpSEtQbQ0HZzUDG2RG/M4baMeUB2jZ33b7ifXyPcK78o0uOftg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/toast@3.1.3':
+ resolution: {integrity: sha512-mT9QJKmD523lqFpOp0VWZ6QHZENFK7HrodnNJDVc7g616s5GNmemdlkITV43fSY3tHeThCVvPu+Uzh7RvQ9mpQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/toggle@3.9.5':
+ resolution: {integrity: sha512-PVzXc788q3jH98Kvw1LYDL+wpVC14dCEKjOku8cSaqhEof6AJGaLR9yq+EF1yYSL2dxI6z8ghc0OozY8WrcFcA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/tooltip@3.5.11':
+ resolution: {integrity: sha512-o8PnFXbvDCuVZ4Ht9ahfS6KHwIZjXopvoQ2vUPxv920irdgWEeC+4omgDOnJ/xFvcpmmJAmSsrQsTQrTguDUQA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/tree@3.9.6':
+ resolution: {integrity: sha512-JCuhGyX2A+PAMsx2pRSwArfqNFZJ9JSPkDaOQJS8MFPAsBe5HemvXsdmv9aBIMzlbCYcVq6EsrFnzbVVTBt/6w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/utils@3.11.0':
+ resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/virtualizer@4.4.6':
+ resolution: {integrity: sha512-9SfXgLFB61/8SXNLfg5ARx9jAK4m03Aw6/Cg8mdZN24SYarL4TKNRpfw8K/HHVU/bi6WHSJypk6Z/z19o/ztrg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/autocomplete@3.0.0-alpha.36':
+ resolution: {integrity: sha512-J/wYkXom9zmEX/xuGjKrqMco9sf5AcByNXOgGAx82LMlk0jFcViggVjIYo/Qzr0TmDeTWyy++r1N59POI6179g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/breadcrumbs@3.7.19':
+ resolution: {integrity: sha512-AnkyYYmzaM2QFi/N0P/kQLM8tHOyFi7p397B/jEMucXDfwMw5Ny1ObCXeIEqbh8KrIa2Xp8SxmQlCV+8FPs4LA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/button@3.15.1':
+ resolution: {integrity: sha512-M1HtsKreJkigCnqceuIT22hDJBSStbPimnpmQmsl7SNyqCFY3+DHS7y/Sl3GvqCkzxF7j9UTL0dG38lGQ3K4xQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/calendar@3.8.3':
+ resolution: {integrity: sha512-fpH6WNXotzH0TlKHXXxtjeLZ7ko0sbyHmwDAwmDFyP7T0Iwn1YQZ+lhceLifvynlxuOgX6oBItyUKmkHQ0FouQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/checkbox@3.10.4':
+ resolution: {integrity: sha512-tYCG0Pd1usEz5hjvBEYcqcA0youx930Rss1QBIse9TgMekA1c2WmPDNupYV8phpO8Zuej3DL1WfBeXcgavK8aw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/color@3.1.4':
+ resolution: {integrity: sha512-s+Xj4pvNBlJPpQ1Gr7bO1j4/tuwMUfdS9xIVFuiW5RvDsSybKTUJ/gqPzTxms94VDCRhLFocVn2STNdD2Erf6A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/combobox@3.14.0':
+ resolution: {integrity: sha512-zmSSS7BcCOD8rGT8eGbVy7UlL5qq1vm88fFn4WgFe+lfK33ne+E7yTzTxcPY2TCGSo5fY6xMj3OG79FfVNGbSg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/datepicker@3.13.5':
+ resolution: {integrity: sha512-j28Vz+xvbb4bj7+9Xbpc4WTvSitlBvt7YEaEGM/8ZQ5g4Jr85H2KwkmDwjzmMN2r6VMQMMYq9JEcemq5wWpfUQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/dialog@3.5.24':
+ resolution: {integrity: sha512-NFurEP/zV0dA/41422lV1t+0oh6f/13n+VmLHZG8R13m1J3ql/kAXZ49zBSqkqANBO1ojyugWebk99IiR4pYOw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/form@3.7.18':
+ resolution: {integrity: sha512-0sBJW0+I9nJcF4SmKrYFEWAlehiebSTy7xqriqAXtqfTEdvzAYLGaAK2/7gx+wlNZeDTdW43CDRJ4XAhyhBqnw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/grid@3.3.8':
+ resolution: {integrity: sha512-zJvXH8gc1e1VH2H3LRnHH/W2HIkLkZMH3Cu5pLcj0vDuLBSWpcr3Ikh3jZ+VUOZF0G1Jt1lO8pKIaqFzDLNmLQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/link@3.6.7':
+ resolution: {integrity: sha512-1apXCFJgMC1uydc2KNENrps1qR642FqDpwlNWe254UTpRZn/hEZhA6ImVr8WhomfLJu672WyWA0rUOv4HT+/pQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/listbox@3.7.6':
+ resolution: {integrity: sha512-335NYElKEByXMalAmeRPyulKIDd2cjOCQhLwvv2BtxO5zaJfZnBbhZs+XPd9zwU6YomyOxODKSHrwbNDx+Jf3w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/menu@3.10.7':
+ resolution: {integrity: sha512-+p7ixZdvPDJZhisqdtWiiuJ9pteNfK5i19NB6wzAw5XkljbEzodNhwLv6rI96DY5XpbFso2kcjw7IWi+rAAGGQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/meter@3.4.15':
+ resolution: {integrity: sha512-9WjNphhLLM+TA4Ev1y2MkpugJ5JjTXseHh7ZWWx2veq5DrXMZYclkRpfUrUdLVKvaBIPQCgpQIj0TcQi+quR9A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/numberfield@3.8.18':
+ resolution: {integrity: sha512-nLzk7YAG9yAUtSv+9R8LgCHsu8hJq8/A+m1KsKxvc8WmNJjIujSFgWvT21MWBiUgPBzJKGzAqpMDDa087mltJQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/overlays@3.9.4':
+ resolution: {integrity: sha512-7Z9HaebMFyYBqtv3XVNHEmVkm7AiYviV7gv0c98elEN2Co+eQcKFGvwBM9Gy/lV57zlTqFX1EX/SAqkMEbCLOA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/progress@3.5.18':
+ resolution: {integrity: sha512-mKeQn+KrHr1y0/k7KtrbeDGDaERH6i4f6yBwj/ZtYDCTNKMO3tPHJY6nzF0w/KKZLplIO+BjUbHXc2RVm8ovwQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/radio@3.9.4':
+ resolution: {integrity: sha512-TkMRY3sA1PcFZhhclu4IUzUTIir6MzNJj8h6WT8vO6Nug2kXJ72qigugVFBWJSE472mltduOErEAo0rtAYWbQA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/searchfield@3.6.8':
+ resolution: {integrity: sha512-M2p7OVdMTMDmlBcHd4N2uCBwg3uJSNM4lmEyf09YD44N5wDAI0yogk52QBwsnhpe+i2s65UwCYgunB+QltRX8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/select@3.12.2':
+ resolution: {integrity: sha512-AseOjfr3qM1W1qIWcbAe6NFpwZluVeQX/dmu9BYxjcnVvtoBLPMbE5zX/BPbv+N5eFYjoMyj7Ug9dqnI+LrlGw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/shared@3.33.0':
+ resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/shared@3.33.1':
+ resolution: {integrity: sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/slider@3.8.4':
+ resolution: {integrity: sha512-C+xFVvfKREai9S/ekBDCVaGPOQYkNUAsQhjQnNsUAATaox4I6IYLmcIgLmljpMQWqAe+gZiWsIwacRYMez2Tew==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/switch@3.5.17':
+ resolution: {integrity: sha512-2GTPJvBCYI8YZ3oerHtXg+qikabIXCMJ6C2wcIJ5Xn0k9XOovowghfJi10OPB2GGyOiLBU74CczP5nx8adG90Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/table@3.13.6':
+ resolution: {integrity: sha512-eluL+iFfnVmFm7OSZrrFG9AUjw+tcv898zbv+NsZACa8oXG1v9AimhZfd+Mo8q/5+sX/9hguWNXFkSvmTjuVPQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/tabs@3.3.22':
+ resolution: {integrity: sha512-HGwLD9dA3k3AGfRKGFBhNgxU9/LyRmxN0kxVj1ghA4L9S/qTOzS6GhrGNkGzsGxyVLV4JN8MLxjWN2o9QHnLEg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/textfield@3.12.8':
+ resolution: {integrity: sha512-wt6FcuE5AyntxsnPika/h3nf/DPmeAVbI018L9o6h+B/IL4sMWWdx663wx2KOOeHH8ejKGZQNPLhUKs4s1mVQA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/tooltip@3.5.2':
+ resolution: {integrity: sha512-FvSuZ2WP08NEWefrpCdBYpEEZh/5TvqvGjq0wqGzWg2OPwpc14HjD8aE7I3MOuylXkD4MSlMjl7J4DlvlcCs3Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
'@redis/bloom@1.2.0':
resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==}
peerDependencies:
@@ -2049,6 +2473,19 @@ packages:
rollup:
optional: true
+ '@rollup/plugin-typescript@12.3.0':
+ resolution: {integrity: sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^2.14.0||^3.0.0||^4.0.0
+ tslib: '*'
+ typescript: '>=3.7.0'
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ tslib:
+ optional: true
+
'@rollup/pluginutils@5.2.0':
resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==}
engines: {node: '>=14.0.0'}
@@ -2058,21 +2495,156 @@ packages:
rollup:
optional: true
- '@rtsao/scc@1.1.0':
- resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+ '@rollup/rollup-android-arm-eabi@4.60.1':
+ resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==}
+ cpu: [arm]
+ os: [android]
- '@rushstack/eslint-patch@1.12.0':
- resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==}
+ '@rollup/rollup-android-arm64@4.60.1':
+ resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.60.1':
+ resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.60.1':
+ resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.60.1':
+ resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.60.1':
+ resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
+ resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.60.1':
+ resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.60.1':
+ resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.60.1':
+ resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.60.1':
+ resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-musl@4.60.1':
+ resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.60.1':
+ resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-musl@4.60.1':
+ resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.60.1':
+ resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.60.1':
+ resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.60.1':
+ resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.60.1':
+ resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.60.1':
+ resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openbsd-x64@4.60.1':
+ resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.60.1':
+ resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.60.1':
+ resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.60.1':
+ resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.60.1':
+ resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.60.1':
+ resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rrweb/types@2.0.0-alpha.20':
+ resolution: {integrity: sha512-RbnDgKxA/odwB1R4gF7eUUj+rdSrq6ROQJsnMw7MIsGzlbSYvJeZN8YY4XqU0G6sKJvXI6bSzk7w/G94jNwzhw==}
+
+ '@schummar/icu-type-parser@1.21.5':
+ resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==}
'@sinclair/typebox@0.27.8':
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ '@sinclair/typebox@0.34.40':
+ resolution: {integrity: sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==}
+
+ '@sindresorhus/merge-streams@2.3.0':
+ resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
+ engines: {node: '>=18'}
+
'@sinonjs/commons@3.0.1':
resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
'@sinonjs/fake-timers@10.3.0':
resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
'@svgr/babel-plugin-add-jsx-attribute@8.0.0':
resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
engines: {node: '>=14'}
@@ -2127,6 +2699,11 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@svgr/cli@8.1.0':
+ resolution: {integrity: sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==}
+ engines: {node: '>=14'}
+ hasBin: true
+
'@svgr/core@8.1.0':
resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
engines: {node: '>=14'}
@@ -2141,28 +2718,107 @@ packages:
peerDependencies:
'@svgr/core': '*'
+ '@svgr/plugin-prettier@8.1.0':
+ resolution: {integrity: sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
'@svgr/plugin-svgo@8.1.0':
resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==}
engines: {node: '>=14'}
peerDependencies:
'@svgr/core': '*'
- '@svgr/rollup@8.1.0':
- resolution: {integrity: sha512-0XR1poYvPQoPpmfDYLEqUGu5ePAQ4pdgN3VFsZBNAeze7qubVpsIY1o1R6PZpKep/DKu33GSm2NhwpCLkMs2Cw==}
- engines: {node: '>=14'}
+ '@swc/core-darwin-arm64@1.15.11':
+ resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [darwin]
- '@svgr/webpack@8.1.0':
- resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==}
- engines: {node: '>=14'}
+ '@swc/core-darwin-x64@1.15.11':
+ resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@swc/core-linux-arm-gnueabihf@1.15.11':
+ resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==}
+ engines: {node: '>=10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@swc/core-linux-arm64-gnu@1.15.11':
+ resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-arm64-musl@1.15.11':
+ resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-x64-gnu@1.15.11':
+ resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-linux-x64-musl@1.15.11':
+ resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-win32-arm64-msvc@1.15.11':
+ resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@swc/core-win32-ia32-msvc@1.15.11':
+ resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==}
+ engines: {node: '>=10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@swc/core-win32-x64-msvc@1.15.11':
+ resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@swc/core@1.15.11':
+ resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@swc/helpers': '>=0.5.17'
+ peerDependenciesMeta:
+ '@swc/helpers':
+ optional: true
+
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@tanstack/query-core@5.83.0':
- resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==}
+ '@swc/helpers@0.5.18':
+ resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==}
- '@tanstack/react-query@5.83.0':
- resolution: {integrity: sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==}
+ '@swc/helpers@0.5.20':
+ resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==}
+
+ '@swc/types@0.1.25':
+ resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==}
+
+ '@tanstack/query-core@5.96.0':
+ resolution: {integrity: sha512-sfO3uQeol1BU7cRP6NYY7nAiX3GiNY20lI/dtSbKLwcIkYw/X+w/tEsQAkc544AfIhBX/IvH/QYtPHrPhyAKGw==}
+
+ '@tanstack/react-query@5.96.0':
+ resolution: {integrity: sha512-6qbjdm1K5kizVKv9TNqhIN3doq2anRhdF2XaFMFSn4m8L22S69RV+FilvlyVT4RoJyMxtPU5rs4RpdFa/PEC7A==}
peerDependencies:
react: ^18 || ^19
@@ -2170,6 +2826,9 @@ packages:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
+ '@ts-morph/common@0.28.1':
+ resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==}
+
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@@ -2182,8 +2841,8 @@ packages:
'@tsconfig/node16@1.0.4':
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
- '@tybys/wasm-util@0.10.0':
- resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==}
+ '@tsconfig/svelte@1.0.13':
+ resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==}
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -2194,11 +2853,11 @@ packages:
'@types/babel__template@7.4.4':
resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
- '@types/babel__traverse@7.20.7':
- resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
- '@types/estree@0.0.50':
- resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==}
+ '@types/css-font-loading-module@0.0.7':
+ resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==}
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -2206,18 +2865,12 @@ packages:
'@types/fs-extra@8.1.5':
resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==}
- '@types/fs-extra@9.0.13':
- resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
-
'@types/glob@7.2.0':
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
'@types/graceful-fs@4.1.9':
resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
- '@types/hoist-non-react-statics@3.3.6':
- resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==}
-
'@types/istanbul-lib-coverage@2.0.6':
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
@@ -2227,62 +2880,33 @@ packages:
'@types/istanbul-reports@3.0.4':
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
- '@types/jest@29.5.14':
- resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
+ '@types/jest@30.0.0':
+ resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
- '@types/json-stable-stringify@1.2.0':
- resolution: {integrity: sha512-PEHY3ohqolHqAzDyB1+31tFaAMnoLN7x/JgdcGmNZ2uvtEJ6rlFCUYNQc0Xe754xxCYLNGZbLUGydSE6tS4S9A==}
- deprecated: This is a stub types definition. json-stable-stringify provides its own type definitions, so you do not need this installed.
-
- '@types/json5@0.0.29':
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
-
'@types/minimatch@6.0.0':
resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==}
deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.
- '@types/minimist@1.2.5':
- resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+ '@types/node@24.12.0':
+ resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==}
- '@types/node@14.18.63':
- resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
+ '@types/pg@8.20.0':
+ resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==}
- '@types/node@22.16.5':
- resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==}
-
- '@types/normalize-package-data@2.4.4':
- resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
-
- '@types/prop-types@15.7.15':
- resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
-
- '@types/react-dom@19.1.6':
- resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==}
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
- '@types/react': ^19.0.0
+ '@types/react': ^19.2.0
- '@types/react-window@1.8.8':
- resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==}
-
- '@types/react@18.3.23':
- resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==}
-
- '@types/react@19.1.8':
- resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==}
+ '@types/react@19.2.14':
+ resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
- '@types/schema-utils@2.4.0':
- resolution: {integrity: sha512-454hrj5gz/FXcUE20ygfEiN4DxZ1sprUo0V1gqIqkNZ/CzoEzAZEll2uxMsuyz6BYjiQan4Aa65xbTemfzW9hQ==}
- deprecated: This is a stub types definition. schema-utils provides its own type definitions, so you do not need this installed.
-
- '@types/semver@7.7.0':
- resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
-
'@types/sinonjs__fake-timers@8.1.1':
resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
@@ -2304,225 +2928,15 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- '@typescript-eslint/eslint-plugin@6.21.0':
- resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
- engines: {node: ^16.0.0 || >=18.0.0}
+ '@umami/react-zen@0.245.0':
+ resolution: {integrity: sha512-UApl8fDJM6VDaDOc8I67sdClzLpp4e9eJB3ntf6rlUgvdllf5T+hdYiHJ98T/tDFfhZWBKuLhnVDX/qNfjlrSw==}
peerDependencies:
- '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ react: ^18.0.0 || ^19.0.0
+ react-aria-components: ^1.0.0
+ react-dom: ^18.0.0 || ^19.0.0
- '@typescript-eslint/parser@6.21.0':
- resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/scope-manager@5.62.0':
- resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/scope-manager@6.21.0':
- resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@typescript-eslint/type-utils@6.21.0':
- resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/types@5.62.0':
- resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/types@6.21.0':
- resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@typescript-eslint/typescript-estree@5.62.0':
- resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/typescript-estree@6.21.0':
- resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/utils@5.62.0':
- resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- '@typescript-eslint/utils@6.21.0':
- resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
-
- '@typescript-eslint/visitor-keys@5.62.0':
- resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/visitor-keys@6.21.0':
- resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@umami/redis-client@0.26.0':
- resolution: {integrity: sha512-j2vxb1gYF5zfk7BkrHgau2MwKsB5ijbQh2w1WoIvbP41cqTMsFm/zUrjhZ0cP1ZxR/riQR1AWxKmqNggYRZ5eA==}
-
- '@ungap/structured-clone@1.3.0':
- resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
-
- '@unrs/resolver-binding-android-arm-eabi@1.11.1':
- resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
- cpu: [arm]
- os: [android]
-
- '@unrs/resolver-binding-android-arm64@1.11.1':
- resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
- cpu: [arm64]
- os: [android]
-
- '@unrs/resolver-binding-darwin-arm64@1.11.1':
- resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
- cpu: [arm64]
- os: [darwin]
-
- '@unrs/resolver-binding-darwin-x64@1.11.1':
- resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
- cpu: [x64]
- os: [darwin]
-
- '@unrs/resolver-binding-freebsd-x64@1.11.1':
- resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
- cpu: [x64]
- os: [freebsd]
-
- '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
- resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
- cpu: [arm]
- os: [linux]
-
- '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
- resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
- cpu: [arm]
- os: [linux]
-
- '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
- resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
- cpu: [arm64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
- resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
- cpu: [arm64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
- resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
- cpu: [ppc64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
- resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
- cpu: [riscv64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
- resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
- cpu: [riscv64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
- resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
- cpu: [s390x]
- os: [linux]
-
- '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
- resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
- cpu: [x64]
- os: [linux]
-
- '@unrs/resolver-binding-linux-x64-musl@1.11.1':
- resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
- cpu: [x64]
- os: [linux]
-
- '@unrs/resolver-binding-wasm32-wasi@1.11.1':
- resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
-
- '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
- resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
- cpu: [arm64]
- os: [win32]
-
- '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
- resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
- cpu: [ia32]
- os: [win32]
-
- '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
- resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
- cpu: [x64]
- os: [win32]
-
- '@vue/compiler-core@3.5.17':
- resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==}
-
- '@vue/compiler-dom@3.5.17':
- resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==}
-
- '@vue/compiler-sfc@3.5.17':
- resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==}
-
- '@vue/compiler-ssr@3.5.17':
- resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==}
-
- '@vue/reactivity@3.5.17':
- resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==}
-
- '@vue/runtime-core@3.5.17':
- resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==}
-
- '@vue/runtime-dom@3.5.17':
- resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==}
-
- '@vue/server-renderer@3.5.17':
- resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==}
- peerDependencies:
- vue: 3.5.17
-
- '@vue/shared@3.5.17':
- resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==}
-
- acorn-jsx@5.3.2:
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ '@xstate/fsm@1.6.5':
+ resolution: {integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==}
acorn-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
@@ -2537,16 +2951,8 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
- ajv-keywords@3.5.2:
- resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
- peerDependencies:
- ajv: ^6.9.1
-
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
- ajv@8.17.1:
- resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
@@ -2556,16 +2962,12 @@ packages:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
- ansi-escapes@5.0.0:
- resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==}
- engines: {node: '>=12'}
-
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.1.0:
- resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
ansi-styles@3.2.1:
@@ -2580,10 +2982,13 @@ packages:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
- ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
@@ -2600,54 +3005,18 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- aria-query@5.3.2:
- resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
- engines: {node: '>= 0.4'}
-
array-buffer-byte-length@1.0.2:
resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
engines: {node: '>= 0.4'}
- array-find-index@1.0.2:
- resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==}
- engines: {node: '>=0.10.0'}
-
- array-includes@3.1.9:
- resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
- engines: {node: '>= 0.4'}
-
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
- array.prototype.findlast@1.2.5:
- resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
- engines: {node: '>= 0.4'}
-
- array.prototype.findlastindex@1.2.6:
- resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flat@1.3.3:
- resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flatmap@1.3.3:
- resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.tosorted@1.1.4:
- resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
- engines: {node: '>= 0.4'}
-
arraybuffer.prototype.slice@1.0.4:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
- arrify@1.0.1:
- resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
- engines: {node: '>=0.10.0'}
-
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
@@ -2655,9 +3024,6 @@ packages:
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
engines: {node: '>=0.8'}
- ast-types-flow@0.0.8:
- resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
-
astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
@@ -2690,17 +3056,13 @@ packages:
aws-sign2@0.7.0:
resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+ aws-ssl-profiles@1.1.2:
+ resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
+ engines: {node: '>= 6.0.0'}
+
aws4@1.13.2:
resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
- axe-core@4.10.3:
- resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==}
- engines: {node: '>=4'}
-
- axobject-query@4.1.0:
- resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
- engines: {node: '>= 0.4'}
-
babel-jest@29.7.0:
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2715,29 +3077,13 @@ packages:
resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- babel-plugin-polyfill-corejs2@0.4.14:
- resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ babel-plugin-react-compiler@19.1.0-rc.2:
+ resolution: {integrity: sha512-kSNA//p5fMO6ypG8EkEVPIqAjwIXm5tMjfD1XRPL/sRjYSbJ6UsvORfaeolNWnZ9n310aM0xJP7peW26BuCVzA==}
- babel-plugin-polyfill-corejs3@0.13.0:
- resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==}
+ babel-preset-current-node-syntax@1.2.0:
+ resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==}
peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-
- babel-plugin-polyfill-regenerator@0.6.5:
- resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-
- babel-plugin-react-intl@7.9.4:
- resolution: {integrity: sha512-cMKrHEXrw43yT4M89Wbgq8A8N8lffSquj1Piwov/HVukR7jwOw8gf9btXNsQhT27ccyqEwy+M286JQYy0jby2g==}
- deprecated: this package has been renamed to babel-plugin-formatjs
-
- babel-preset-current-node-syntax@1.1.0:
- resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
- peerDependencies:
- '@babel/core': ^7.0.0
+ '@babel/core': ^7.0.0 || ^8.0.0-0
babel-preset-jest@29.6.3:
resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
@@ -2748,17 +3094,28 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- balanced-match@2.0.0:
- resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+ base64-arraybuffer@1.0.2:
+ resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
+ engines: {node: '>= 0.6.0'}
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.10.12:
+ resolution: {integrity: sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
- bcryptjs@2.4.3:
- resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
+ bcryptjs@3.0.3:
+ resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==}
+ hasBin: true
+
+ better-result@2.7.0:
+ resolution: {integrity: sha512-7zrmXjAK8u8Z6SOe4R65XObOR5X+Y2I/VVku3t5cPOGQ8/WsBcfFmfnIPiEl5EBMDOzPHRwbiPbMtQBKYdw7RA==}
+ hasBin: true
blob-util@2.0.2:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
@@ -2779,8 +3136,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.25.1:
- resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==}
+ browserslist@4.25.2:
+ resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -2803,6 +3160,24 @@ packages:
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ bundle-require@5.1.0:
+ resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ peerDependencies:
+ esbuild: '>=0.18'
+
+ c12@3.1.0:
+ resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
+ peerDependencies:
+ magicast: ^0.3.5
+ peerDependenciesMeta:
+ magicast:
+ optional: true
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
engines: {node: '>=6'}
@@ -2823,14 +3198,6 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- camelcase-keys@6.2.2:
- resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
- engines: {node: '>=8'}
-
- camelcase-keys@7.0.2:
- resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==}
- engines: {node: '>=12'}
-
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
@@ -2842,8 +3209,11 @@ packages:
caniuse-api@3.0.0:
resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
- caniuse-lite@1.0.30001743:
- resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==}
+ caniuse-lite@1.0.30001780:
+ resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==}
+
+ caniuse-lite@1.0.30001781:
+ resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==}
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -2856,19 +3226,16 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- chalk@5.3.0:
- resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
char-regex@1.0.2:
resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
engines: {node: '>=10'}
- charenc@0.0.2:
- resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
-
- chart.js@4.5.0:
- resolution: {integrity: sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==}
+ chart.js@4.5.1:
+ resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==}
engines: {pnpm: '>=8'}
chartjs-adapter-date-fns@3.0.0:
@@ -2881,9 +3248,13 @@ packages:
resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
engines: {node: '>= 0.8.0'}
- chownr@2.0.0:
- resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
- engines: {node: '>=10'}
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chownr@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
@@ -2893,6 +3264,12 @@ packages:
resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==}
engines: {node: '>=8'}
+ citty@0.1.6:
+ resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+ citty@0.2.1:
+ resolution: {integrity: sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==}
+
cjs-module-lexer@1.4.3:
resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
@@ -2907,10 +3284,6 @@ packages:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
- cli-cursor@4.0.0:
- resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
cli-table3@0.6.5:
resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
engines: {node: 10.* || >= 12.*}
@@ -2919,10 +3292,6 @@ packages:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
- cli-truncate@3.1.0:
- resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
@@ -2930,6 +3299,10 @@ packages:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
cluster-key-slot@1.1.2:
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
engines: {node: '>=0.10.0'}
@@ -2938,6 +3311,9 @@ packages:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ code-block-writer@13.0.3:
+ resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==}
+
collect-v8-coverage@1.0.2:
resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
@@ -2967,13 +3343,13 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
- commander@11.0.0:
- resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==}
- engines: {node: '>=16'}
-
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
commander@6.2.1:
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
@@ -2982,9 +3358,9 @@ packages:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
- commander@8.3.0:
- resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
- engines: {node: '>= 12'}
+ commander@9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
common-tags@1.8.2:
resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
@@ -2999,17 +3375,27 @@ packages:
concat-with-sourcemaps@1.1.0:
resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==}
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- core-js-compat@3.44.0:
- resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==}
-
core-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
- cors@2.8.5:
- resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cors@2.8.6:
+ resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
engines: {node: '>= 0.10'}
cosmiconfig@8.3.6:
@@ -3029,9 +3415,9 @@ packages:
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
- cross-env@7.0.3:
- resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
- engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+ cross-env@10.1.0:
+ resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
+ engines: {node: '>=20'}
hasBin: true
cross-spawn@6.0.6:
@@ -3042,9 +3428,6 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
- crypt@0.0.2:
- resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
-
css-blank-pseudo@3.0.3:
resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==}
engines: {node: ^12 || ^14 || >=16}
@@ -3061,10 +3444,6 @@ packages:
peerDependencies:
postcss: ^8.0.9
- css-functions-list@3.2.3:
- resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
- engines: {node: '>=12 || >=16'}
-
css-has-pseudo@3.0.4:
resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==}
engines: {node: ^12 || ^14 || >=16}
@@ -3139,12 +3518,8 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
- currently-unhandled@0.4.1:
- resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
- engines: {node: '>=0.10.0'}
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
cypress@13.17.0:
resolution: {integrity: sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==}
@@ -3186,13 +3561,14 @@ packages:
d3-zoom@2.0.0:
resolution: {integrity: sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==}
- damerau-levenshtein@1.0.8:
- resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
-
dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
+ dashify@2.0.0:
+ resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==}
+ engines: {node: '>=4'}
+
data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
@@ -3229,8 +3605,8 @@ packages:
supports-color:
optional: true
- debug@4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -3238,26 +3614,8 @@ packages:
supports-color:
optional: true
- debug@4.4.1:
- resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- decamelize-keys@1.1.1:
- resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
- engines: {node: '>=0.10.0'}
-
- decamelize@1.2.0:
- resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
- engines: {node: '>=0.10.0'}
-
- decamelize@5.0.1:
- resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
- engines: {node: '>=10'}
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
dedent@1.6.0:
resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==}
@@ -3267,8 +3625,9 @@ packages:
babel-plugin-macros:
optional: true
- deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ deepmerge-ts@7.1.5:
+ resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==}
+ engines: {node: '>=16.0.0'}
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
@@ -3282,23 +3641,36 @@ packages:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
del@6.1.1:
resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
engines: {node: '>=10'}
+ del@8.0.1:
+ resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==}
+ engines: {node: '>=18'}
+
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
+ denque@2.1.0:
+ resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+ engines: {node: '>=0.10'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
detect-browser@5.3.0:
resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==}
- detect-indent@6.1.0:
- resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
- engines: {node: '>=8'}
+ detect-europe-js@0.1.2:
+ resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==}
- detect-libc@2.1.0:
- resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
detect-newline@3.1.0:
@@ -3317,14 +3689,6 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
- doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
-
- doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
-
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
@@ -3351,9 +3715,21 @@ packages:
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
- dotenv@10.0.0:
- resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
- engines: {node: '>=10'}
+ dotenv-cli@11.0.0:
+ resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==}
+ hasBin: true
+
+ dotenv-expand@12.0.3:
+ resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotenv@17.3.1:
+ resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==}
+ engines: {node: '>=12'}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
@@ -3368,13 +3744,11 @@ packages:
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
- ejs@3.1.10:
- resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
- engines: {node: '>=0.10.0'}
- hasBin: true
+ effect@3.20.0:
+ resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==}
- electron-to-chromium@1.5.187:
- resolution: {integrity: sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==}
+ electron-to-chromium@1.5.202:
+ resolution: {integrity: sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg==}
emittery@0.13.1:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
@@ -3386,6 +3760,10 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ empathic@2.0.0:
+ resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+ engines: {node: '>=14'}
+
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
@@ -3400,6 +3778,10 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
+ env-paths@3.0.0:
+ resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
@@ -3415,13 +3797,6 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-iterator-helpers@1.2.1:
- resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
- engines: {node: '>= 0.4'}
-
- es-module-lexer@1.7.0:
- resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
-
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
@@ -3430,21 +3805,12 @@ packages:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
- es-shim-unscopables@1.1.0:
- resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
- engines: {node: '>= 0.4'}
-
es-to-primitive@1.3.0:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild-register@3.6.0:
- resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
- peerDependencies:
- esbuild: '>=0.12 <1'
-
- esbuild@0.25.8:
- resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==}
+ esbuild@0.27.4:
+ resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==}
engines: {node: '>=18'}
hasBin: true
@@ -3460,199 +3826,23 @@ packages:
resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
engines: {node: '>=8'}
- escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
-
- eslint-config-next@14.2.30:
- resolution: {integrity: sha512-4pTMb3wfpI+piVeEz3TWG1spjuXJJBZaYabi2H08z2ZTk6/N304POEovHdFmK6EZb4QlKpETulBNaRIITA0+xg==}
- peerDependencies:
- eslint: ^7.23.0 || ^8.0.0
- typescript: '>=3.3.1'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- eslint-config-prettier@8.10.2:
- resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
-
- eslint-import-resolver-alias@1.1.2:
- resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==}
- engines: {node: '>= 4'}
- peerDependencies:
- eslint-plugin-import: '>=1.4.0'
-
- eslint-import-resolver-node@0.3.9:
- resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
-
- eslint-import-resolver-typescript@3.10.1:
- resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- eslint: '*'
- eslint-plugin-import: '*'
- eslint-plugin-import-x: '*'
- peerDependenciesMeta:
- eslint-plugin-import:
- optional: true
- eslint-plugin-import-x:
- optional: true
-
- eslint-module-utils@2.12.1:
- resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint:
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
-
- eslint-plugin-css-modules@2.12.0:
- resolution: {integrity: sha512-ruFBdad69ABrbCDCh5mXj7UzNmrvytfzPACjyvZWIAjFZAG8BXpYSbqmE8gU5wF+pIzV3jU2CWhLvfekXT/IgQ==}
- engines: {node: '>=4.0.0'}
- peerDependencies:
- eslint: '>=2.0.0'
-
- eslint-plugin-cypress@2.15.2:
- resolution: {integrity: sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==}
- peerDependencies:
- eslint: '>= 3.2.1'
-
- eslint-plugin-import@2.32.0:
- resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
-
- eslint-plugin-jest@27.9.0:
- resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0
- eslint: ^7.0.0 || ^8.0.0
- jest: '*'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
- jest:
- optional: true
-
- eslint-plugin-jsx-a11y@6.10.2:
- resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
- engines: {node: '>=4.0'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
-
- eslint-plugin-prettier@4.2.5:
- resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==}
- engines: {node: '>=12.0.0'}
- peerDependencies:
- eslint: '>=7.28.0'
- eslint-config-prettier: '*'
- prettier: '>=2.0.0'
- peerDependenciesMeta:
- eslint-config-prettier:
- optional: true
-
- eslint-plugin-promise@6.6.0:
- resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
-
- eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705:
- resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-
- eslint-plugin-react@7.37.5:
- resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
-
- eslint-scope@5.1.1:
- resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
- engines: {node: '>=8.0.0'}
-
- eslint-scope@7.2.2:
- resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint-visitor-keys@3.4.3:
- resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint@8.57.1:
- resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
- hasBin: true
-
- espree@9.6.1:
- resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
- esquery@1.6.0:
- resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
- engines: {node: '>=0.10'}
-
- esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
-
- estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
- engines: {node: '>=4.0'}
-
- estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
-
estree-walker@0.6.1:
resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
-
eventemitter2@6.4.7:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
- eventemitter3@5.0.1:
- resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
-
execa@4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
@@ -3661,10 +3851,6 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
- execa@7.2.0:
- resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
- engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
-
executable@4.1.1:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'}
@@ -3677,14 +3863,16 @@ packages:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ expect@30.1.1:
+ resolution: {integrity: sha512-OKe7cdic4qbfWd/CcgwJvvCrNX2KWfuMZee9AfJHL1gTYmvqjBjZG1a2NwfhspBzxzlXwsN75WWpKTYfsJpBxg==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- extract-react-intl-messages@4.1.1:
- resolution: {integrity: sha512-dPogci5X7HVtV7VbUxajH/1YgfNRaW2VtEiVidZ/31Tq8314uzOtzVMNo0IrAPD2E+H1wHoPiu/j565TZsyIZg==}
- engines: {node: '>=10'}
- hasBin: true
-
extract-zip@2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
@@ -3694,12 +3882,13 @@ packages:
resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
engines: {'0': node >=0.6.0}
+ fast-check@3.23.2:
+ resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
+ engines: {node: '>=8.0.0'}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- fast-diff@1.3.0:
- resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
-
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
@@ -3707,15 +3896,8 @@ packages:
fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
- fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-
- fast-uri@3.0.6:
- resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
-
- fastest-levenshtein@1.0.16:
- resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
- engines: {node: '>= 4.9.1'}
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
@@ -3726,8 +3908,9 @@ packages:
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
- fdir@6.4.6:
- resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
@@ -3738,21 +3921,13 @@ packages:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
+ fflate@0.4.8:
+ resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
+
figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
- file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- file-entry-cache@7.0.2:
- resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==}
- engines: {node: '>=12.0.0'}
-
- filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
-
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
@@ -3761,20 +3936,8 @@ packages:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
- find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
-
- flat-cache@3.2.0:
- resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- flat@5.0.2:
- resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
- hasBin: true
-
- flatted@3.3.3:
- resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+ fix-dts-default-cjs-exports@1.0.1:
+ resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==}
for-each@0.3.5:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
@@ -3798,10 +3961,6 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
- fs-extra@10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
-
fs-extra@8.1.0:
resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
engines: {node: '>=6 <7 || >=8'}
@@ -3810,10 +3969,6 @@ packages:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
- fs-minipass@2.1.0:
- resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
- engines: {node: '>= 8'}
-
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -3832,6 +3987,9 @@ packages:
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ generate-function@2.3.1:
+ resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+
generic-names@4.0.0:
resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
@@ -3855,6 +4013,9 @@ packages:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
+ get-port-please@3.2.0:
+ resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==}
+
get-proto@1.0.1:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
@@ -3871,8 +4032,8 @@ packages:
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
engines: {node: '>= 0.4'}
- get-tsconfig@4.10.1:
- resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
+ get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
getos@3.2.1:
resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
@@ -3880,44 +4041,32 @@ packages:
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+ giget@2.0.0:
+ resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+ hasBin: true
+
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
- glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
-
- glob@10.3.10:
- resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
- engines: {node: '>=16 || 14 >=14.17'}
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
glob@8.1.0:
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
engines: {node: '>=12'}
- deprecated: Glob versions prior to v9 are no longer supported
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
global-dirs@3.0.1:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
- global-modules@2.0.0:
- resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
- engines: {node: '>=6'}
-
- global-prefix@3.0.0:
- resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
- engines: {node: '>=6'}
-
- globals@13.24.0:
- resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
- engines: {node: '>=8'}
-
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
@@ -3930,13 +4079,9 @@ packages:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
- globjoin@0.1.4:
- resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
-
- gonzales-pe@4.3.0:
- resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==}
- engines: {node: '>=0.6.0'}
- hasBin: true
+ globby@14.1.0:
+ resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==}
+ engines: {node: '>=18'}
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
@@ -3945,12 +4090,16 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ grammex@3.1.12:
+ resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==}
- hard-rejection@2.1.0:
- resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
- engines: {node: '>=6'}
+ graphmatch@1.1.1:
+ resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==}
+
+ handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
has-bigints@1.1.0:
resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
@@ -3983,27 +4132,23 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
- hoist-non-react-statics@3.3.2:
- resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ hono@4.12.9:
+ resolution: {integrity: sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==}
+ engines: {node: '>=16.9.0'}
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
- hosted-git-info@4.1.0:
- resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
- engines: {node: '>=10'}
-
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
- html-tags@3.3.1:
- resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
- engines: {node: '>=8'}
-
http-signature@1.4.0:
resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==}
engines: {node: '>=0.10'}
+ http-status-codes@2.3.0:
+ resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==}
+
human-signals@1.1.1:
resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
engines: {node: '>=8.12.0'}
@@ -4012,14 +4157,9 @@ packages:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
- human-signals@4.3.1:
- resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
- engines: {node: '>=14.18.0'}
-
- husky@8.0.3:
- resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
- engines: {node: '>=14'}
- hasBin: true
+ iconv-lite@0.7.2:
+ resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ engines: {node: '>=0.10.0'}
icss-replace-symbols@1.1.0:
resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
@@ -4030,6 +4170,9 @@ packages:
peerDependencies:
postcss: ^8.1.0
+ icu-minify@4.8.4:
+ resolution: {integrity: sha512-lRfPX67iofadgfhMvjs37GqLB8ErDaNERte2XNpm69bP10D6RFV/tAWYX0lEBwsdLWxpliKVh2TT4NEa63yuWw==}
+
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
@@ -4037,11 +4180,15 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
immediate@3.0.6:
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
- immer@9.0.21:
- resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+ immer@11.1.4:
+ resolution: {integrity: sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==}
import-cwd@3.0.0:
resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==}
@@ -4055,10 +4202,6 @@ packages:
resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==}
engines: {node: '>=8'}
- import-lazy@4.0.0:
- resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
- engines: {node: '>=8'}
-
import-local@3.2.0:
resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
engines: {node: '>=8'}
@@ -4072,10 +4215,6 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
- indent-string@5.0.0:
- resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
- engines: {node: '>=12'}
-
inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
@@ -4083,9 +4222,6 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- ini@1.3.8:
- resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-
ini@2.0.0:
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
engines: {node: '>=10'}
@@ -4097,19 +4233,14 @@ packages:
internmap@1.0.1:
resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
- intl-messageformat-parser@5.5.1:
- resolution: {integrity: sha512-TvB3LqF2VtP6yI6HXlRT5TxX98HKha6hCcrg9dwlPwNaedVNuQA9KgBdtWKgiyakyCTYHQ+KJeFEstNKfZr64w==}
- deprecated: We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser
+ intl-messageformat@10.7.18:
+ resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==}
- intl-messageformat-parser@6.1.2:
- resolution: {integrity: sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==}
- deprecated: We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser
+ intl-messageformat@11.2.0:
+ resolution: {integrity: sha512-IhghAA8n4KSlXuWKzYsWyWb82JoYTzShfyvdSF85oJPnNOjvv4kAo7S7Jtkm3/vJ53C7dQNRO+Gpnj3iWgTjBQ==}
- intl-messageformat@10.7.7:
- resolution: {integrity: sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==}
-
- ipaddr.js@2.2.0:
- resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
+ ipaddr.js@2.3.0:
+ resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==}
engines: {node: '>= 10'}
is-array-buffer@3.0.5:
@@ -4131,12 +4262,6 @@ packages:
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
engines: {node: '>= 0.4'}
- is-buffer@1.1.6:
- resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
-
- is-bun-module@2.0.0:
- resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
-
is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
@@ -4174,10 +4299,6 @@ packages:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
- is-fullwidth-code-point@4.0.0:
- resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
- engines: {node: '>=12'}
-
is-generator-fn@2.1.0:
resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
engines: {node: '>=6'}
@@ -4194,9 +4315,9 @@ packages:
resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
engines: {node: '>=10'}
- is-localhost-ip@1.4.0:
- resolution: {integrity: sha512-cN7SzlY7BVxSeoJu5equjsZaKSgD4HCfXrTwu0Jgbq5BbT1BU+D7Lyi/l1KO8H0un0JTlxcQaT/GWVapu+DIDg==}
- engines: {node: '>=10'}
+ is-localhost-ip@2.0.0:
+ resolution: {integrity: sha512-vlgs2cSgMOfnKU8c1ewgKPyum9rVrjjLLW2HBdL5i0iAJjOs8NY55ZBd/hqUTaYR0EO9CKZd3hVSC2HlIbygTQ==}
+ engines: {node: '>=12'}
is-map@2.0.3:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
@@ -4221,17 +4342,17 @@ packages:
resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
engines: {node: '>=6'}
+ is-path-cwd@3.0.0:
+ resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
- is-plain-obj@1.1.0:
- resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
- engines: {node: '>=0.10.0'}
-
- is-plain-obj@2.1.0:
- resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
- engines: {node: '>=8'}
+ is-path-inside@4.0.0:
+ resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
+ engines: {node: '>=12'}
is-plain-object@3.0.1:
resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
@@ -4241,6 +4362,9 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
+ is-property@1.0.2:
+ resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
+
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -4256,14 +4380,13 @@ packages:
resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
engines: {node: '>= 0.4'}
+ is-standalone-pwa@0.1.1:
+ resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==}
+
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
- is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
is-string@1.1.1:
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
engines: {node: '>= 0.4'}
@@ -4301,8 +4424,8 @@ packages:
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- isbot@5.1.28:
- resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==}
+ isbot@5.1.37:
+ resolution: {integrity: sha512-5bcicX81xf6NlTEV8rWdg7Pk01LFizDetuYGHx6d/f6y3lR2/oo8IfxjzJqn1UdDEyCcwT9e7NRloj8DwCYujQ==}
engines: {node: '>=18'}
isexe@2.0.0:
@@ -4335,18 +4458,8 @@ packages:
resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
engines: {node: '>=8'}
- iterator.prototype@1.1.5:
- resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
- engines: {node: '>= 0.4'}
-
- jackspeak@2.3.6:
- resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
- engines: {node: '>=14'}
-
- jake@10.9.2:
- resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
- engines: {node: '>=10'}
- hasBin: true
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jest-changed-files@29.7.0:
resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
@@ -4382,6 +4495,10 @@ packages:
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-diff@30.1.1:
+ resolution: {integrity: sha512-LUU2Gx8EhYxpdzTR6BmjL1ifgOAQJQELTHOiPv9KITaKjZvJ9Jmgigx01tuZ49id37LorpGc9dPBPlXTboXScw==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-docblock@29.7.0:
resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4410,14 +4527,26 @@ packages:
resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-matcher-utils@30.1.1:
+ resolution: {integrity: sha512-SuH2QVemK48BNTqReti6FtjsMPFsSOD/ZzRxU1TttR7RiRsRSe78d03bb4Cx6D4bQC/80Q8U4VnaaAH9FlbZ9w==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-message-util@29.7.0:
resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-message-util@30.1.0:
+ resolution: {integrity: sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-mock@29.7.0:
resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-mock@30.0.5:
+ resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-pnp-resolver@1.2.3:
resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
engines: {node: '>=6'}
@@ -4431,6 +4560,10 @@ packages:
resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-regex-util@30.0.1:
+ resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-resolve-dependencies@29.7.0:
resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4455,6 +4588,10 @@ packages:
resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-util@30.0.5:
+ resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
jest-validate@29.7.0:
resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4477,6 +4614,10 @@ packages:
node-notifier:
optional: true
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
joycon@3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
@@ -4495,113 +4636,64 @@ packages:
jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
- jsesc@3.0.2:
- resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
- engines: {node: '>=6'}
- hasBin: true
-
jsesc@3.1.0:
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'}
hasBin: true
- json-buffer@3.0.1:
- resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
-
json-parse-better-errors@1.0.2:
resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
- json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-
- json-stable-stringify@1.3.0:
- resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==}
- engines: {node: '>= 0.4'}
-
json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
- json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
- hasBin: true
-
json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
hasBin: true
- jsonc-parser@3.3.1:
- resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
-
jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
- jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ jsonfile@6.2.0:
+ resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
- jsonify@0.0.1:
- resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==}
-
- jsonwebtoken@9.0.2:
- resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ jsonwebtoken@9.0.3:
+ resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==}
engines: {node: '>=12', npm: '>=6'}
jsprim@2.0.2:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
- jsx-ast-utils@3.3.5:
- resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
- engines: {node: '>=4.0'}
-
jszip@3.10.1:
resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
- jwa@1.4.2:
- resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
+ jwa@2.0.1:
+ resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
- jws@3.2.2:
- resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+ jws@4.0.1:
+ resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
kafkajs@2.2.4:
resolution: {integrity: sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==}
engines: {node: '>=14.0.0'}
- keyv@4.5.4:
- resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
-
- kind-of@6.0.3:
- resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
- engines: {node: '>=0.10.0'}
-
kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
- known-css-properties@0.29.0:
- resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==}
-
- known-css-properties@0.36.0:
- resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==}
-
- language-subtag-registry@0.3.23:
- resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
-
- language-tags@1.0.9:
- resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
- engines: {node: '>=0.10'}
+ known-css-properties@0.37.0:
+ resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==}
lazy-ass@1.6.0:
resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
@@ -4611,10 +4703,6 @@ packages:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
engines: {node: '>=6'}
- levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
-
lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
@@ -4622,14 +4710,13 @@ packages:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- lint-staged@14.0.1:
- resolution: {integrity: sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==}
- engines: {node: ^16.14.0 || >=18.0.0}
- hasBin: true
-
listr2@3.14.0:
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
engines: {node: '>=10.0.0'}
@@ -4639,22 +4726,13 @@ packages:
enquirer:
optional: true
- listr2@6.6.1:
- resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==}
- engines: {node: '>=16.0.0'}
- peerDependencies:
- enquirer: '>= 2.3.0 < 3'
- peerDependenciesMeta:
- enquirer:
- optional: true
-
load-json-file@4.0.0:
resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
engines: {node: '>=4'}
- load-json-file@6.2.0:
- resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==}
- engines: {node: '>=8'}
+ load-tsconfig@0.2.5:
+ resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
loader-utils@3.3.1:
resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
@@ -4664,16 +4742,9 @@ packages:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
- locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
-
lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
- lodash.debounce@4.0.8:
- resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
-
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
@@ -4695,22 +4766,9 @@ packages:
lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
- lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-
- lodash.mergewith@4.6.2:
- resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
-
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
- lodash.pick@4.4.0:
- resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==}
- deprecated: This package is deprecated. Use destructuring assignment syntax instead.
-
- lodash.truncate@4.4.2:
- resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
-
lodash.uniq@4.5.0:
resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
@@ -4725,18 +4783,13 @@ packages:
resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
engines: {node: '>=10'}
- log-update@5.0.1:
- resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
- loud-rejection@2.2.0:
- resolution: {integrity: sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==}
- engines: {node: '>=8'}
-
lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
@@ -4746,16 +4799,30 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
+ lru.min@1.1.4:
+ resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==}
+ engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
+
+ lucide-react@0.542.0:
+ resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ lucide-react@0.555.0:
+ resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ lucide-react@1.7.0:
+ resolution: {integrity: sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
- make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
@@ -4767,28 +4834,14 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
- map-obj@1.0.1:
- resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
- engines: {node: '>=0.10.0'}
-
- map-obj@4.3.0:
- resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
- engines: {node: '>=8'}
-
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
- mathml-tag-names@2.1.3:
- resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
-
- maxmind@4.3.28:
- resolution: {integrity: sha512-K3PcTVjhrSU6xzY7niQf/CHPmx/qzkMIpMumd3x0JXMkIDJMerL4LY9RsEhArHb4T3IK0NBxQcUlwjsxRm9rIw==}
+ maxmind@5.0.5:
+ resolution: {integrity: sha512-1lcH2kMjbBpCFhuHaMU32vz8CuOsKttRcWMQyXvtlklopCzN7NNHSVR/h9RYa8JPuFTGmkn2vYARm+7cIGuqDw==}
engines: {node: '>=12', npm: '>=6'}
- md5@2.3.0:
- resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
-
mdn-data@2.0.14:
resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
@@ -4801,8 +4854,8 @@ packages:
mdn-data@2.12.2:
resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
- mdn-data@2.23.0:
- resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==}
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
memoize-one@5.2.1:
resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
@@ -4814,14 +4867,6 @@ packages:
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
engines: {node: '>= 0.10.0'}
- meow@10.1.5:
- resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- meow@6.1.1:
- resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==}
- engines: {node: '>=8'}
-
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -4829,10 +4874,6 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
- engines: {node: '>=8.6'}
-
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
@@ -4849,14 +4890,6 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
- mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
-
- min-indent@1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
-
minimatch@10.0.3:
resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
engines: {node: 20 || >=22}
@@ -4868,68 +4901,76 @@ packages:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
engines: {node: '>=10'}
- minimatch@9.0.3:
- resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
- engines: {node: '>=16 || 14 >=14.17'}
-
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
- minimist-options@4.1.0:
- resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
- engines: {node: '>= 6'}
-
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
-
- minipass@5.0.0:
- resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
- engines: {node: '>=8'}
-
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- minizlib@2.1.2:
- resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
- engines: {node: '>= 8'}
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
- mkdirp@1.0.4:
- resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
- engines: {node: '>=10'}
- hasBin: true
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
- mmdb-lib@2.2.1:
- resolution: {integrity: sha512-DXO4L9W+08T+A7h5+xdT32l7IMot8z7WOH+7C1Maol571PnktQ8un7Ni4CyPFp4H+vht/FDA5/tpjRvWMFQDMw==}
+ mlly@1.8.0:
+ resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
+ mmdb-lib@3.0.2:
+ resolution: {integrity: sha512-7e87vk0DdWT647wjcfEtWeMtjm+zVGqNohN/aeIymbUfjHQ2T4Sx5kM+1irVDBSloNC3CkGKxswdMoo8yhqTDg==}
engines: {node: '>=10', npm: '>=6'}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ mysql2@3.15.3:
+ resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==}
+ engines: {node: '>= 8.0'}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ named-placeholders@1.1.6:
+ resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==}
+ engines: {node: '>=8.0.0'}
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- napi-postinstall@0.3.2:
- resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- hasBin: true
-
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- next@15.4.7:
- resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==}
- engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ next-intl-swc-plugin-extractor@4.8.4:
+ resolution: {integrity: sha512-iA9/jaDfFTQYypnbLP7UGO0x3z2uuvHdNgIOtl53EwlVvQpp1MW77qKF+v87uYBoAwyniwGEhNXsO6qWEI+EzA==}
+
+ next-intl@4.8.3:
+ resolution: {integrity: sha512-PvdBDWg+Leh7BR7GJUQbCDVVaBRn37GwDBWc9sv0rVQOJDQ5JU1rVzx9EEGuOGYo0DHAl70++9LQ7HxTawdL7w==}
+ peerDependencies:
+ next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ next@16.2.1:
+ resolution: {integrity: sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==}
+ engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
@@ -4954,11 +4995,17 @@ packages:
no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
engines: {node: '>=10.5.0'}
deprecated: Use your platform's native DOMException instead
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
node-fetch@3.3.2:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -4972,10 +5019,6 @@ packages:
normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
- normalize-package-data@3.0.3:
- resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
- engines: {node: '>=10'}
-
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -4997,13 +5040,14 @@ packages:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
- npm-run-path@5.3.0:
- resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ nypm@0.6.5:
+ resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -5020,21 +5064,8 @@ packages:
resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
engines: {node: '>= 0.4'}
- object.entries@1.1.9:
- resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
- engines: {node: '>= 0.4'}
-
- object.fromentries@2.0.8:
- resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
- engines: {node: '>= 0.4'}
-
- object.groupby@1.0.3:
- resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
- engines: {node: '>= 0.4'}
-
- object.values@1.2.1:
- resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
- engines: {node: '>= 0.4'}
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@@ -5043,14 +5074,6 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
- onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
-
- optionator@0.9.4:
- resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
- engines: {node: '>= 0.8.0'}
-
ospath@1.2.2:
resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
@@ -5074,14 +5097,14 @@ packages:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
- p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
-
p-map@4.0.0:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
+ p-map@7.0.4:
+ resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
+ engines: {node: '>=18'}
+
p-queue@6.6.2:
resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
engines: {node: '>=8'}
@@ -5094,6 +5117,9 @@ packages:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
@@ -5112,6 +5138,9 @@ packages:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -5128,10 +5157,6 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
- path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
-
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
@@ -5147,12 +5172,56 @@ packages:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+ path-type@6.0.0:
+ resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
+ engines: {node: '>=18'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ pg-cloudflare@1.3.0:
+ resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==}
+
+ pg-connection-string@2.12.0:
+ resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.13.0:
+ resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.13.0:
+ resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.20.0:
+ resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -5169,11 +5238,6 @@ packages:
engines: {node: '>=0.10'}
hasBin: true
- pidtree@0.6.0:
- resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
- engines: {node: '>=0.10'}
- hasBin: true
-
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
@@ -5194,6 +5258,15 @@ packages:
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
engines: {node: '>=8'}
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+ po-parser@2.1.1:
+ resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==}
+
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@@ -5368,6 +5441,24 @@ packages:
ts-node:
optional: true
+ postcss-load-config@6.0.1:
+ resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ jiti: '>=1.21.0'
+ postcss: '>=8.0.9'
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ postcss:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
postcss-logical@5.0.4:
resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==}
engines: {node: ^12 || ^14 || >=16}
@@ -5569,12 +5660,6 @@ packages:
postcss-resolve-nested-selector@0.1.6:
resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
- postcss-safe-parser@6.0.0:
- resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
- engines: {node: '>=12.0'}
- peerDependencies:
- postcss: ^8.3.3
-
postcss-selector-not@6.0.1:
resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==}
engines: {node: ^12 || ^14 || >=16}
@@ -5589,6 +5674,10 @@ packages:
resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
engines: {node: '>=4'}
+ postcss-selector-parser@7.1.1:
+ resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
+ engines: {node: '>=4'}
+
postcss-svgo@5.1.0:
resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==}
engines: {node: ^10 || ^12 || >=14.0}
@@ -5608,17 +5697,37 @@ packages:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.6:
- resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
engines: {node: ^10 || ^12 || >=14}
- prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
- prettier-linter-helpers@1.0.0:
- resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
- engines: {node: '>=6.0.0'}
+ postgres-array@3.0.4:
+ resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==}
+ engines: {node: '>=12'}
+
+ postgres-bytea@1.0.1:
+ resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres@3.4.7:
+ resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==}
+ engines: {node: '>=12'}
+
+ presentable-error@0.0.1:
+ resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==}
+ engines: {node: '>=16'}
prettier@2.8.8:
resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
@@ -5633,13 +5742,20 @@ packages:
resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- prisma@6.7.0:
- resolution: {integrity: sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==}
- engines: {node: '>=18.18'}
+ pretty-format@30.0.5:
+ resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+
+ prisma@7.6.0:
+ resolution: {integrity: sha512-OKJIPT81K3+F+AayIkY/Y3mkF2NWoFh7lZApaaqPYy7EHILKdO0VsmGkP+hDKYTySHsFSyLWXm/JgcR1B8fY1Q==}
+ engines: {node: ^20.19 || ^22.12 || >=24.0}
hasBin: true
peerDependencies:
- typescript: '>=5.1.0'
+ better-sqlite3: '>=9.0.0'
+ typescript: '>=5.4.0'
peerDependenciesMeta:
+ better-sqlite3:
+ optional: true
typescript:
optional: true
@@ -5661,19 +5777,21 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ proper-lockfile@4.1.2:
+ resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
+
proxy-from-env@1.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
- engines: {node: '>=6'}
-
pure-rand@6.1.0:
resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+ pure-rand@7.0.1:
+ resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==}
+
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
@@ -5681,52 +5799,43 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- quick-lru@4.0.1:
- resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
- engines: {node: '>=8'}
-
- quick-lru@5.1.1:
- resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
- engines: {node: '>=10'}
-
raf-schd@4.0.3:
resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==}
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
- react-basics@0.126.0:
- resolution: {integrity: sha512-TQtNZMeH5FtJjYxSN72rBmZWlIcs9jK3oVSCUUxfZq9LnFdoFSagTLCrihs3YCnX8vZEJXaJHQsp7lKEfyH5sw==}
- engines: {node: '>= 14'}
- peerDependencies:
- react: ^18.2.0
- react-dom: ^18.2.0
+ rc9@2.1.2:
+ resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
- react-dom@19.1.0:
- resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==}
+ react-aria-components@1.14.0:
+ resolution: {integrity: sha512-u21N/yS6Ozk9P9oO8wxMNZSFiPk6F3aAE9w6aN7pseGPApkjXqDyPNCnTsTTvMtVL3QRBkVbf7fJ5yi2hksVEg==}
peerDependencies:
- react: ^19.1.0
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ react-aria@3.47.0:
+ resolution: {integrity: sha512-nvahimIqdByl/PXk/xPkG30LPRzcin+/Uk0uFfwbbKRRFC9aa22a6BRULZLqVHwa9GaNyKe6CDUxO1Dde4v0kA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ react-dom@19.2.4:
+ resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
+ peerDependencies:
+ react: ^19.2.4
react-error-boundary@4.1.2:
resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==}
peerDependencies:
react: '>=16.13.1'
- react-hook-form@7.60.0:
- resolution: {integrity: sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==}
+ react-hook-form@7.71.1:
+ resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==}
engines: {node: '>=18.0.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
- react-intl@6.8.9:
- resolution: {integrity: sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg==}
- peerDependencies:
- react: ^16.6.0 || 17 || 18
- typescript: ^4.7 || 5
- peerDependenciesMeta:
- typescript:
- optional: true
-
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -5745,6 +5854,12 @@ packages:
redux:
optional: true
+ react-resizable-panels@4.8.0:
+ resolution: {integrity: sha512-2uEABkewb3ky/ZgIlAUxWa1W/LjsK494fdV1QsXxst7CDRHCzo7h22tWWu3NNaBjmiuriOCt3CvhipnaYcpoIw==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+
react-simple-maps@2.3.0:
resolution: {integrity: sha512-IZVeiPSRZKwD6I/2NvXpQ2uENYGDGZp8DvZjkapcxuJ/LQHTfl+Byb+KNgY7s+iatRA2ad8LnZ3AgqcjziCCsw==}
peerDependencies:
@@ -5752,6 +5867,11 @@ packages:
react: ^16.8.0 || 17.x
react-dom: ^16.8.0 || 17.x
+ react-stately@3.45.0:
+ resolution: {integrity: sha512-G3bYr0BIiookpt4H05VeZUuVS/FslQAj2TeT8vDfCiL314Y+LtPXIPe/a3eamCA0wljy7z1EDYKV50Qbz7pcJg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
react-use-measure@2.1.7:
resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==}
peerDependencies:
@@ -5768,47 +5888,23 @@ packages:
react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- react@19.1.0:
- resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
+ react@19.2.4:
+ resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
engines: {node: '>=0.10.0'}
- read-babelrc-up@1.1.0:
- resolution: {integrity: sha512-fcl0JeI85Ss3//kfC3z2rsG2VxSiHl1bJgpjQWrne2YuQEewZpAgAjb17A6q/Q3ozWeZsUSroiIBVsnjmOU8vw==}
- engines: {node: '>=10'}
-
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
- read-pkg-up@7.0.1:
- resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
- engines: {node: '>=8'}
-
- read-pkg-up@8.0.0:
- resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
- engines: {node: '>=12'}
-
read-pkg@3.0.0:
resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
engines: {node: '>=4'}
- read-pkg@5.2.0:
- resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
- engines: {node: '>=8'}
-
- read-pkg@6.0.0:
- resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==}
- engines: {node: '>=12'}
-
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
- redent@3.0.0:
- resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
- engines: {node: '>=8'}
-
- redent@4.0.0:
- resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
- engines: {node: '>=12'}
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
redis@4.7.1:
resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==}
@@ -5820,27 +5916,12 @@ packages:
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
engines: {node: '>= 0.4'}
- regenerate-unicode-properties@10.2.0:
- resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
- engines: {node: '>=4'}
-
- regenerate@1.4.2:
- resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
-
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
- regexpu-core@6.2.0:
- resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==}
- engines: {node: '>=4'}
-
- regjsgen@0.8.0:
- resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
-
- regjsparser@0.12.0:
- resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
- hasBin: true
+ remeda@2.33.4:
+ resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==}
request-ip@3.3.0:
resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==}
@@ -5880,17 +5961,13 @@ packages:
engines: {node: '>= 0.4'}
hasBin: true
- resolve@2.0.0-next.5:
- resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
- hasBin: true
-
restore-cursor@3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
- restore-cursor@4.0.0:
- resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ retry@0.12.0:
+ resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+ engines: {node: '>= 4'}
reusify@1.1.0:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
@@ -5908,31 +5985,29 @@ packages:
resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==}
engines: {node: '>=8.3'}
- rollup-plugin-delete@2.2.0:
- resolution: {integrity: sha512-REKtDKWvjZlbrWpPvM9X/fadCs3E9I9ge27AK8G0e4bXwSLeABAAwtjiI1u3ihqZxk6mJeB2IVeSbH4DtOcw7A==}
- engines: {node: '>=10'}
+ rollup-plugin-delete@3.0.2:
+ resolution: {integrity: sha512-26GSi/aeYQ/hEBdG1rjEMeh+WUhiPZ3hGmSr9Ucj7mhLQ1P9j8KEgtYoybDp7OlIMj3eQjHHB9fnqhxNuVgfzA==}
+ engines: {node: '>=18'}
peerDependencies:
rollup: '*'
- rollup-plugin-dts@5.3.1:
- resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==}
- engines: {node: '>=v14.21.3'}
+ rollup-plugin-dts@6.4.1:
+ resolution: {integrity: sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==}
+ engines: {node: '>=20'}
peerDependencies:
- rollup: ^3.0
- typescript: ^4.1 || ^5.0
+ rollup: ^3.29.4 || ^4
+ typescript: ^4.5 || ^5.0 || ^6.0
- rollup-plugin-esbuild@5.0.0:
- resolution: {integrity: sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==}
- engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ rollup-plugin-node-externals@8.1.2:
+ resolution: {integrity: sha512-EuB6/lolkMLK16gvibUjikERq5fCRVIGwD2xue/CrM8D0pz5GXD2V6N8IrgxegwbcUoKkUFI8VYCEEv8MMvgpA==}
+ engines: {node: '>= 21 || ^20.6.0 || ^18.19.0'}
peerDependencies:
- esbuild: '>=0.10.1'
- rollup: ^1.20.0 || ^2.0.0 || ^3.0.0
+ rollup: ^4.0.0
- rollup-plugin-node-externals@6.1.2:
- resolution: {integrity: sha512-2TWan0u0/zHcgPrKpIPgKSY8OMqwDAYD380I0hxx7iUQw8mrN34DWwG9sQUMEo5Yy4xd6/5QEAySYgiKN9fdBQ==}
- engines: {node: '>=16.0.0'}
+ rollup-plugin-peer-deps-external@2.2.4:
+ resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==}
peerDependencies:
- rollup: ^3.0.0 || ^4.0.0
+ rollup: '*'
rollup-plugin-postcss@4.0.2:
resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==}
@@ -5943,11 +6018,23 @@ packages:
rollup-pluginutils@2.8.2:
resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
- rollup@3.29.5:
- resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==}
- engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ rollup@4.60.1:
+ resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rrdom@0.1.7:
+ resolution: {integrity: sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==}
+
+ rrweb-player@1.0.0-alpha.4:
+ resolution: {integrity: sha512-Wlmn9GZ5Fdqa37vd3TzsYdLl/JWEvXNUrLCrYpnOwEgmY409HwVIvvA5aIo7k582LoKgdRCsB87N+f0oWAR0Kg==}
+
+ rrweb-snapshot@2.0.0-alpha.4:
+ resolution: {integrity: sha512-KQ2OtPpXO5jLYqg1OnXS/Hf+EzqnZyP5A+XPqBCjYpj3XIje/Od4gdUwjbFo3cVuWq5Cw5Y1d3/xwgIS7/XpQQ==}
+
+ rrweb@2.0.0-alpha.4:
+ resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -5978,12 +6065,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- scheduler@0.26.0:
- resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
-
- schema-utils@2.7.1:
- resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==}
- engines: {node: '>= 8.9.0'}
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
@@ -5993,11 +6076,14 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- semver@7.7.2:
- resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
engines: {node: '>=10'}
hasBin: true
+ seq-queue@0.0.5:
+ resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
+
serialize-error@12.0.0:
resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==}
engines: {node: '>=18'}
@@ -6020,8 +6106,8 @@ packages:
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
- sharp@0.34.4:
- resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==}
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
shebang-command@1.2.0:
@@ -6074,6 +6160,10 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
slice-ansi@3.0.0:
resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
engines: {node: '>=8'}
@@ -6082,20 +6172,12 @@ packages:
resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
engines: {node: '>=10'}
- slice-ansi@5.0.0:
- resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
- engines: {node: '>=12'}
-
smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
snake-case@3.0.4:
resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
- sort-keys@4.2.0:
- resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==}
- engines: {node: '>=8'}
-
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -6110,6 +6192,10 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
spdx-correct@3.2.0:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
@@ -6119,20 +6205,25 @@ packages:
spdx-expression-parse@3.0.1:
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
- spdx-license-ids@3.0.21:
- resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
+ spdx-license-ids@3.0.22:
+ resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ sqlstring@2.3.3:
+ resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
+ engines: {node: '>= 0.6'}
+
sshpk@1.18.0:
resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
engines: {node: '>=0.10.0'}
hasBin: true
- stable-hash@0.0.5:
- resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
-
stable@0.1.8:
resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
@@ -6141,14 +6232,13 @@ packages:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'}
+ std-env@3.10.0:
+ resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+
stop-iteration-iterator@1.1.0:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
- string-argv@0.3.2:
- resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
- engines: {node: '>=0.6.19'}
-
string-hash@1.1.3:
resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
@@ -6164,21 +6254,10 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
- string.prototype.includes@2.0.1:
- resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
- engines: {node: '>= 0.4'}
-
- string.prototype.matchall@4.0.12:
- resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
- engines: {node: '>= 0.4'}
-
string.prototype.padend@3.1.6:
resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==}
engines: {node: '>= 0.4'}
- string.prototype.repeat@1.0.0:
- resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
-
string.prototype.trim@1.2.10:
resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
engines: {node: '>= 0.4'}
@@ -6198,8 +6277,8 @@ packages:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
- strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ strip-ansi@7.1.2:
+ resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
engines: {node: '>=12'}
strip-bom@3.0.0:
@@ -6214,18 +6293,6 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
- strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
-
- strip-indent@3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
-
- strip-indent@4.0.0:
- resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
- engines: {node: '>=12'}
-
strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@@ -6233,9 +6300,6 @@ packages:
style-inject@0.3.0:
resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==}
- style-search@0.1.0:
- resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
-
styled-jsx@5.1.6:
resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
engines: {node: '>= 12.0.0'}
@@ -6255,10 +6319,10 @@ packages:
peerDependencies:
postcss: ^8.2.15
- stylelint-config-css-modules@4.5.1:
- resolution: {integrity: sha512-xRMvAOVWa8h3Dw2NmanJHuPqMUInmMoBy14kkJDT2xs2xevxl7WnQOe/nDAMvgf9NkodzKrhKZ97E61yQOKkDA==}
+ stylelint-config-css-modules@4.6.0:
+ resolution: {integrity: sha512-LIgfzNmpiwf/eDxQva2g1mj+mqDpvP1XwOKJC7DSWY/iCQAZdIKnY42jbXuY8thcFN4yM/uF1xfCyfd7fJKh6w==}
peerDependencies:
- stylelint: ^14.5.1 || ^15.0.0 || ^16.0.0
+ stylelint: ^14.5.1 || ^15.0.0 || ^16.0.0 || ^17.0.0
stylelint-config-prettier@9.0.5:
resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==}
@@ -6267,21 +6331,15 @@ packages:
peerDependencies:
stylelint: '>= 11.x < 15'
- stylelint-config-recommended@14.0.1:
- resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==}
- engines: {node: '>=18.12.0'}
+ stylelint-scss@7.0.0:
+ resolution: {integrity: sha512-H88kCC+6Vtzj76NsC8rv6x/LW8slBzIbyeSjsKVlS+4qaEJoDrcJR4L+8JdrR2ORdTscrBzYWiiT2jq6leYR1Q==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- stylelint: ^16.1.0
+ stylelint: ^16.8.2 || ^17.0.0
- stylelint-scss@6.12.1:
- resolution: {integrity: sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==}
- engines: {node: '>=18.12.0'}
- peerDependencies:
- stylelint: ^16.0.2
-
- stylelint@15.11.0:
- resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==}
- engines: {node: ^14.13.1 || >=16.0.0}
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
supports-color@5.5.0:
@@ -6296,10 +6354,6 @@ packages:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
- supports-hyperlinks@3.2.0:
- resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
- engines: {node: '>=14.18'}
-
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@@ -6307,9 +6361,6 @@ packages:
svg-parser@2.0.4:
resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
- svg-tags@1.0.0:
- resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
-
svgo@2.8.0:
resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
engines: {node: '>=10.13.0'}
@@ -6320,13 +6371,25 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
- table@6.9.0:
- resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
- engines: {node: '>=10.0.0'}
+ tailwind-merge@3.4.0:
+ resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
- tar@6.2.1:
- resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
- engines: {node: '>=10'}
+ tailwind-variants@3.2.2:
+ resolution: {integrity: sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==}
+ engines: {node: '>=16.x', pnpm: '>=7.x'}
+ peerDependencies:
+ tailwind-merge: '>=3.0.0'
+ tailwindcss: '*'
+ peerDependenciesMeta:
+ tailwind-merge:
+ optional: true
+
+ tailwindcss@4.1.18:
+ resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
+
+ tar@7.5.13:
+ resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==}
+ engines: {node: '>=18'}
terser@5.43.1:
resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==}
@@ -6337,12 +6400,16 @@ packages:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
- text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-
thenby@1.3.4:
resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==}
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
throttleit@1.0.1:
resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==}
@@ -6352,10 +6419,17 @@ packages:
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- tiny-lru@11.3.3:
- resolution: {integrity: sha512-/ShxBZOgHXDdZi7FxajcsH0MfcBqwP+t7i4T3PGjI//NUA5aCpC7cB9bbdAYrAeQLBUTJfg2rk191fzZGeo7DA==}
+ tiny-lru@11.4.7:
+ resolution: {integrity: sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw==}
engines: {node: '>=12'}
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyexec@1.0.4:
+ resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==}
+ engines: {node: '>=18'}
+
tinyglobby@0.2.14:
resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
engines: {node: '>=12.0.0'}
@@ -6367,8 +6441,8 @@ packages:
resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
hasBin: true
- tmp@0.2.3:
- resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ tmp@0.2.5:
+ resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
tmpl@1.0.5:
@@ -6390,22 +6464,11 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
- trim-newlines@3.0.1:
- resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
- engines: {node: '>=8'}
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- trim-newlines@4.1.1:
- resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==}
- engines: {node: '>=12'}
-
- ts-api-utils@1.4.3:
- resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
- ts-jest@29.4.0:
- resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==}
+ ts-jest@29.4.6:
+ resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==}
engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -6431,6 +6494,9 @@ packages:
jest-util:
optional: true
+ ts-morph@27.0.2:
+ resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==}
+
ts-node@10.9.2:
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
@@ -6445,20 +6511,32 @@ packages:
'@swc/wasm':
optional: true
- tsconfig-paths@3.15.0:
- resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
-
- tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- tsutils@3.21.0:
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
+ tsup@8.5.1:
+ resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==}
+ engines: {node: '>=18'}
+ hasBin: true
peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ '@microsoft/api-extractor': ^7.36.0
+ '@swc/core': ^1
+ postcss: ^8.4.12
+ typescript: '>=4.5.0'
+ peerDependenciesMeta:
+ '@microsoft/api-extractor':
+ optional: true
+ '@swc/core':
+ optional: true
+ postcss:
+ optional: true
+ typescript:
+ optional: true
+
+ tsx@4.21.0:
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -6466,38 +6544,14 @@ packages:
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
- type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
-
type-detect@4.0.8:
resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
engines: {node: '>=4'}
- type-fest@0.13.1:
- resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
- engines: {node: '>=10'}
-
- type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
-
type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
- type-fest@0.6.0:
- resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
- engines: {node: '>=8'}
-
- type-fest@0.8.1:
- resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
- engines: {node: '>=8'}
-
- type-fest@1.4.0:
- resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
- engines: {node: '>=10'}
-
type-fest@4.41.0:
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
engines: {node: '>=16'}
@@ -6518,41 +6572,36 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
- typedarray-to-buffer@3.1.5:
- resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
-
- typescript@4.9.5:
- resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
- engines: {node: '>=4.2.0'}
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
hasBin: true
- typescript@5.8.3:
- resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
- engines: {node: '>=14.17'}
+ ua-is-frozen@0.1.2:
+ resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==}
+
+ ua-parser-js@2.0.9:
+ resolution: {integrity: sha512-OsqGhxyo/wGdLSXMSJxuMGN6H4gDnKz6Fb3IBm4bxZFMnyy0sdf6MN96Ie8tC6z/btdO+Bsy8guxlvLdwT076w==}
+ hasBin: true
+
+ ufo@1.6.1:
+ resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+ uglify-js@3.19.3:
+ resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+ engines: {node: '>=0.8.0'}
hasBin: true
unbox-primitive@1.1.0:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
- unicode-canonical-property-names-ecmascript@2.0.1:
- resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
- engines: {node: '>=4'}
-
- unicode-match-property-ecmascript@2.0.0:
- resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
- engines: {node: '>=4'}
-
- unicode-match-property-value-ecmascript@2.2.0:
- resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
- engines: {node: '>=4'}
-
- unicode-property-aliases-ecmascript@2.1.0:
- resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
- engines: {node: '>=4'}
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
@@ -6562,9 +6611,6 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
- unrs-resolver@1.11.1:
- resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
-
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
@@ -6575,8 +6621,10 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-intl@4.8.4:
+ resolution: {integrity: sha512-H4Hs0LdyKowskCHRuPajOPx4X+UZZije4GPgIcX9N+U87Y4z4Vpfl7sp9OmhJvCUoTr3HOeUiNvjiqEKBYlsCw==}
+ peerDependencies:
+ react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
use-memo-one@1.1.3:
resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==}
@@ -6588,15 +6636,24 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- uuid@8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ uuid@11.1.0:
+ resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
- uuid@9.0.1:
- resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ uuid@13.0.0:
+ resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==}
+ hasBin: true
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
v8-compile-cache-lib@3.0.1:
@@ -6606,6 +6663,14 @@ packages:
resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
engines: {node: '>=10.12.0'}
+ valibot@1.2.0:
+ resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==}
+ peerDependencies:
+ typescript: '>=5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
@@ -6617,14 +6682,6 @@ packages:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
- vue@3.5.17:
- resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
walker@1.0.8:
resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
@@ -6657,9 +6714,8 @@ packages:
engines: {node: '>= 8'}
hasBin: true
- word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
@@ -6676,20 +6732,13 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- write-file-atomic@3.0.3:
- resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
-
write-file-atomic@4.0.2:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- write-file-atomic@5.0.1:
- resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- write-json-file@4.3.0:
- resolution: {integrity: sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==}
- engines: {node: '>=8.3'}
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
@@ -6701,21 +6750,18 @@ packages:
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- yaml@2.3.1:
- resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
- engines: {node: '>= 14'}
-
- yargs-parser@18.1.3:
- resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
- engines: {node: '>=6'}
-
- yargs-parser@20.2.9:
- resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
- engines: {node: '>=10'}
+ yaml@2.8.1:
+ resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
@@ -6736,16 +6782,20 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- zod@3.25.76:
- resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+ zeptomatch@2.1.0:
+ resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==}
- zustand@4.5.7:
- resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
- engines: {node: '>=12.7.0'}
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+ zustand@5.0.12:
+ resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==}
+ engines: {node: '>=12.20.0'}
peerDependencies:
- '@types/react': '>=16.8'
+ '@types/react': '>=18.0.0'
immer: '>=9.0.6'
- react: '>=16.8'
+ react: '>=18.0.0'
+ use-sync-external-store: '>=1.2.0'
peerDependenciesMeta:
'@types/react':
optional: true
@@ -6753,13 +6803,15 @@ packages:
optional: true
react:
optional: true
+ use-sync-external-store:
+ optional: true
snapshots:
'@ampproject/remapping@2.3.0':
dependencies:
- '@jridgewell/gen-mapping': 0.3.12
- '@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
'@babel/code-frame@7.27.1':
dependencies:
@@ -6767,809 +6819,250 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
'@babel/compat-data@7.28.0': {}
- '@babel/core@7.28.0':
+ '@babel/core@7.28.3':
dependencies:
'@ampproject/remapping': 2.3.0
'@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.0
+ '@babel/generator': 7.28.3
'@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0)
- '@babel/helpers': 7.27.6
- '@babel/parser': 7.28.0
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3)
+ '@babel/helpers': 7.28.3
+ '@babel/parser': 7.28.3
'@babel/template': 7.27.2
- '@babel/traverse': 7.28.0
- '@babel/types': 7.28.1
+ '@babel/traverse': 7.28.3
+ '@babel/types': 7.28.2
convert-source-map: 2.0.0
- debug: 4.4.1(supports-color@8.1.1)
+ debug: 4.4.3(supports-color@8.1.1)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.28.0':
+ '@babel/generator@7.28.3':
dependencies:
- '@babel/parser': 7.28.0
- '@babel/types': 7.28.1
- '@jridgewell/gen-mapping': 0.3.12
- '@jridgewell/trace-mapping': 0.3.29
+ '@babel/parser': 7.28.3
+ '@babel/types': 7.28.2
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
jsesc: 3.1.0
- '@babel/helper-annotate-as-pure@7.27.3':
- dependencies:
- '@babel/types': 7.28.1
-
'@babel/helper-compilation-targets@7.27.2':
dependencies:
'@babel/compat-data': 7.28.0
'@babel/helper-validator-option': 7.27.1
- browserslist: 4.25.1
+ browserslist: 4.25.2
lru-cache: 5.1.1
semver: 6.3.1
- '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-member-expression-to-functions': 7.27.1
- '@babel/helper-optimise-call-expression': 7.27.1
- '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- '@babel/traverse': 7.28.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- regexpu-core: 6.2.0
- semver: 6.3.1
-
- '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-plugin-utils': 7.27.1
- debug: 4.4.1(supports-color@8.1.1)
- lodash.debounce: 4.0.8
- resolve: 1.22.10
- transitivePeerDependencies:
- - supports-color
-
'@babel/helper-globals@7.28.0': {}
- '@babel/helper-member-expression-to-functions@7.27.1':
- dependencies:
- '@babel/traverse': 7.28.0
- '@babel/types': 7.28.1
- transitivePeerDependencies:
- - supports-color
-
'@babel/helper-module-imports@7.27.1':
dependencies:
- '@babel/traverse': 7.28.0
- '@babel/types': 7.28.1
+ '@babel/traverse': 7.28.3
+ '@babel/types': 7.28.2
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)':
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-module-imports': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
- '@babel/traverse': 7.28.0
+ '@babel/traverse': 7.28.3
transitivePeerDependencies:
- supports-color
- '@babel/helper-optimise-call-expression@7.27.1':
- dependencies:
- '@babel/types': 7.28.1
-
'@babel/helper-plugin-utils@7.27.1': {}
- '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-wrap-function': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-member-expression-to-functions': 7.27.1
- '@babel/helper-optimise-call-expression': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
- dependencies:
- '@babel/traverse': 7.28.0
- '@babel/types': 7.28.1
- transitivePeerDependencies:
- - supports-color
-
'@babel/helper-string-parser@7.27.1': {}
'@babel/helper-validator-identifier@7.27.1': {}
+ '@babel/helper-validator-identifier@7.28.5': {}
+
'@babel/helper-validator-option@7.27.1': {}
- '@babel/helper-wrap-function@7.27.1':
+ '@babel/helpers@7.28.3':
dependencies:
'@babel/template': 7.27.2
- '@babel/traverse': 7.28.0
- '@babel/types': 7.28.1
- transitivePeerDependencies:
- - supports-color
+ '@babel/types': 7.28.2
- '@babel/helpers@7.27.6':
+ '@babel/parser@7.28.3':
dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.1
+ '@babel/types': 7.28.2
- '@babel/parser@7.28.0':
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)':
dependencies:
- '@babel/types': 7.28.1
-
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
-
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0)
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-globals': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0)
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/template': 7.27.2
-
- '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0)
- '@babel/traverse': 7.28.0
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0)
- '@babel/helper-plugin-utils': 7.27.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
- '@babel/types': 7.28.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- transitivePeerDependencies:
- - supports-color
- '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
- '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/preset-env@7.28.0(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)':
dependencies:
- '@babel/compat-data': 7.28.0
- '@babel/core': 7.28.0
- '@babel/helper-compilation-targets': 7.27.2
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-validator-option': 7.27.1
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)
- '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0)
- '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0)
- '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0)
- '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0)
- babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0)
- babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0)
- babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0)
- core-js-compat: 3.44.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/types': 7.28.1
- esutils: 2.0.3
- '@babel/preset-react@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-validator-option': 7.27.1
- '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0)
- '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
- '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)':
+ '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
- '@babel/helper-validator-option': 7.27.1
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
- '@babel/runtime@7.27.6': {}
+ '@babel/runtime@7.28.3': {}
'@babel/template@7.27.2':
dependencies:
'@babel/code-frame': 7.27.1
- '@babel/parser': 7.28.0
- '@babel/types': 7.28.1
+ '@babel/parser': 7.28.3
+ '@babel/types': 7.28.2
- '@babel/traverse@7.28.0':
+ '@babel/traverse@7.28.3':
dependencies:
'@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.0
+ '@babel/generator': 7.28.3
'@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.0
+ '@babel/parser': 7.28.3
'@babel/template': 7.27.2
- '@babel/types': 7.28.1
- debug: 4.4.1(supports-color@8.1.1)
+ '@babel/types': 7.28.2
+ debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- '@babel/types@7.28.1':
+ '@babel/types@7.28.2':
dependencies:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@bcoe/v8-coverage@0.2.3': {}
- '@clickhouse/client-common@1.11.2': {}
+ '@biomejs/biome@2.4.10':
+ optionalDependencies:
+ '@biomejs/cli-darwin-arm64': 2.4.10
+ '@biomejs/cli-darwin-x64': 2.4.10
+ '@biomejs/cli-linux-arm64': 2.4.10
+ '@biomejs/cli-linux-arm64-musl': 2.4.10
+ '@biomejs/cli-linux-x64': 2.4.10
+ '@biomejs/cli-linux-x64-musl': 2.4.10
+ '@biomejs/cli-win32-arm64': 2.4.10
+ '@biomejs/cli-win32-x64': 2.4.10
- '@clickhouse/client@1.11.2':
+ '@biomejs/cli-darwin-arm64@2.4.10':
+ optional: true
+
+ '@biomejs/cli-darwin-x64@2.4.10':
+ optional: true
+
+ '@biomejs/cli-linux-arm64-musl@2.4.10':
+ optional: true
+
+ '@biomejs/cli-linux-arm64@2.4.10':
+ optional: true
+
+ '@biomejs/cli-linux-x64-musl@2.4.10':
+ optional: true
+
+ '@biomejs/cli-linux-x64@2.4.10':
+ optional: true
+
+ '@biomejs/cli-win32-arm64@2.4.10':
+ optional: true
+
+ '@biomejs/cli-win32-x64@2.4.10':
+ optional: true
+
+ '@clack/core@0.5.0':
dependencies:
- '@clickhouse/client-common': 1.11.2
+ picocolors: 1.1.1
+ sisteransi: 1.0.5
+
+ '@clack/prompts@0.11.0':
+ dependencies:
+ '@clack/core': 0.5.0
+ picocolors: 1.1.1
+ sisteransi: 1.0.5
+
+ '@clickhouse/client-common@1.18.2': {}
+
+ '@clickhouse/client@1.18.2':
+ dependencies:
+ '@clickhouse/client-common': 1.18.2
'@colors/colors@1.5.0':
optional: true
@@ -7578,100 +7071,85 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
- '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)':
- dependencies:
- '@csstools/css-tokenizer': 2.4.1
-
- '@csstools/css-tokenizer@2.4.1': {}
-
- '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)':
- dependencies:
- '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
- '@csstools/css-tokenizer': 2.4.1
-
- '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.6)':
+ '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.8)':
dependencies:
'@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- '@csstools/postcss-color-function@1.1.1(postcss@8.5.6)':
+ '@csstools/postcss-color-function@1.1.1(postcss@8.5.8)':
dependencies:
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- postcss: 8.5.6
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.6)':
+ '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.6)':
+ '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.6)':
+ '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.8)':
dependencies:
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- postcss: 8.5.6
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.6)':
+ '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.8)':
dependencies:
'@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.6)':
+ '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.6)':
+ '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.6)':
+ '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.8)':
dependencies:
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- postcss: 8.5.6
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.6)':
+ '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.6)':
+ '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.5.6)':
+ '@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.5.6)':
+ '@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- '@csstools/postcss-unset-value@1.0.2(postcss@8.5.6)':
+ '@csstools/postcss-unset-value@1.0.2(postcss@8.5.8)':
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
'@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)':
dependencies:
postcss-selector-parser: 6.1.2
- '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2)':
- dependencies:
- postcss-selector-parser: 6.1.2
-
- '@cypress/request@3.0.8':
+ '@cypress/request@3.0.9':
dependencies:
aws-sign2: 0.7.0
aws4: 1.13.2
@@ -7701,519 +7179,449 @@ snapshots:
'@date-fns/utc@1.2.0': {}
- '@dicebear/adventurer-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/adventurer-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/adventurer@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/adventurer@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/avataaars-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/avataaars-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/avataaars@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/avataaars@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/big-ears-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/big-ears-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/big-ears@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/big-ears@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/big-smile@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/big-smile@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/bottts-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/bottts-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/bottts@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/bottts@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/collection@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/collection@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/adventurer': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/adventurer-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/avataaars': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/avataaars-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/big-ears': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/big-ears-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/big-smile': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/bottts': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/bottts-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/core': 9.2.3
- '@dicebear/croodles': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/croodles-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/dylan': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/fun-emoji': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/glass': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/icons': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/identicon': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/initials': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/lorelei': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/lorelei-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/micah': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/miniavs': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/notionists': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/notionists-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/open-peeps': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/personas': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/pixel-art': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/pixel-art-neutral': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/rings': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/shapes': 9.2.3(@dicebear/core@9.2.3)
- '@dicebear/thumbs': 9.2.3(@dicebear/core@9.2.3)
+ '@dicebear/adventurer': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/adventurer-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/avataaars': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/avataaars-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/big-ears': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/big-ears-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/big-smile': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/bottts': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/bottts-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/core': 9.4.2
+ '@dicebear/croodles': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/croodles-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/dylan': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/fun-emoji': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/glass': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/icons': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/identicon': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/initials': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/lorelei': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/lorelei-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/micah': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/miniavs': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/notionists': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/notionists-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/open-peeps': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/personas': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/pixel-art': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/pixel-art-neutral': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/rings': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/shapes': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/thumbs': 9.4.2(@dicebear/core@9.4.2)
+ '@dicebear/toon-head': 9.4.2(@dicebear/core@9.4.2)
- '@dicebear/core@9.2.3':
+ '@dicebear/core@9.4.2':
dependencies:
'@types/json-schema': 7.0.15
- '@dicebear/croodles-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/croodles-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/croodles@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/croodles@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/dylan@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/dylan@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/fun-emoji@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/fun-emoji@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/glass@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/glass@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/icons@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/icons@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/identicon@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/identicon@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/initials@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/initials@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/lorelei-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/lorelei-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/lorelei@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/lorelei@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/micah@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/micah@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/miniavs@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/miniavs@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/notionists-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/notionists-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/notionists@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/notionists@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/open-peeps@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/open-peeps@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/personas@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/personas@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/pixel-art-neutral@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/pixel-art-neutral@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/pixel-art@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/pixel-art@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/rings@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/rings@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/shapes@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/shapes@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@dicebear/thumbs@9.2.3(@dicebear/core@9.2.3)':
+ '@dicebear/thumbs@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@dicebear/core': 9.2.3
+ '@dicebear/core': 9.4.2
- '@emnapi/core@1.4.5':
+ '@dicebear/toon-head@9.4.2(@dicebear/core@9.4.2)':
dependencies:
- '@emnapi/wasi-threads': 1.0.4
- tslib: 2.8.1
- optional: true
+ '@dicebear/core': 9.4.2
- '@emnapi/runtime@1.5.0':
+ '@electric-sql/pglite-socket@0.1.1(@electric-sql/pglite@0.4.1)':
+ dependencies:
+ '@electric-sql/pglite': 0.4.1
+
+ '@electric-sql/pglite-tools@0.3.1(@electric-sql/pglite@0.4.1)':
+ dependencies:
+ '@electric-sql/pglite': 0.4.1
+
+ '@electric-sql/pglite@0.4.1': {}
+
+ '@emnapi/runtime@1.9.1':
dependencies:
tslib: 2.8.1
optional: true
- '@emnapi/wasi-threads@1.0.4':
+ '@epic-web/invariant@1.0.0': {}
+
+ '@esbuild/aix-ppc64@0.27.4':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/android-arm@0.27.4':
+ optional: true
+
+ '@esbuild/android-x64@0.27.4':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.4':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.4':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.4':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.4':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.4':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.4':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.4':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.4':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.4':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.4':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.4':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.4':
+ optional: true
+
+ '@formatjs/bigdecimal@0.2.0': {}
+
+ '@formatjs/ecma402-abstract@2.3.6':
dependencies:
- tslib: 2.8.1
- optional: true
-
- '@esbuild/aix-ppc64@0.25.8':
- optional: true
-
- '@esbuild/android-arm64@0.25.8':
- optional: true
-
- '@esbuild/android-arm@0.25.8':
- optional: true
-
- '@esbuild/android-x64@0.25.8':
- optional: true
-
- '@esbuild/darwin-arm64@0.25.8':
- optional: true
-
- '@esbuild/darwin-x64@0.25.8':
- optional: true
-
- '@esbuild/freebsd-arm64@0.25.8':
- optional: true
-
- '@esbuild/freebsd-x64@0.25.8':
- optional: true
-
- '@esbuild/linux-arm64@0.25.8':
- optional: true
-
- '@esbuild/linux-arm@0.25.8':
- optional: true
-
- '@esbuild/linux-ia32@0.25.8':
- optional: true
-
- '@esbuild/linux-loong64@0.25.8':
- optional: true
-
- '@esbuild/linux-mips64el@0.25.8':
- optional: true
-
- '@esbuild/linux-ppc64@0.25.8':
- optional: true
-
- '@esbuild/linux-riscv64@0.25.8':
- optional: true
-
- '@esbuild/linux-s390x@0.25.8':
- optional: true
-
- '@esbuild/linux-x64@0.25.8':
- optional: true
-
- '@esbuild/netbsd-arm64@0.25.8':
- optional: true
-
- '@esbuild/netbsd-x64@0.25.8':
- optional: true
-
- '@esbuild/openbsd-arm64@0.25.8':
- optional: true
-
- '@esbuild/openbsd-x64@0.25.8':
- optional: true
-
- '@esbuild/openharmony-arm64@0.25.8':
- optional: true
-
- '@esbuild/sunos-x64@0.25.8':
- optional: true
-
- '@esbuild/win32-arm64@0.25.8':
- optional: true
-
- '@esbuild/win32-ia32@0.25.8':
- optional: true
-
- '@esbuild/win32-x64@0.25.8':
- optional: true
-
- '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)':
- dependencies:
- eslint: 8.57.1
- eslint-visitor-keys: 3.4.3
-
- '@eslint-community/regexpp@4.12.1': {}
-
- '@eslint/eslintrc@2.1.4':
- dependencies:
- ajv: 6.12.6
- debug: 4.4.1(supports-color@8.1.1)
- espree: 9.6.1
- globals: 13.24.0
- ignore: 5.3.2
- import-fresh: 3.3.1
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
-
- '@eslint/js@8.57.1': {}
-
- '@fontsource/inter@4.5.15': {}
-
- '@formatjs/cli@4.8.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))':
- dependencies:
- '@formatjs/icu-messageformat-parser': 2.1.0
- '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))
- '@types/estree': 0.0.50
- '@types/fs-extra': 9.0.13
- '@types/json-stable-stringify': 1.2.0
- '@types/node': 14.18.63
- '@vue/compiler-core': 3.5.17
- chalk: 4.1.2
- commander: 8.3.0
- fast-glob: 3.3.3
- fs-extra: 10.1.0
- json-stable-stringify: 1.3.0
- loud-rejection: 2.2.0
- tslib: 2.8.1
- typescript: 4.9.5
- vue: 3.5.17(typescript@4.9.5)
- transitivePeerDependencies:
- - ts-jest
-
- '@formatjs/ecma402-abstract@1.11.4':
- dependencies:
- '@formatjs/intl-localematcher': 0.2.25
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/intl-localematcher': 0.6.2
+ decimal.js: 10.6.0
tslib: 2.8.1
- '@formatjs/ecma402-abstract@1.4.0':
+ '@formatjs/ecma402-abstract@3.2.0':
+ dependencies:
+ '@formatjs/bigdecimal': 0.2.0
+ '@formatjs/fast-memoize': 3.1.1
+ '@formatjs/intl-localematcher': 0.8.2
+
+ '@formatjs/fast-memoize@2.2.7':
dependencies:
tslib: 2.8.1
- '@formatjs/ecma402-abstract@1.5.0':
+ '@formatjs/fast-memoize@3.1.1': {}
+
+ '@formatjs/icu-messageformat-parser@2.11.4':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.6
+ '@formatjs/icu-skeleton-parser': 1.8.16
+ tslib: 2.8.1
+
+ '@formatjs/icu-messageformat-parser@3.5.3':
+ dependencies:
+ '@formatjs/ecma402-abstract': 3.2.0
+ '@formatjs/icu-skeleton-parser': 2.1.3
+
+ '@formatjs/icu-skeleton-parser@1.8.16':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.6
+ tslib: 2.8.1
+
+ '@formatjs/icu-skeleton-parser@2.1.3':
+ dependencies:
+ '@formatjs/ecma402-abstract': 3.2.0
+
+ '@formatjs/intl-localematcher@0.6.2':
dependencies:
tslib: 2.8.1
- '@formatjs/ecma402-abstract@2.2.4':
+ '@formatjs/intl-localematcher@0.8.2':
dependencies:
- '@formatjs/fast-memoize': 2.2.3
- '@formatjs/intl-localematcher': 0.5.8
- tslib: 2.8.1
+ '@formatjs/fast-memoize': 3.1.1
- '@formatjs/fast-memoize@2.2.3':
+ '@hello-pangea/dnd@17.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- tslib: 2.8.1
-
- '@formatjs/icu-messageformat-parser@2.1.0':
- dependencies:
- '@formatjs/ecma402-abstract': 1.11.4
- '@formatjs/icu-skeleton-parser': 1.3.6
- tslib: 2.8.1
-
- '@formatjs/icu-messageformat-parser@2.9.4':
- dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/icu-skeleton-parser': 1.8.8
- tslib: 2.8.1
-
- '@formatjs/icu-skeleton-parser@1.3.6':
- dependencies:
- '@formatjs/ecma402-abstract': 1.11.4
- tslib: 2.8.1
-
- '@formatjs/icu-skeleton-parser@1.8.8':
- dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- tslib: 2.8.1
-
- '@formatjs/intl-displaynames@6.8.5':
- dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/intl-localematcher': 0.5.8
- tslib: 2.8.1
-
- '@formatjs/intl-listformat@7.7.5':
- dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/intl-localematcher': 0.5.8
- tslib: 2.8.1
-
- '@formatjs/intl-localematcher@0.2.25':
- dependencies:
- tslib: 2.8.1
-
- '@formatjs/intl-localematcher@0.5.8':
- dependencies:
- tslib: 2.8.1
-
- '@formatjs/intl-numberformat@5.7.6':
- dependencies:
- '@formatjs/ecma402-abstract': 1.4.0
- tslib: 2.8.1
-
- '@formatjs/intl@2.10.15(typescript@5.8.3)':
- dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/fast-memoize': 2.2.3
- '@formatjs/icu-messageformat-parser': 2.9.4
- '@formatjs/intl-displaynames': 6.8.5
- '@formatjs/intl-listformat': 7.7.5
- intl-messageformat: 10.7.7
- tslib: 2.8.1
- optionalDependencies:
- typescript: 5.8.3
-
- '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))':
- dependencies:
- intl-messageformat-parser: 6.1.2
- tslib: 2.8.1
- typescript: 4.9.5
- optionalDependencies:
- ts-jest: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)
-
- '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))':
- dependencies:
- '@formatjs/icu-messageformat-parser': 2.1.0
- '@types/node': 14.18.63
- chalk: 4.1.2
- tslib: 2.8.1
- typescript: 4.9.5
- optionalDependencies:
- ts-jest: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)
-
- '@hello-pangea/dnd@17.0.0(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
- dependencies:
- '@babel/runtime': 7.27.6
+ '@babel/runtime': 7.28.3
css-box-model: 1.2.1
memoize-one: 6.0.0
raf-schd: 4.0.3
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- react-redux: 9.2.0(@types/react@19.1.8)(react@19.1.0)(redux@5.0.1)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1)
redux: 5.0.1
- use-memo-one: 1.1.3(react@19.1.0)
+ use-memo-one: 1.1.3(react@19.2.4)
transitivePeerDependencies:
- '@types/react'
- '@humanwhocodes/config-array@0.13.0':
+ '@hono/node-server@1.19.11(hono@4.12.9)':
dependencies:
- '@humanwhocodes/object-schema': 2.0.3
- debug: 4.4.1(supports-color@8.1.1)
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
+ hono: 4.12.9
- '@humanwhocodes/module-importer@1.0.1': {}
-
- '@humanwhocodes/object-schema@2.0.3': {}
-
- '@img/colour@1.0.0':
+ '@img/colour@1.1.0':
optional: true
- '@img/sharp-darwin-arm64@0.34.4':
+ '@img/sharp-darwin-arm64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.2.3
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
optional: true
- '@img/sharp-darwin-x64@0.34.4':
+ '@img/sharp-darwin-x64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.2.3
+ '@img/sharp-libvips-darwin-x64': 1.2.4
optional: true
- '@img/sharp-libvips-darwin-arm64@1.2.3':
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
optional: true
- '@img/sharp-libvips-darwin-x64@1.2.3':
+ '@img/sharp-libvips-darwin-x64@1.2.4':
optional: true
- '@img/sharp-libvips-linux-arm64@1.2.3':
+ '@img/sharp-libvips-linux-arm64@1.2.4':
optional: true
- '@img/sharp-libvips-linux-arm@1.2.3':
+ '@img/sharp-libvips-linux-arm@1.2.4':
optional: true
- '@img/sharp-libvips-linux-ppc64@1.2.3':
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
optional: true
- '@img/sharp-libvips-linux-s390x@1.2.3':
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
optional: true
- '@img/sharp-libvips-linux-x64@1.2.3':
+ '@img/sharp-libvips-linux-s390x@1.2.4':
optional: true
- '@img/sharp-libvips-linuxmusl-arm64@1.2.3':
+ '@img/sharp-libvips-linux-x64@1.2.4':
optional: true
- '@img/sharp-libvips-linuxmusl-x64@1.2.3':
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
optional: true
- '@img/sharp-linux-arm64@0.34.4':
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.2.3
+ '@img/sharp-libvips-linux-arm64': 1.2.4
optional: true
- '@img/sharp-linux-arm@0.34.4':
+ '@img/sharp-linux-arm@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.2.3
+ '@img/sharp-libvips-linux-arm': 1.2.4
optional: true
- '@img/sharp-linux-ppc64@0.34.4':
+ '@img/sharp-linux-ppc64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linux-ppc64': 1.2.3
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
optional: true
- '@img/sharp-linux-s390x@0.34.4':
+ '@img/sharp-linux-riscv64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.2.3
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
optional: true
- '@img/sharp-linux-x64@0.34.4':
+ '@img/sharp-linux-s390x@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.2.3
+ '@img/sharp-libvips-linux-s390x': 1.2.4
optional: true
- '@img/sharp-linuxmusl-arm64@0.34.4':
+ '@img/sharp-linux-x64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.3
+ '@img/sharp-libvips-linux-x64': 1.2.4
optional: true
- '@img/sharp-linuxmusl-x64@0.34.4':
+ '@img/sharp-linuxmusl-arm64@0.34.5':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.2.3
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
optional: true
- '@img/sharp-wasm32@0.34.4':
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
dependencies:
- '@emnapi/runtime': 1.5.0
+ '@emnapi/runtime': 1.9.1
optional: true
- '@img/sharp-win32-arm64@0.34.4':
+ '@img/sharp-win32-arm64@0.34.5':
optional: true
- '@img/sharp-win32-ia32@0.34.4':
+ '@img/sharp-win32-ia32@0.34.5':
optional: true
- '@img/sharp-win32-x64@0.34.4':
+ '@img/sharp-win32-x64@0.34.5':
optional: true
+ '@internationalized/date@3.11.0':
+ dependencies:
+ '@swc/helpers': 0.5.18
+
+ '@internationalized/date@3.12.0':
+ dependencies:
+ '@swc/helpers': 0.5.20
+
+ '@internationalized/message@3.1.8':
+ dependencies:
+ '@swc/helpers': 0.5.20
+ intl-messageformat: 10.7.18
+
+ '@internationalized/number@3.6.5':
+ dependencies:
+ '@swc/helpers': 0.5.20
+
+ '@internationalized/string@3.2.7':
+ dependencies:
+ '@swc/helpers': 0.5.20
+
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.0':
@@ -8224,11 +7632,15 @@ snapshots:
dependencies:
string-width: 5.1.2
string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.0
+ strip-ansi: 7.1.2
strip-ansi-cjs: strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
+
'@istanbuljs/load-nyc-config@1.1.0':
dependencies:
camelcase: 5.3.1
@@ -8242,27 +7654,27 @@ snapshots:
'@jest/console@29.7.0':
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
slash: 3.0.0
- '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))':
+ '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))':
dependencies:
'@jest/console': 29.7.0
'@jest/reporters': 29.7.0
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ jest-config: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -8283,17 +7695,23 @@ snapshots:
- supports-color
- ts-node
+ '@jest/diff-sequences@30.0.1': {}
+
'@jest/environment@29.7.0':
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
jest-mock: 29.7.0
'@jest/expect-utils@29.7.0':
dependencies:
jest-get-type: 29.6.3
+ '@jest/expect-utils@30.1.1':
+ dependencies:
+ '@jest/get-type': 30.1.0
+
'@jest/expect@29.7.0':
dependencies:
expect: 29.7.0
@@ -8305,11 +7723,13 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
+ '@jest/get-type@30.1.0': {}
+
'@jest/globals@29.7.0':
dependencies:
'@jest/environment': 29.7.0
@@ -8319,6 +7739,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@jest/pattern@30.0.1':
+ dependencies:
+ '@types/node': 24.12.0
+ jest-regex-util: 30.0.1
+
'@jest/reporters@29.7.0':
dependencies:
'@bcoe/v8-coverage': 0.2.3
@@ -8326,8 +7751,8 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.29
- '@types/node': 22.16.5
+ '@jridgewell/trace-mapping': 0.3.30
+ '@types/node': 24.12.0
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -8352,9 +7777,13 @@ snapshots:
dependencies:
'@sinclair/typebox': 0.27.8
+ '@jest/schemas@30.0.5':
+ dependencies:
+ '@sinclair/typebox': 0.34.40
+
'@jest/source-map@29.6.3':
dependencies:
- '@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/trace-mapping': 0.3.30
callsites: 3.1.0
graceful-fs: 4.2.11
@@ -8374,9 +7803,9 @@ snapshots:
'@jest/transform@29.7.0':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/trace-mapping': 0.3.30
babel-plugin-istanbul: 6.1.1
chalk: 4.1.2
convert-source-map: 2.0.0
@@ -8397,73 +7826,82 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
'@types/yargs': 17.0.33
chalk: 4.1.2
- '@jridgewell/gen-mapping@0.3.12':
+ '@jest/types@30.0.5':
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.4
- '@jridgewell/trace-mapping': 0.3.29
+ '@jest/pattern': 30.0.1
+ '@jest/schemas': 30.0.5
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 24.12.0
+ '@types/yargs': 17.0.33
+ chalk: 4.1.2
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.30
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
'@jridgewell/resolve-uri@3.1.2': {}
- '@jridgewell/source-map@0.3.10':
+ '@jridgewell/source-map@0.3.11':
dependencies:
- '@jridgewell/gen-mapping': 0.3.12
- '@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
- '@jridgewell/sourcemap-codec@1.5.4': {}
+ '@jridgewell/sourcemap-codec@1.5.5': {}
- '@jridgewell/trace-mapping@0.3.29':
+ '@jridgewell/trace-mapping@0.3.30':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.4
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping@0.3.9':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.4
+ '@jridgewell/sourcemap-codec': 1.5.5
'@kurkle/color@0.3.4': {}
- '@napi-rs/wasm-runtime@0.2.12':
- dependencies:
- '@emnapi/core': 1.4.5
- '@emnapi/runtime': 1.5.0
- '@tybys/wasm-util': 0.10.0
+ '@netlify/plugin-nextjs@5.15.9': {}
+
+ '@next/env@16.2.1': {}
+
+ '@next/swc-darwin-arm64@16.2.1':
optional: true
- '@netlify/plugin-nextjs@5.11.6': {}
-
- '@next/env@15.4.7': {}
-
- '@next/eslint-plugin-next@14.2.30':
- dependencies:
- glob: 10.3.10
-
- '@next/swc-darwin-arm64@15.4.7':
+ '@next/swc-darwin-x64@16.2.1':
optional: true
- '@next/swc-darwin-x64@15.4.7':
+ '@next/swc-linux-arm64-gnu@16.2.1':
optional: true
- '@next/swc-linux-arm64-gnu@15.4.7':
+ '@next/swc-linux-arm64-musl@16.2.1':
optional: true
- '@next/swc-linux-arm64-musl@15.4.7':
+ '@next/swc-linux-x64-gnu@16.2.1':
optional: true
- '@next/swc-linux-x64-gnu@15.4.7':
+ '@next/swc-linux-x64-musl@16.2.1':
optional: true
- '@next/swc-linux-x64-musl@15.4.7':
+ '@next/swc-win32-arm64-msvc@16.2.1':
optional: true
- '@next/swc-win32-arm64-msvc@15.4.7':
- optional: true
-
- '@next/swc-win32-x64-msvc@15.4.7':
+ '@next/swc-win32-x64-msvc@16.2.1':
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -8478,79 +7916,1381 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
- '@nolyfill/is-core-module@1.0.39': {}
+ '@parcel/watcher-android-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher@2.5.6':
+ dependencies:
+ detect-libc: 2.1.2
+ is-glob: 4.0.3
+ node-addon-api: 7.1.1
+ picomatch: 4.0.3
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.6
+ '@parcel/watcher-darwin-arm64': 2.5.6
+ '@parcel/watcher-darwin-x64': 2.5.6
+ '@parcel/watcher-freebsd-x64': 2.5.6
+ '@parcel/watcher-linux-arm-glibc': 2.5.6
+ '@parcel/watcher-linux-arm-musl': 2.5.6
+ '@parcel/watcher-linux-arm64-glibc': 2.5.6
+ '@parcel/watcher-linux-arm64-musl': 2.5.6
+ '@parcel/watcher-linux-x64-glibc': 2.5.6
+ '@parcel/watcher-linux-x64-musl': 2.5.6
+ '@parcel/watcher-win32-arm64': 2.5.6
+ '@parcel/watcher-win32-ia32': 2.5.6
+ '@parcel/watcher-win32-x64': 2.5.6
'@pkgjs/parseargs@0.11.0':
optional: true
- '@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3)':
- optionalDependencies:
- prisma: 6.7.0(typescript@5.8.3)
- typescript: 5.8.3
-
- '@prisma/config@6.7.0':
+ '@prisma/adapter-pg@7.6.0':
dependencies:
- esbuild: 0.25.8
- esbuild-register: 3.6.0(esbuild@0.25.8)
+ '@prisma/driver-adapter-utils': 7.6.0
+ '@types/pg': 8.20.0
+ pg: 8.20.0
+ postgres-array: 3.0.4
transitivePeerDependencies:
- - supports-color
+ - pg-native
- '@prisma/debug@6.7.0': {}
+ '@prisma/client-runtime-utils@7.6.0': {}
- '@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': {}
-
- '@prisma/engines@6.7.0':
+ '@prisma/client@7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)':
dependencies:
- '@prisma/debug': 6.7.0
- '@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed
- '@prisma/fetch-engine': 6.7.0
- '@prisma/get-platform': 6.7.0
+ '@prisma/client-runtime-utils': 7.6.0
+ optionalDependencies:
+ prisma: 7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
+ typescript: 5.9.3
- '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3))':
+ '@prisma/config@7.6.0':
dependencies:
- '@prisma/client': 6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3)
+ c12: 3.1.0
+ deepmerge-ts: 7.1.5
+ effect: 3.20.0
+ empathic: 2.0.0
+ transitivePeerDependencies:
+ - magicast
- '@prisma/fetch-engine@6.7.0':
- dependencies:
- '@prisma/debug': 6.7.0
- '@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed
- '@prisma/get-platform': 6.7.0
+ '@prisma/debug@7.2.0': {}
- '@prisma/get-platform@6.7.0':
- dependencies:
- '@prisma/debug': 6.7.0
+ '@prisma/debug@7.6.0': {}
- '@react-spring/animated@9.7.5(react@19.1.0)':
+ '@prisma/dev@0.24.3(typescript@5.9.3)':
dependencies:
- '@react-spring/shared': 9.7.5(react@19.1.0)
+ '@electric-sql/pglite': 0.4.1
+ '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1)
+ '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1)
+ '@hono/node-server': 1.19.11(hono@4.12.9)
+ '@prisma/get-platform': 7.2.0
+ '@prisma/query-plan-executor': 7.2.0
+ '@prisma/streams-local': 0.1.2
+ foreground-child: 3.3.1
+ get-port-please: 3.2.0
+ hono: 4.12.9
+ http-status-codes: 2.3.0
+ pathe: 2.0.3
+ proper-lockfile: 4.1.2
+ remeda: 2.33.4
+ std-env: 3.10.0
+ valibot: 1.2.0(typescript@5.9.3)
+ zeptomatch: 2.1.0
+ transitivePeerDependencies:
+ - typescript
+
+ '@prisma/driver-adapter-utils@7.6.0':
+ dependencies:
+ '@prisma/debug': 7.6.0
+
+ '@prisma/engines-version@7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711': {}
+
+ '@prisma/engines@7.6.0':
+ dependencies:
+ '@prisma/debug': 7.6.0
+ '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711
+ '@prisma/fetch-engine': 7.6.0
+ '@prisma/get-platform': 7.6.0
+
+ '@prisma/extension-read-replicas@0.5.0(@prisma/client@7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))':
+ dependencies:
+ '@prisma/client': 7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)
+
+ '@prisma/fetch-engine@7.6.0':
+ dependencies:
+ '@prisma/debug': 7.6.0
+ '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711
+ '@prisma/get-platform': 7.6.0
+
+ '@prisma/get-platform@7.2.0':
+ dependencies:
+ '@prisma/debug': 7.2.0
+
+ '@prisma/get-platform@7.6.0':
+ dependencies:
+ '@prisma/debug': 7.6.0
+
+ '@prisma/query-plan-executor@7.2.0': {}
+
+ '@prisma/streams-local@0.1.2':
+ dependencies:
+ ajv: 8.18.0
+ better-result: 2.7.0
+ env-paths: 3.0.0
+ proper-lockfile: 4.1.2
+
+ '@prisma/studio-core@0.27.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@types/react': 19.2.14
+ chart.js: 4.5.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ transitivePeerDependencies:
+ - '@types/react-dom'
+
+ '@radix-ui/primitive@1.1.3': {}
+
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ optionalDependencies:
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
+
+ '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ optionalDependencies:
+ '@types/react': 19.2.14
+ '@types/react-dom': 19.2.3(@types/react@19.2.14)
+
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4)
+ react: 19.2.4
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@react-aria/autocomplete@3.0.0-rc.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/combobox': 3.15.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/listbox': 3.15.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/searchfield': 3.8.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/autocomplete': 3.0.0-beta.4(react@19.2.4)
+ '@react-stately/combobox': 3.13.0(react@19.2.4)
+ '@react-types/autocomplete': 3.0.0-alpha.36(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/breadcrumbs@3.5.32(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/link': 3.8.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/breadcrumbs': 3.7.19(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/button@3.14.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/toolbar': 3.0.0-beta.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/toggle': 3.9.5(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/calendar@3.9.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/calendar': 3.9.3(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/calendar': 3.8.3(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/checkbox@3.16.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/form': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/toggle': 3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/checkbox': 3.7.5(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/toggle': 3.9.5(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/collections@3.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ use-sync-external-store: 1.6.0(react@19.2.4)
+
+ '@react-aria/color@3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/numberfield': 3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/slider': 3.8.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/spinbutton': 3.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/visually-hidden': 3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/color': 3.9.5(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-types/color': 3.1.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/combobox@3.15.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/listbox': 3.15.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/menu': 3.21.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/combobox': 3.13.0(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/combobox': 3.14.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/datepicker@3.16.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@internationalized/number': 3.6.5
+ '@internationalized/string': 3.2.7
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/form': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/spinbutton': 3.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/datepicker': 3.16.1(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/calendar': 3.8.3(react@19.2.4)
+ '@react-types/datepicker': 3.13.5(react@19.2.4)
+ '@react-types/dialog': 3.5.24(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/dialog@3.5.34(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/dialog': 3.5.24(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/disclosure@3.1.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/disclosure': 3.0.11(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/dnd@3.11.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@internationalized/string': 3.2.7
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/dnd': 3.7.4(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/focus@3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.0(react@19.2.4)
+ '@swc/helpers': 0.5.18
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/focus@3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/form@3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/grid@3.14.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/grid': 3.11.9(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/gridlist@3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/grid': 3.14.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-stately/tree': 3.9.6(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/i18n@3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@internationalized/message': 3.1.8
+ '@internationalized/number': 3.6.5
+ '@internationalized/string': 3.2.7
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/interactions@3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-types/shared': 3.33.0(react@19.2.4)
+ '@swc/helpers': 0.5.18
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/interactions@3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/label@3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/landmark@3.0.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ use-sync-external-store: 1.6.0(react@19.2.4)
+
+ '@react-aria/link@3.8.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/link': 3.6.7(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/listbox@3.15.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-types/listbox': 3.7.6(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/live-announcer@3.4.4':
+ dependencies:
+ '@swc/helpers': 0.5.20
+
+ '@react-aria/menu@3.21.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/menu': 3.9.11(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/tree': 3.9.6(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/menu': 3.10.7(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/meter@3.4.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/progress': 3.4.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/meter': 3.4.15(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/numberfield@3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/spinbutton': 3.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/numberfield': 3.11.0(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/numberfield': 3.8.18(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/overlays@3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/visually-hidden': 3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/progress@3.4.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/progress': 3.5.18(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/radio@3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/form': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/radio': 3.11.5(react@19.2.4)
+ '@react-types/radio': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/searchfield@3.8.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/searchfield': 3.5.19(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/searchfield': 3.6.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/select@3.17.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/form': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/listbox': 3.15.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/menu': 3.21.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/visually-hidden': 3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/select': 3.9.2(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/select': 3.12.2(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/selection@3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/separator@3.4.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/slider@3.8.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/slider': 3.7.5(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/slider': 3.8.4(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/spinbutton@3.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/ssr@3.9.10(react@19.2.4)':
+ dependencies:
+ '@swc/helpers': 0.5.18
+ react: 19.2.4
+
+ '@react-aria/switch@3.7.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/toggle': 3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/toggle': 3.9.5(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/switch': 3.5.17(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/table@3.17.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/grid': 3.14.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/visually-hidden': 3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/table': 3.15.4(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/table': 3.13.6(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/tabs@3.11.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/tabs': 3.8.9(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/tabs': 3.3.22(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/tag@3.8.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/gridlist': 3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/textfield@3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/form': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/textfield': 3.12.8(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/toast@3.0.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/landmark': 3.0.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/toast': 3.1.3(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/toggle@3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/toggle': 3.9.5(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/toolbar@3.0.0-beta.22(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/toolbar@3.0.0-beta.24(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/tooltip@3.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/tooltip': 3.5.11(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/tooltip': 3.5.2(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/tree@3.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/gridlist': 3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/tree': 3.9.6(react@19.2.4)
+ '@react-types/button': 3.15.1(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/utils@3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.0(react@19.2.4)
+ '@swc/helpers': 0.5.18
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/utils@3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/virtualizer@4.1.13(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/virtualizer': 4.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-aria/visually-hidden@3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-spring/animated@10.0.3(react@19.2.4)':
+ dependencies:
+ '@react-spring/shared': 10.0.3(react@19.2.4)
+ '@react-spring/types': 10.0.3
+ react: 19.2.4
+
+ '@react-spring/animated@9.7.5(react@19.2.4)':
+ dependencies:
+ '@react-spring/shared': 9.7.5(react@19.2.4)
'@react-spring/types': 9.7.5
- react: 19.1.0
+ react: 19.2.4
- '@react-spring/core@9.7.5(react@19.1.0)':
+ '@react-spring/core@10.0.3(react@19.2.4)':
dependencies:
- '@react-spring/animated': 9.7.5(react@19.1.0)
- '@react-spring/shared': 9.7.5(react@19.1.0)
+ '@react-spring/animated': 10.0.3(react@19.2.4)
+ '@react-spring/shared': 10.0.3(react@19.2.4)
+ '@react-spring/types': 10.0.3
+ react: 19.2.4
+
+ '@react-spring/core@9.7.5(react@19.2.4)':
+ dependencies:
+ '@react-spring/animated': 9.7.5(react@19.2.4)
+ '@react-spring/shared': 9.7.5(react@19.2.4)
'@react-spring/types': 9.7.5
- react: 19.1.0
+ react: 19.2.4
+
+ '@react-spring/rafz@10.0.3': {}
'@react-spring/rafz@9.7.5': {}
- '@react-spring/shared@9.7.5(react@19.1.0)':
+ '@react-spring/shared@10.0.3(react@19.2.4)':
+ dependencies:
+ '@react-spring/rafz': 10.0.3
+ '@react-spring/types': 10.0.3
+ react: 19.2.4
+
+ '@react-spring/shared@9.7.5(react@19.2.4)':
dependencies:
'@react-spring/rafz': 9.7.5
'@react-spring/types': 9.7.5
- react: 19.1.0
+ react: 19.2.4
+
+ '@react-spring/types@10.0.3': {}
'@react-spring/types@9.7.5': {}
- '@react-spring/web@9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@react-spring/web@10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@react-spring/animated': 9.7.5(react@19.1.0)
- '@react-spring/core': 9.7.5(react@19.1.0)
- '@react-spring/shared': 9.7.5(react@19.1.0)
+ '@react-spring/animated': 10.0.3(react@19.2.4)
+ '@react-spring/core': 10.0.3(react@19.2.4)
+ '@react-spring/shared': 10.0.3(react@19.2.4)
+ '@react-spring/types': 10.0.3
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-spring/web@9.7.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-spring/animated': 9.7.5(react@19.2.4)
+ '@react-spring/core': 9.7.5(react@19.2.4)
+ '@react-spring/shared': 9.7.5(react@19.2.4)
'@react-spring/types': 9.7.5
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-stately/autocomplete@3.0.0-beta.4(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/calendar@3.9.3(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/calendar': 3.8.3(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/checkbox@3.7.5(react@19.2.4)':
+ dependencies:
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/collections@3.12.10(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/color@3.9.5(react@19.2.4)':
+ dependencies:
+ '@internationalized/number': 3.6.5
+ '@internationalized/string': 3.2.7
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/numberfield': 3.11.0(react@19.2.4)
+ '@react-stately/slider': 3.7.5(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/color': 3.1.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/combobox@3.13.0(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/combobox': 3.14.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/data@3.15.2(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/datepicker@3.16.1(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@internationalized/number': 3.6.5
+ '@internationalized/string': 3.2.7
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/datepicker': 3.13.5(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/disclosure@3.0.11(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/dnd@3.7.4(react@19.2.4)':
+ dependencies:
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/flags@3.1.2':
+ dependencies:
+ '@swc/helpers': 0.5.18
+
+ '@react-stately/form@3.2.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/grid@3.11.9(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/layout@4.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/table': 3.15.4(react@19.2.4)
+ '@react-stately/virtualizer': 4.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/table': 3.13.6(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-stately/list@3.13.4(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/menu@3.9.11(react@19.2.4)':
+ dependencies:
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-types/menu': 3.10.7(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/numberfield@3.11.0(react@19.2.4)':
+ dependencies:
+ '@internationalized/number': 3.6.5
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/numberfield': 3.8.18(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/overlays@3.6.23(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/radio@3.11.5(react@19.2.4)':
+ dependencies:
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/radio': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/searchfield@3.5.19(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/searchfield': 3.6.8(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/select@3.9.2(react@19.2.4)':
+ dependencies:
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/select': 3.12.2(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/selection@3.20.9(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/slider@3.7.5(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/slider': 3.8.4(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/table@3.15.4(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/grid': 3.11.9(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/table': 3.13.6(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/tabs@3.8.9(react@19.2.4)':
+ dependencies:
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/tabs': 3.3.22(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/toast@3.1.3(react@19.2.4)':
+ dependencies:
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
+
+ '@react-stately/toggle@3.9.5(react@19.2.4)':
+ dependencies:
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/checkbox': 3.10.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/tooltip@3.5.11(react@19.2.4)':
+ dependencies:
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-types/tooltip': 3.5.2(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/tree@3.9.6(react@19.2.4)':
+ dependencies:
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+
+ '@react-stately/utils@3.11.0(react@19.2.4)':
+ dependencies:
+ '@swc/helpers': 0.5.18
+ react: 19.2.4
+
+ '@react-stately/virtualizer@4.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@react-types/autocomplete@3.0.0-alpha.36(react@19.2.4)':
+ dependencies:
+ '@react-types/combobox': 3.14.0(react@19.2.4)
+ '@react-types/searchfield': 3.6.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/breadcrumbs@3.7.19(react@19.2.4)':
+ dependencies:
+ '@react-types/link': 3.6.7(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/button@3.15.1(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/calendar@3.8.3(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/checkbox@3.10.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/color@3.1.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/slider': 3.8.4(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/combobox@3.14.0(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/datepicker@3.13.5(react@19.2.4)':
+ dependencies:
+ '@internationalized/date': 3.12.0
+ '@react-types/calendar': 3.8.3(react@19.2.4)
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/dialog@3.5.24(react@19.2.4)':
+ dependencies:
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/form@3.7.18(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/grid@3.3.8(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/link@3.6.7(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/listbox@3.7.6(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/menu@3.10.7(react@19.2.4)':
+ dependencies:
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/meter@3.4.15(react@19.2.4)':
+ dependencies:
+ '@react-types/progress': 3.5.18(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/numberfield@3.8.18(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/overlays@3.9.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/progress@3.5.18(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/radio@3.9.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/searchfield@3.6.8(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/textfield': 3.12.8(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/select@3.12.2(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/shared@3.33.0(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+
+ '@react-types/shared@3.33.1(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+
+ '@react-types/slider@3.8.4(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/switch@3.5.17(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/table@3.13.6(react@19.2.4)':
+ dependencies:
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/tabs@3.3.22(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/textfield@3.12.8(react@19.2.4)':
+ dependencies:
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ '@react-types/tooltip@3.5.2(react@19.2.4)':
+ dependencies:
+ '@react-types/overlays': 3.9.4(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
'@redis/bloom@1.2.0(@redis/client@1.6.1)':
dependencies:
@@ -8578,66 +9318,154 @@ snapshots:
dependencies:
'@redis/client': 1.6.1
- '@rollup/plugin-alias@5.1.1(rollup@3.29.5)':
+ '@rollup/plugin-alias@5.1.1(rollup@4.60.1)':
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/plugin-commonjs@25.0.8(rollup@3.29.5)':
+ '@rollup/plugin-commonjs@25.0.8(rollup@4.60.1)':
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
+ '@rollup/pluginutils': 5.2.0(rollup@4.60.1)
commondir: 1.0.1
estree-walker: 2.0.2
glob: 8.1.0
is-reference: 1.2.1
magic-string: 0.30.17
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/plugin-json@6.1.0(rollup@3.29.5)':
+ '@rollup/plugin-json@6.1.0(rollup@4.60.1)':
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
+ '@rollup/pluginutils': 5.2.0(rollup@4.60.1)
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/plugin-node-resolve@15.3.1(rollup@3.29.5)':
+ '@rollup/plugin-node-resolve@15.3.1(rollup@4.60.1)':
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
+ '@rollup/pluginutils': 5.2.0(rollup@4.60.1)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.10
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/plugin-replace@5.0.7(rollup@3.29.5)':
+ '@rollup/plugin-replace@5.0.7(rollup@4.60.1)':
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
+ '@rollup/pluginutils': 5.2.0(rollup@4.60.1)
magic-string: 0.30.17
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/plugin-terser@0.4.4(rollup@3.29.5)':
+ '@rollup/plugin-terser@0.4.4(rollup@4.60.1)':
dependencies:
serialize-javascript: 6.0.2
smob: 1.5.0
terser: 5.43.1
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rollup/pluginutils@5.2.0(rollup@3.29.5)':
+ '@rollup/plugin-typescript@12.3.0(rollup@4.60.1)(tslib@2.8.1)(typescript@5.9.3)':
+ dependencies:
+ '@rollup/pluginutils': 5.2.0(rollup@4.60.1)
+ resolve: 1.22.10
+ typescript: 5.9.3
+ optionalDependencies:
+ rollup: 4.60.1
+ tslib: 2.8.1
+
+ '@rollup/pluginutils@5.2.0(rollup@4.60.1)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- '@rtsao/scc@1.1.0': {}
+ '@rollup/rollup-android-arm-eabi@4.60.1':
+ optional: true
- '@rushstack/eslint-patch@1.12.0': {}
+ '@rollup/rollup-android-arm64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.60.1':
+ optional: true
+
+ '@rrweb/types@2.0.0-alpha.20': {}
+
+ '@schummar/icu-type-parser@1.21.5': {}
'@sinclair/typebox@0.27.8': {}
+ '@sinclair/typebox@0.34.40': {}
+
+ '@sindresorhus/merge-streams@2.3.0': {}
+
'@sinonjs/commons@3.0.1':
dependencies:
type-detect: 4.0.8
@@ -8646,56 +9474,74 @@ snapshots:
dependencies:
'@sinonjs/commons': 3.0.1
- '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.0)':
- dependencies:
- '@babel/core': 7.28.0
+ '@standard-schema/spec@1.1.0': {}
- '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- '@svgr/babel-preset@8.1.0(@babel/core@7.28.0)':
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.0)
- '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
- '@svgr/core@8.1.0(typescript@5.8.3)':
+ '@svgr/babel-preset@8.1.0(@babel/core@7.28.3)':
dependencies:
- '@babel/core': 7.28.0
- '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0)
+ '@babel/core': 7.28.3
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.3)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.3)
+
+ '@svgr/cli@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ '@svgr/plugin-prettier': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)
camelcase: 6.3.0
- cosmiconfig: 8.3.6(typescript@5.8.3)
+ chalk: 4.1.2
+ commander: 9.5.0
+ dashify: 2.0.0
+ glob: 8.1.0
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/core@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@babel/core': 7.28.3
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.3)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.9.3)
snake-case: 3.0.4
transitivePeerDependencies:
- supports-color
@@ -8703,71 +9549,114 @@ snapshots:
'@svgr/hast-util-to-babel-ast@8.0.0':
dependencies:
- '@babel/types': 7.28.1
+ '@babel/types': 7.28.2
entities: 4.5.0
- '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))':
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))':
dependencies:
- '@babel/core': 7.28.0
- '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0)
- '@svgr/core': 8.1.0(typescript@5.8.3)
+ '@babel/core': 7.28.3
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.3)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
'@svgr/hast-util-to-babel-ast': 8.0.0
svg-parser: 2.0.4
transitivePeerDependencies:
- supports-color
- '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)':
+ '@svgr/plugin-prettier@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))':
dependencies:
- '@svgr/core': 8.1.0(typescript@5.8.3)
- cosmiconfig: 8.3.6(typescript@5.8.3)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ deepmerge: 4.3.1
+ prettier: 2.8.8
+
+ '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)':
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ cosmiconfig: 8.3.6(typescript@5.9.3)
deepmerge: 4.3.1
svgo: 3.3.2
transitivePeerDependencies:
- typescript
- '@svgr/rollup@8.1.0(rollup@3.29.5)(typescript@5.8.3)':
- dependencies:
- '@babel/core': 7.28.0
- '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.0)
- '@babel/preset-env': 7.28.0(@babel/core@7.28.0)
- '@babel/preset-react': 7.27.1(@babel/core@7.28.0)
- '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0)
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
- '@svgr/core': 8.1.0(typescript@5.8.3)
- '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))
- '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)
- transitivePeerDependencies:
- - rollup
- - supports-color
- - typescript
+ '@swc/core-darwin-arm64@1.15.11':
+ optional: true
- '@svgr/webpack@8.1.0(typescript@5.8.3)':
+ '@swc/core-darwin-x64@1.15.11':
+ optional: true
+
+ '@swc/core-linux-arm-gnueabihf@1.15.11':
+ optional: true
+
+ '@swc/core-linux-arm64-gnu@1.15.11':
+ optional: true
+
+ '@swc/core-linux-arm64-musl@1.15.11':
+ optional: true
+
+ '@swc/core-linux-x64-gnu@1.15.11':
+ optional: true
+
+ '@swc/core-linux-x64-musl@1.15.11':
+ optional: true
+
+ '@swc/core-win32-arm64-msvc@1.15.11':
+ optional: true
+
+ '@swc/core-win32-ia32-msvc@1.15.11':
+ optional: true
+
+ '@swc/core-win32-x64-msvc@1.15.11':
+ optional: true
+
+ '@swc/core@1.15.11(@swc/helpers@0.5.20)':
dependencies:
- '@babel/core': 7.28.0
- '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.0)
- '@babel/preset-env': 7.28.0(@babel/core@7.28.0)
- '@babel/preset-react': 7.27.1(@babel/core@7.28.0)
- '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0)
- '@svgr/core': 8.1.0(typescript@5.8.3)
- '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))
- '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@swc/counter': 0.1.3
+ '@swc/types': 0.1.25
+ optionalDependencies:
+ '@swc/core-darwin-arm64': 1.15.11
+ '@swc/core-darwin-x64': 1.15.11
+ '@swc/core-linux-arm-gnueabihf': 1.15.11
+ '@swc/core-linux-arm64-gnu': 1.15.11
+ '@swc/core-linux-arm64-musl': 1.15.11
+ '@swc/core-linux-x64-gnu': 1.15.11
+ '@swc/core-linux-x64-musl': 1.15.11
+ '@swc/core-win32-arm64-msvc': 1.15.11
+ '@swc/core-win32-ia32-msvc': 1.15.11
+ '@swc/core-win32-x64-msvc': 1.15.11
+ '@swc/helpers': 0.5.20
+
+ '@swc/counter@0.1.3': {}
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
- '@tanstack/query-core@5.83.0': {}
-
- '@tanstack/react-query@5.83.0(react@19.1.0)':
+ '@swc/helpers@0.5.18':
dependencies:
- '@tanstack/query-core': 5.83.0
- react: 19.1.0
+ tslib: 2.8.1
+
+ '@swc/helpers@0.5.20':
+ dependencies:
+ tslib: 2.8.1
+
+ '@swc/types@0.1.25':
+ dependencies:
+ '@swc/counter': 0.1.3
+
+ '@tanstack/query-core@5.96.0': {}
+
+ '@tanstack/react-query@5.96.0(react@19.2.4)':
+ dependencies:
+ '@tanstack/query-core': 5.96.0
+ react: 19.2.4
'@trysound/sax@0.2.0': {}
+ '@ts-morph/common@0.28.1':
+ dependencies:
+ minimatch: 10.0.3
+ path-browserify: 1.0.1
+ tinyglobby: 0.2.14
+
'@tsconfig/node10@1.0.11': {}
'@tsconfig/node12@1.0.11': {}
@@ -8776,57 +9665,45 @@ snapshots:
'@tsconfig/node16@1.0.4': {}
- '@tybys/wasm-util@0.10.0':
- dependencies:
- tslib: 2.8.1
- optional: true
+ '@tsconfig/svelte@1.0.13': {}
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.28.0
- '@babel/types': 7.28.1
+ '@babel/parser': 7.28.3
+ '@babel/types': 7.28.2
'@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.20.7
+ '@types/babel__traverse': 7.28.0
'@types/babel__generator@7.27.0':
dependencies:
- '@babel/types': 7.28.1
+ '@babel/types': 7.28.2
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.28.0
- '@babel/types': 7.28.1
+ '@babel/parser': 7.28.3
+ '@babel/types': 7.28.2
- '@types/babel__traverse@7.20.7':
+ '@types/babel__traverse@7.28.0':
dependencies:
- '@babel/types': 7.28.1
+ '@babel/types': 7.28.2
- '@types/estree@0.0.50': {}
+ '@types/css-font-loading-module@0.0.7': {}
'@types/estree@1.0.8': {}
'@types/fs-extra@8.1.5':
dependencies:
- '@types/node': 22.16.5
-
- '@types/fs-extra@9.0.13':
- dependencies:
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 6.0.0
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
'@types/graceful-fs@4.1.9':
dependencies:
- '@types/node': 22.16.5
-
- '@types/hoist-non-react-statics@3.3.6':
- dependencies:
- '@types/react': 19.1.8
- hoist-non-react-statics: 3.3.2
+ '@types/node': 24.12.0
'@types/istanbul-lib-coverage@2.0.6': {}
@@ -8838,60 +9715,37 @@ snapshots:
dependencies:
'@types/istanbul-lib-report': 3.0.3
- '@types/jest@29.5.14':
+ '@types/jest@30.0.0':
dependencies:
- expect: 29.7.0
- pretty-format: 29.7.0
+ expect: 30.1.1
+ pretty-format: 30.0.5
'@types/json-schema@7.0.15': {}
- '@types/json-stable-stringify@1.2.0':
- dependencies:
- json-stable-stringify: 1.3.0
-
- '@types/json5@0.0.29': {}
-
'@types/minimatch@6.0.0':
dependencies:
minimatch: 10.0.3
- '@types/minimist@1.2.5': {}
-
- '@types/node@14.18.63': {}
-
- '@types/node@22.16.5':
+ '@types/node@24.12.0':
dependencies:
- undici-types: 6.21.0
+ undici-types: 7.16.0
- '@types/normalize-package-data@2.4.4': {}
-
- '@types/prop-types@15.7.15': {}
-
- '@types/react-dom@19.1.6(@types/react@19.1.8)':
+ '@types/pg@8.20.0':
dependencies:
- '@types/react': 19.1.8
+ '@types/node': 24.12.0
+ pg-protocol: 1.13.0
+ pg-types: 2.2.0
- '@types/react-window@1.8.8':
+ '@types/react-dom@19.2.3(@types/react@19.2.14)':
dependencies:
- '@types/react': 19.1.8
+ '@types/react': 19.2.14
- '@types/react@18.3.23':
+ '@types/react@19.2.14':
dependencies:
- '@types/prop-types': 15.7.15
- csstype: 3.1.3
-
- '@types/react@19.1.8':
- dependencies:
- csstype: 3.1.3
+ csstype: 3.2.3
'@types/resolve@1.20.2': {}
- '@types/schema-utils@2.4.0':
- dependencies:
- schema-utils: 2.7.1
-
- '@types/semver@7.7.0': {}
-
'@types/sinonjs__fake-timers@8.1.1': {}
'@types/sizzle@2.3.9': {}
@@ -8908,261 +9762,30 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
optional: true
- '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)':
+ '@umami/react-zen@0.245.0(@types/react@19.2.14)(immer@11.1.4)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4))':
dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@8.1.1)
- eslint: 8.57.1
- graphemer: 1.4.0
- ignore: 5.3.2
- natural-compare: 1.4.0
- semver: 7.7.2
- ts-api-utils: 1.4.3(typescript@5.8.3)
- optionalDependencies:
- typescript: 5.8.3
+ '@internationalized/date': 3.11.0
+ '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-spring/web': 9.7.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ lucide-react: 0.555.0(react@19.2.4)
+ react: 19.2.4
+ react-aria-components: 1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react-dom: 19.2.4(react@19.2.4)
+ react-hook-form: 7.71.1(react@19.2.4)
+ tailwind-merge: 3.4.0
+ tailwind-variants: 3.2.2(tailwind-merge@3.4.0)(tailwindcss@4.1.18)
+ zustand: 5.0.12(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
transitivePeerDependencies:
- - supports-color
+ - '@types/react'
+ - immer
+ - tailwindcss
+ - use-sync-external-store
- '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)':
- dependencies:
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3)
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@8.1.1)
- eslint: 8.57.1
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/scope-manager@5.62.0':
- dependencies:
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/visitor-keys': 5.62.0
-
- '@typescript-eslint/scope-manager@6.21.0':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/visitor-keys': 6.21.0
-
- '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)':
- dependencies:
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- debug: 4.4.1(supports-color@8.1.1)
- eslint: 8.57.1
- ts-api-utils: 1.4.3(typescript@5.8.3)
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/types@5.62.0': {}
-
- '@typescript-eslint/types@6.21.0': {}
-
- '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)':
- dependencies:
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/visitor-keys': 5.62.0
- debug: 4.4.1(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.7.2
- tsutils: 3.21.0(typescript@5.8.3)
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.3
- semver: 7.7.2
- ts-api-utils: 1.4.3(typescript@5.8.3)
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.7.0
- '@typescript-eslint/scope-manager': 5.62.0
- '@typescript-eslint/types': 5.62.0
- '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3)
- eslint: 8.57.1
- eslint-scope: 5.1.1
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.7.0
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3)
- eslint: 8.57.1
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/visitor-keys@5.62.0':
- dependencies:
- '@typescript-eslint/types': 5.62.0
- eslint-visitor-keys: 3.4.3
-
- '@typescript-eslint/visitor-keys@6.21.0':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- eslint-visitor-keys: 3.4.3
-
- '@umami/redis-client@0.26.0':
- dependencies:
- debug: 4.4.1(supports-color@8.1.1)
- redis: 4.7.1
- transitivePeerDependencies:
- - supports-color
-
- '@ungap/structured-clone@1.3.0': {}
-
- '@unrs/resolver-binding-android-arm-eabi@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-android-arm64@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-darwin-arm64@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-darwin-x64@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-freebsd-x64@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-linux-x64-musl@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-wasm32-wasi@1.11.1':
- dependencies:
- '@napi-rs/wasm-runtime': 0.2.12
- optional: true
-
- '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
- optional: true
-
- '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
- optional: true
-
- '@vue/compiler-core@3.5.17':
- dependencies:
- '@babel/parser': 7.28.0
- '@vue/shared': 3.5.17
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.2.1
-
- '@vue/compiler-dom@3.5.17':
- dependencies:
- '@vue/compiler-core': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/compiler-sfc@3.5.17':
- dependencies:
- '@babel/parser': 7.28.0
- '@vue/compiler-core': 3.5.17
- '@vue/compiler-dom': 3.5.17
- '@vue/compiler-ssr': 3.5.17
- '@vue/shared': 3.5.17
- estree-walker: 2.0.2
- magic-string: 0.30.17
- postcss: 8.5.6
- source-map-js: 1.2.1
-
- '@vue/compiler-ssr@3.5.17':
- dependencies:
- '@vue/compiler-dom': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/reactivity@3.5.17':
- dependencies:
- '@vue/shared': 3.5.17
-
- '@vue/runtime-core@3.5.17':
- dependencies:
- '@vue/reactivity': 3.5.17
- '@vue/shared': 3.5.17
-
- '@vue/runtime-dom@3.5.17':
- dependencies:
- '@vue/reactivity': 3.5.17
- '@vue/runtime-core': 3.5.17
- '@vue/shared': 3.5.17
- csstype: 3.1.3
-
- '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))':
- dependencies:
- '@vue/compiler-ssr': 3.5.17
- '@vue/shared': 3.5.17
- vue: 3.5.17(typescript@4.9.5)
-
- '@vue/shared@3.5.17': {}
-
- acorn-jsx@5.3.2(acorn@8.15.0):
- dependencies:
- acorn: 8.15.0
+ '@xstate/fsm@1.6.5': {}
acorn-walk@8.3.4:
dependencies:
@@ -9175,21 +9798,10 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
- ajv-keywords@3.5.2(ajv@6.12.6):
- dependencies:
- ajv: 6.12.6
-
- ajv@6.12.6:
+ ajv@8.18.0:
dependencies:
fast-deep-equal: 3.1.3
- fast-json-stable-stringify: 2.1.0
- json-schema-traverse: 0.4.1
- uri-js: 4.4.1
-
- ajv@8.17.1:
- dependencies:
- fast-deep-equal: 3.1.3
- fast-uri: 3.0.6
+ fast-uri: 3.1.0
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
@@ -9199,13 +9811,9 @@ snapshots:
dependencies:
type-fest: 0.21.3
- ansi-escapes@5.0.0:
- dependencies:
- type-fest: 1.4.0
-
ansi-regex@5.0.1: {}
- ansi-regex@6.1.0: {}
+ ansi-regex@6.2.2: {}
ansi-styles@3.2.1:
dependencies:
@@ -9217,7 +9825,9 @@ snapshots:
ansi-styles@5.2.0: {}
- ansi-styles@6.2.1: {}
+ ansi-styles@6.2.3: {}
+
+ any-promise@1.3.0: {}
anymatch@3.1.3:
dependencies:
@@ -9234,69 +9844,13 @@ snapshots:
argparse@2.0.1: {}
- aria-query@5.3.2: {}
-
array-buffer-byte-length@1.0.2:
dependencies:
call-bound: 1.0.4
is-array-buffer: 3.0.5
- array-find-index@1.0.2: {}
-
- array-includes@3.1.9:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
- is-string: 1.1.1
- math-intrinsics: 1.1.0
-
array-union@2.1.0: {}
- array.prototype.findlast@1.2.5:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-shim-unscopables: 1.1.0
-
- array.prototype.findlastindex@1.2.6:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-shim-unscopables: 1.1.0
-
- array.prototype.flat@1.3.3:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-shim-unscopables: 1.1.0
-
- array.prototype.flatmap@1.3.3:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-shim-unscopables: 1.1.0
-
- array.prototype.tosorted@1.1.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-shim-unscopables: 1.1.0
-
arraybuffer.prototype.slice@1.0.4:
dependencies:
array-buffer-byte-length: 1.0.2
@@ -9307,16 +9861,12 @@ snapshots:
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
- arrify@1.0.1: {}
-
asn1@0.2.6:
dependencies:
safer-buffer: 2.1.2
assert-plus@1.0.0: {}
- ast-types-flow@0.0.8: {}
-
astral-regex@2.0.0: {}
async-function@1.0.0: {}
@@ -9327,14 +9877,14 @@ snapshots:
at-least-node@1.0.0: {}
- autoprefixer@10.4.21(postcss@8.5.6):
+ autoprefixer@10.4.21(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
- caniuse-lite: 1.0.30001743
+ browserslist: 4.25.2
+ caniuse-lite: 1.0.30001780
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.1
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
@@ -9343,19 +9893,17 @@ snapshots:
aws-sign2@0.7.0: {}
+ aws-ssl-profiles@1.1.2: {}
+
aws4@1.13.2: {}
- axe-core@4.10.3: {}
-
- axobject-query@4.1.0: {}
-
- babel-jest@29.7.0(@babel/core@7.28.0):
+ babel-jest@29.7.0(@babel/core@7.28.3):
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@jest/transform': 29.7.0
'@types/babel__core': 7.20.5
babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.28.0)
+ babel-preset-jest: 29.6.3(@babel/core@7.28.3)
chalk: 4.1.2
graceful-fs: 4.2.11
slash: 3.0.0
@@ -9375,86 +9923,56 @@ snapshots:
babel-plugin-jest-hoist@29.6.3:
dependencies:
'@babel/template': 7.27.2
- '@babel/types': 7.28.1
+ '@babel/types': 7.28.2
'@types/babel__core': 7.20.5
- '@types/babel__traverse': 7.20.7
+ '@types/babel__traverse': 7.28.0
- babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0):
+ babel-plugin-react-compiler@19.1.0-rc.2:
dependencies:
- '@babel/compat-data': 7.28.0
- '@babel/core': 7.28.0
- '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0)
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
+ '@babel/types': 7.28.2
- babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0):
+ babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.3):
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0)
- core-js-compat: 3.44.0
- transitivePeerDependencies:
- - supports-color
+ '@babel/core': 7.28.3
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3)
- babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0):
+ babel-preset-jest@29.6.3(@babel/core@7.28.3):
dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0)
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-react-intl@7.9.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)):
- dependencies:
- '@babel/core': 7.28.0
- '@babel/helper-plugin-utils': 7.27.1
- '@babel/types': 7.28.1
- '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))
- '@types/babel__core': 7.20.5
- '@types/fs-extra': 9.0.13
- '@types/schema-utils': 2.4.0
- fs-extra: 9.1.0
- intl-messageformat-parser: 5.5.1
- schema-utils: 2.7.1
- transitivePeerDependencies:
- - supports-color
- - ts-jest
-
- babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0):
- dependencies:
- '@babel/core': 7.28.0
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0)
- '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0)
-
- babel-preset-jest@29.6.3(@babel/core@7.28.0):
- dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0)
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3)
balanced-match@1.0.2: {}
- balanced-match@2.0.0: {}
+ base64-arraybuffer@1.0.2: {}
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.10.12: {}
+
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
- bcryptjs@2.4.3: {}
+ bcryptjs@3.0.3: {}
+
+ better-result@2.7.0:
+ dependencies:
+ '@clack/prompts': 0.11.0
blob-util@2.0.2: {}
@@ -9475,12 +9993,12 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.25.1:
+ browserslist@4.25.2:
dependencies:
- caniuse-lite: 1.0.30001743
- electron-to-chromium: 1.5.187
+ caniuse-lite: 1.0.30001780
+ electron-to-chromium: 1.5.202
node-releases: 2.0.19
- update-browserslist-db: 1.1.3(browserslist@4.25.1)
+ update-browserslist-db: 1.1.3(browserslist@4.25.2)
bs-logger@0.2.6:
dependencies:
@@ -9501,6 +10019,28 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
+ bundle-require@5.1.0(esbuild@0.27.4):
+ dependencies:
+ esbuild: 0.27.4
+ load-tsconfig: 0.2.5
+
+ c12@3.1.0:
+ dependencies:
+ chokidar: 4.0.3
+ confbox: 0.2.4
+ defu: 6.1.4
+ dotenv: 16.6.1
+ exsolve: 1.0.8
+ giget: 2.0.0
+ jiti: 2.6.1
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ pkg-types: 2.3.0
+ rc9: 2.1.2
+
+ cac@6.7.14: {}
+
cachedir@2.4.0: {}
call-bind-apply-helpers@1.0.2:
@@ -9522,31 +10062,20 @@ snapshots:
callsites@3.1.0: {}
- camelcase-keys@6.2.2:
- dependencies:
- camelcase: 5.3.1
- map-obj: 4.3.0
- quick-lru: 4.0.1
-
- camelcase-keys@7.0.2:
- dependencies:
- camelcase: 6.3.0
- map-obj: 4.3.0
- quick-lru: 5.1.1
- type-fest: 1.4.0
-
camelcase@5.3.1: {}
camelcase@6.3.0: {}
caniuse-api@3.0.0:
dependencies:
- browserslist: 4.25.1
- caniuse-lite: 1.0.30001743
+ browserslist: 4.25.2
+ caniuse-lite: 1.0.30001780
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
- caniuse-lite@1.0.30001743: {}
+ caniuse-lite@1.0.30001780: {}
+
+ caniuse-lite@1.0.30001781: {}
caseless@0.12.0: {}
@@ -9561,29 +10090,37 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
- chalk@5.3.0: {}
+ chalk@5.6.2: {}
char-regex@1.0.2: {}
- charenc@0.0.2: {}
-
- chart.js@4.5.0:
+ chart.js@4.5.1:
dependencies:
'@kurkle/color': 0.3.4
- chartjs-adapter-date-fns@3.0.0(chart.js@4.5.0)(date-fns@2.30.0):
+ chartjs-adapter-date-fns@3.0.0(chart.js@4.5.1)(date-fns@2.30.0):
dependencies:
- chart.js: 4.5.0
+ chart.js: 4.5.1
date-fns: 2.30.0
check-more-types@2.24.0: {}
- chownr@2.0.0: {}
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chownr@3.0.0: {}
ci-info@3.9.0: {}
ci-info@4.3.0: {}
+ citty@0.1.6:
+ dependencies:
+ consola: 3.4.2
+
+ citty@0.2.1: {}
+
cjs-module-lexer@1.4.3: {}
classnames@2.5.1: {}
@@ -9594,10 +10131,6 @@ snapshots:
dependencies:
restore-cursor: 3.1.0
- cli-cursor@4.0.0:
- dependencies:
- restore-cursor: 4.0.0
-
cli-table3@0.6.5:
dependencies:
string-width: 4.2.3
@@ -9609,11 +10142,6 @@ snapshots:
slice-ansi: 3.0.0
string-width: 4.2.3
- cli-truncate@3.1.0:
- dependencies:
- slice-ansi: 5.0.0
- string-width: 5.1.2
-
client-only@0.0.1: {}
cliui@8.0.1:
@@ -9622,10 +10150,14 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ clsx@2.1.1: {}
+
cluster-key-slot@1.1.2: {}
co@4.6.0: {}
+ code-block-writer@13.0.3: {}
+
collect-v8-coverage@1.0.2: {}
color-convert@1.9.3:
@@ -9650,15 +10182,15 @@ snapshots:
dependencies:
delayed-stream: 1.0.0
- commander@11.0.0: {}
-
commander@2.20.3: {}
+ commander@4.1.1: {}
+
commander@6.2.1: {}
commander@7.2.0: {}
- commander@8.3.0: {}
+ commander@9.5.0: {}
common-tags@1.8.2: {}
@@ -9670,35 +10202,39 @@ snapshots:
dependencies:
source-map: 0.6.1
- convert-source-map@2.0.0: {}
+ confbox@0.1.8: {}
- core-js-compat@3.44.0:
- dependencies:
- browserslist: 4.25.1
+ confbox@0.2.4: {}
+
+ consola@3.4.2: {}
+
+ convert-source-map@2.0.0: {}
core-util-is@1.0.2: {}
- cors@2.8.5:
+ core-util-is@1.0.3: {}
+
+ cors@2.8.6:
dependencies:
object-assign: 4.1.1
vary: 1.1.2
- cosmiconfig@8.3.6(typescript@5.8.3):
+ cosmiconfig@8.3.6(typescript@5.9.3):
dependencies:
import-fresh: 3.3.1
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
- typescript: 5.8.3
+ typescript: 5.9.3
- create-jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ create-jest@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
'@jest/types': 29.6.3
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ jest-config: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -9709,8 +10245,9 @@ snapshots:
create-require@1.1.1: {}
- cross-env@7.0.3:
+ cross-env@10.1.0:
dependencies:
+ '@epic-web/invariant': 1.0.0
cross-spawn: 7.0.6
cross-spawn@6.0.6:
@@ -9727,31 +10264,27 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
- crypt@0.0.2: {}
-
- css-blank-pseudo@3.0.3(postcss@8.5.6):
+ css-blank-pseudo@3.0.3(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
css-box-model@1.2.1:
dependencies:
tiny-invariant: 1.3.3
- css-declaration-sorter@6.4.1(postcss@8.5.6):
+ css-declaration-sorter@6.4.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- css-functions-list@3.2.3: {}
-
- css-has-pseudo@3.0.4(postcss@8.5.6):
+ css-has-pseudo@3.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- css-prefers-color-scheme@6.0.3(postcss@8.5.6):
+ css-prefers-color-scheme@6.0.3(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
css-select@4.3.0:
dependencies:
@@ -9796,48 +10329,48 @@ snapshots:
cssesc@3.0.0: {}
- cssnano-preset-default@5.2.14(postcss@8.5.6):
+ cssnano-preset-default@5.2.14(postcss@8.5.8):
dependencies:
- css-declaration-sorter: 6.4.1(postcss@8.5.6)
- cssnano-utils: 3.1.0(postcss@8.5.6)
- postcss: 8.5.6
- postcss-calc: 8.2.4(postcss@8.5.6)
- postcss-colormin: 5.3.1(postcss@8.5.6)
- postcss-convert-values: 5.1.3(postcss@8.5.6)
- postcss-discard-comments: 5.1.2(postcss@8.5.6)
- postcss-discard-duplicates: 5.1.0(postcss@8.5.6)
- postcss-discard-empty: 5.1.1(postcss@8.5.6)
- postcss-discard-overridden: 5.1.0(postcss@8.5.6)
- postcss-merge-longhand: 5.1.7(postcss@8.5.6)
- postcss-merge-rules: 5.1.4(postcss@8.5.6)
- postcss-minify-font-values: 5.1.0(postcss@8.5.6)
- postcss-minify-gradients: 5.1.1(postcss@8.5.6)
- postcss-minify-params: 5.1.4(postcss@8.5.6)
- postcss-minify-selectors: 5.2.1(postcss@8.5.6)
- postcss-normalize-charset: 5.1.0(postcss@8.5.6)
- postcss-normalize-display-values: 5.1.0(postcss@8.5.6)
- postcss-normalize-positions: 5.1.1(postcss@8.5.6)
- postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6)
- postcss-normalize-string: 5.1.0(postcss@8.5.6)
- postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6)
- postcss-normalize-unicode: 5.1.1(postcss@8.5.6)
- postcss-normalize-url: 5.1.0(postcss@8.5.6)
- postcss-normalize-whitespace: 5.1.1(postcss@8.5.6)
- postcss-ordered-values: 5.1.3(postcss@8.5.6)
- postcss-reduce-initial: 5.1.2(postcss@8.5.6)
- postcss-reduce-transforms: 5.1.0(postcss@8.5.6)
- postcss-svgo: 5.1.0(postcss@8.5.6)
- postcss-unique-selectors: 5.1.1(postcss@8.5.6)
+ css-declaration-sorter: 6.4.1(postcss@8.5.8)
+ cssnano-utils: 3.1.0(postcss@8.5.8)
+ postcss: 8.5.8
+ postcss-calc: 8.2.4(postcss@8.5.8)
+ postcss-colormin: 5.3.1(postcss@8.5.8)
+ postcss-convert-values: 5.1.3(postcss@8.5.8)
+ postcss-discard-comments: 5.1.2(postcss@8.5.8)
+ postcss-discard-duplicates: 5.1.0(postcss@8.5.8)
+ postcss-discard-empty: 5.1.1(postcss@8.5.8)
+ postcss-discard-overridden: 5.1.0(postcss@8.5.8)
+ postcss-merge-longhand: 5.1.7(postcss@8.5.8)
+ postcss-merge-rules: 5.1.4(postcss@8.5.8)
+ postcss-minify-font-values: 5.1.0(postcss@8.5.8)
+ postcss-minify-gradients: 5.1.1(postcss@8.5.8)
+ postcss-minify-params: 5.1.4(postcss@8.5.8)
+ postcss-minify-selectors: 5.2.1(postcss@8.5.8)
+ postcss-normalize-charset: 5.1.0(postcss@8.5.8)
+ postcss-normalize-display-values: 5.1.0(postcss@8.5.8)
+ postcss-normalize-positions: 5.1.1(postcss@8.5.8)
+ postcss-normalize-repeat-style: 5.1.1(postcss@8.5.8)
+ postcss-normalize-string: 5.1.0(postcss@8.5.8)
+ postcss-normalize-timing-functions: 5.1.0(postcss@8.5.8)
+ postcss-normalize-unicode: 5.1.1(postcss@8.5.8)
+ postcss-normalize-url: 5.1.0(postcss@8.5.8)
+ postcss-normalize-whitespace: 5.1.1(postcss@8.5.8)
+ postcss-ordered-values: 5.1.3(postcss@8.5.8)
+ postcss-reduce-initial: 5.1.2(postcss@8.5.8)
+ postcss-reduce-transforms: 5.1.0(postcss@8.5.8)
+ postcss-svgo: 5.1.0(postcss@8.5.8)
+ postcss-unique-selectors: 5.1.1(postcss@8.5.8)
- cssnano-utils@3.1.0(postcss@8.5.6):
+ cssnano-utils@3.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- cssnano@5.1.15(postcss@8.5.6):
+ cssnano@5.1.15(postcss@8.5.8):
dependencies:
- cssnano-preset-default: 5.2.14(postcss@8.5.6)
+ cssnano-preset-default: 5.2.14(postcss@8.5.8)
lilconfig: 2.1.0
- postcss: 8.5.6
+ postcss: 8.5.8
yaml: 1.10.2
csso@4.2.0:
@@ -9848,15 +10381,11 @@ snapshots:
dependencies:
css-tree: 2.2.1
- csstype@3.1.3: {}
-
- currently-unhandled@0.4.1:
- dependencies:
- array-find-index: 1.0.2
+ csstype@3.2.3: {}
cypress@13.17.0:
dependencies:
- '@cypress/request': 3.0.8
+ '@cypress/request': 3.0.9
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
'@types/sinonjs__fake-timers': 8.1.1
'@types/sizzle': 2.3.9
@@ -9873,7 +10402,7 @@ snapshots:
commander: 6.2.1
common-tags: 1.8.2
dayjs: 1.11.13
- debug: 4.4.1(supports-color@8.1.1)
+ debug: 4.4.3(supports-color@8.1.1)
enquirer: 2.4.1
eventemitter2: 6.4.7
execa: 4.1.0
@@ -9893,9 +10422,9 @@ snapshots:
process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
- semver: 7.7.2
+ semver: 7.7.4
supports-color: 8.1.1
- tmp: 0.2.3
+ tmp: 0.2.5
tree-kill: 1.2.2
untildify: 4.0.0
yauzl: 2.10.0
@@ -9944,12 +10473,12 @@ snapshots:
d3-selection: 2.0.0
d3-transition: 2.0.0(d3-selection@2.0.0)
- damerau-levenshtein@1.0.8: {}
-
dashdash@1.14.1:
dependencies:
assert-plus: 1.0.0
+ dashify@2.0.0: {}
+
data-uri-to-buffer@4.0.1: {}
data-view-buffer@1.0.2:
@@ -9976,7 +10505,7 @@ snapshots:
date-fns@2.30.0:
dependencies:
- '@babel/runtime': 7.27.6
+ '@babel/runtime': 7.28.3
dayjs@1.11.13: {}
@@ -9986,28 +10515,17 @@ snapshots:
optionalDependencies:
supports-color: 8.1.1
- debug@4.3.4:
- dependencies:
- ms: 2.1.2
-
- debug@4.4.1(supports-color@8.1.1):
+ debug@4.4.3(supports-color@8.1.1):
dependencies:
ms: 2.1.3
optionalDependencies:
supports-color: 8.1.1
- decamelize-keys@1.1.1:
- dependencies:
- decamelize: 1.2.0
- map-obj: 1.0.1
-
- decamelize@1.2.0: {}
-
- decamelize@5.0.1: {}
+ decimal.js@10.6.0: {}
dedent@1.6.0: {}
- deep-is@0.1.4: {}
+ deepmerge-ts@7.1.5: {}
deepmerge@4.3.1: {}
@@ -10023,6 +10541,8 @@ snapshots:
has-property-descriptors: 1.0.2
object-keys: 1.1.1
+ defu@6.1.4: {}
+
del@6.1.1:
dependencies:
globby: 11.1.0
@@ -10034,14 +10554,27 @@ snapshots:
rimraf: 3.0.2
slash: 3.0.0
+ del@8.0.1:
+ dependencies:
+ globby: 14.1.0
+ is-glob: 4.0.3
+ is-path-cwd: 3.0.0
+ is-path-inside: 4.0.0
+ p-map: 7.0.4
+ presentable-error: 0.0.1
+ slash: 5.1.0
+
delayed-stream@1.0.0: {}
+ denque@2.1.0: {}
+
+ destr@2.0.5: {}
+
detect-browser@5.3.0: {}
- detect-indent@6.1.0: {}
+ detect-europe-js@0.1.2: {}
- detect-libc@2.1.0:
- optional: true
+ detect-libc@2.1.2: {}
detect-newline@3.1.0: {}
@@ -10053,14 +10586,6 @@ snapshots:
dependencies:
path-type: 4.0.0
- doctrine@2.1.0:
- dependencies:
- esutils: 2.0.3
-
- doctrine@3.0.0:
- dependencies:
- esutils: 2.0.3
-
dom-serializer@1.4.1:
dependencies:
domelementtype: 2.3.0
@@ -10100,7 +10625,20 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
- dotenv@10.0.0: {}
+ dotenv-cli@11.0.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ dotenv: 17.3.1
+ dotenv-expand: 12.0.3
+ minimist: 1.2.8
+
+ dotenv-expand@12.0.3:
+ dependencies:
+ dotenv: 16.6.1
+
+ dotenv@16.6.1: {}
+
+ dotenv@17.3.1: {}
dunder-proto@1.0.1:
dependencies:
@@ -10119,11 +10657,12 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- ejs@3.1.10:
+ effect@3.20.0:
dependencies:
- jake: 10.9.2
+ '@standard-schema/spec': 1.1.0
+ fast-check: 3.23.2
- electron-to-chromium@1.5.187: {}
+ electron-to-chromium@1.5.202: {}
emittery@0.13.1: {}
@@ -10131,6 +10670,8 @@ snapshots:
emoji-regex@9.2.2: {}
+ empathic@2.0.0: {}
+
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
@@ -10144,6 +10685,8 @@ snapshots:
entities@4.5.0: {}
+ env-paths@3.0.0: {}
+
error-ex@1.3.2:
dependencies:
is-arrayish: 0.2.1
@@ -10209,27 +10752,6 @@ snapshots:
es-errors@1.3.0: {}
- es-iterator-helpers@1.2.1:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-set-tostringtag: 2.1.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- iterator.prototype: 1.1.5
- safe-array-concat: 1.1.3
-
- es-module-lexer@1.7.0: {}
-
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@@ -10241,51 +10763,40 @@ snapshots:
has-tostringtag: 1.0.2
hasown: 2.0.2
- es-shim-unscopables@1.1.0:
- dependencies:
- hasown: 2.0.2
-
es-to-primitive@1.3.0:
dependencies:
is-callable: 1.2.7
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild-register@3.6.0(esbuild@0.25.8):
- dependencies:
- debug: 4.4.1(supports-color@8.1.1)
- esbuild: 0.25.8
- transitivePeerDependencies:
- - supports-color
-
- esbuild@0.25.8:
+ esbuild@0.27.4:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.8
- '@esbuild/android-arm': 0.25.8
- '@esbuild/android-arm64': 0.25.8
- '@esbuild/android-x64': 0.25.8
- '@esbuild/darwin-arm64': 0.25.8
- '@esbuild/darwin-x64': 0.25.8
- '@esbuild/freebsd-arm64': 0.25.8
- '@esbuild/freebsd-x64': 0.25.8
- '@esbuild/linux-arm': 0.25.8
- '@esbuild/linux-arm64': 0.25.8
- '@esbuild/linux-ia32': 0.25.8
- '@esbuild/linux-loong64': 0.25.8
- '@esbuild/linux-mips64el': 0.25.8
- '@esbuild/linux-ppc64': 0.25.8
- '@esbuild/linux-riscv64': 0.25.8
- '@esbuild/linux-s390x': 0.25.8
- '@esbuild/linux-x64': 0.25.8
- '@esbuild/netbsd-arm64': 0.25.8
- '@esbuild/netbsd-x64': 0.25.8
- '@esbuild/openbsd-arm64': 0.25.8
- '@esbuild/openbsd-x64': 0.25.8
- '@esbuild/openharmony-arm64': 0.25.8
- '@esbuild/sunos-x64': 0.25.8
- '@esbuild/win32-arm64': 0.25.8
- '@esbuild/win32-ia32': 0.25.8
- '@esbuild/win32-x64': 0.25.8
+ '@esbuild/aix-ppc64': 0.27.4
+ '@esbuild/android-arm': 0.27.4
+ '@esbuild/android-arm64': 0.27.4
+ '@esbuild/android-x64': 0.27.4
+ '@esbuild/darwin-arm64': 0.27.4
+ '@esbuild/darwin-x64': 0.27.4
+ '@esbuild/freebsd-arm64': 0.27.4
+ '@esbuild/freebsd-x64': 0.27.4
+ '@esbuild/linux-arm': 0.27.4
+ '@esbuild/linux-arm64': 0.27.4
+ '@esbuild/linux-ia32': 0.27.4
+ '@esbuild/linux-loong64': 0.27.4
+ '@esbuild/linux-mips64el': 0.27.4
+ '@esbuild/linux-ppc64': 0.27.4
+ '@esbuild/linux-riscv64': 0.27.4
+ '@esbuild/linux-s390x': 0.27.4
+ '@esbuild/linux-x64': 0.27.4
+ '@esbuild/netbsd-arm64': 0.27.4
+ '@esbuild/netbsd-x64': 0.27.4
+ '@esbuild/openbsd-arm64': 0.27.4
+ '@esbuild/openbsd-x64': 0.27.4
+ '@esbuild/openharmony-arm64': 0.27.4
+ '@esbuild/sunos-x64': 0.27.4
+ '@esbuild/win32-arm64': 0.27.4
+ '@esbuild/win32-ia32': 0.27.4
+ '@esbuild/win32-x64': 0.27.4
escalade@3.2.0: {}
@@ -10293,265 +10804,16 @@ snapshots:
escape-string-regexp@2.0.0: {}
- escape-string-regexp@4.0.0: {}
-
- eslint-config-next@14.2.30(eslint@8.57.1)(typescript@5.8.3):
- dependencies:
- '@next/eslint-plugin-next': 14.2.30
- '@rushstack/eslint-patch': 1.12.0
- '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- eslint: 8.57.1
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1)
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
- eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
- eslint-plugin-react: 7.37.5(eslint@8.57.1)
- eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1)
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - eslint-import-resolver-webpack
- - eslint-plugin-import-x
- - supports-color
-
- eslint-config-prettier@8.10.2(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
-
- eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0):
- dependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
-
- eslint-import-resolver-node@0.3.9:
- dependencies:
- debug: 3.2.7(supports-color@8.1.1)
- is-core-module: 2.16.1
- resolve: 1.22.10
- transitivePeerDependencies:
- - supports-color
-
- eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1):
- dependencies:
- '@nolyfill/is-core-module': 1.0.39
- debug: 4.4.1(supports-color@8.1.1)
- eslint: 8.57.1
- get-tsconfig: 4.10.1
- is-bun-module: 2.0.0
- stable-hash: 0.0.5
- tinyglobby: 0.2.14
- unrs-resolver: 1.11.1
- optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
- transitivePeerDependencies:
- - supports-color
-
- eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
- dependencies:
- debug: 3.2.7(supports-color@8.1.1)
- optionalDependencies:
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- eslint: 8.57.1
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1)
- transitivePeerDependencies:
- - supports-color
-
- eslint-plugin-css-modules@2.12.0(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
- gonzales-pe: 4.3.0
- lodash: 4.17.21
-
- eslint-plugin-cypress@2.15.2(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
- globals: 13.24.0
-
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1):
- dependencies:
- '@rtsao/scc': 1.1.0
- array-includes: 3.1.9
- array.prototype.findlastindex: 1.2.6
- array.prototype.flat: 1.3.3
- array.prototype.flatmap: 1.3.3
- debug: 3.2.7(supports-color@8.1.1)
- doctrine: 2.1.0
- eslint: 8.57.1
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)
- hasown: 2.0.2
- is-core-module: 2.16.1
- is-glob: 4.0.3
- minimatch: 3.1.2
- object.fromentries: 2.0.8
- object.groupby: 1.0.3
- object.values: 1.2.1
- semver: 6.3.1
- string.prototype.trimend: 1.0.9
- tsconfig-paths: 3.15.0
- optionalDependencies:
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3)
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
-
- eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3):
- dependencies:
- '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3)
- eslint: 8.57.1
- optionalDependencies:
- '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)
- jest: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1):
- dependencies:
- aria-query: 5.3.2
- array-includes: 3.1.9
- array.prototype.flatmap: 1.3.3
- ast-types-flow: 0.0.8
- axe-core: 4.10.3
- axobject-query: 4.1.0
- damerau-levenshtein: 1.0.8
- emoji-regex: 9.2.2
- eslint: 8.57.1
- hasown: 2.0.2
- jsx-ast-utils: 3.3.5
- language-tags: 1.0.9
- minimatch: 3.1.2
- object.fromentries: 2.0.8
- safe-regex-test: 1.1.0
- string.prototype.includes: 2.0.1
-
- eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8):
- dependencies:
- eslint: 8.57.1
- prettier: 2.8.8
- prettier-linter-helpers: 1.0.0
- optionalDependencies:
- eslint-config-prettier: 8.10.2(eslint@8.57.1)
-
- eslint-plugin-promise@6.6.0(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
-
- eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
-
- eslint-plugin-react@7.37.5(eslint@8.57.1):
- dependencies:
- array-includes: 3.1.9
- array.prototype.findlast: 1.2.5
- array.prototype.flatmap: 1.3.3
- array.prototype.tosorted: 1.1.4
- doctrine: 2.1.0
- es-iterator-helpers: 1.2.1
- eslint: 8.57.1
- estraverse: 5.3.0
- hasown: 2.0.2
- jsx-ast-utils: 3.3.5
- minimatch: 3.1.2
- object.entries: 1.1.9
- object.fromentries: 2.0.8
- object.values: 1.2.1
- prop-types: 15.8.1
- resolve: 2.0.0-next.5
- semver: 6.3.1
- string.prototype.matchall: 4.0.12
- string.prototype.repeat: 1.0.0
-
- eslint-scope@5.1.1:
- dependencies:
- esrecurse: 4.3.0
- estraverse: 4.3.0
-
- eslint-scope@7.2.2:
- dependencies:
- esrecurse: 4.3.0
- estraverse: 5.3.0
-
- eslint-visitor-keys@3.4.3: {}
-
- eslint@8.57.1:
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
- '@eslint-community/regexpp': 4.12.1
- '@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.57.1
- '@humanwhocodes/config-array': 0.13.0
- '@humanwhocodes/module-importer': 1.0.1
- '@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.3.0
- ajv: 6.12.6
- chalk: 4.1.2
- cross-spawn: 7.0.6
- debug: 4.4.1(supports-color@8.1.1)
- doctrine: 3.0.0
- escape-string-regexp: 4.0.0
- eslint-scope: 7.2.2
- eslint-visitor-keys: 3.4.3
- espree: 9.6.1
- esquery: 1.6.0
- esutils: 2.0.3
- fast-deep-equal: 3.1.3
- file-entry-cache: 6.0.1
- find-up: 5.0.0
- glob-parent: 6.0.2
- globals: 13.24.0
- graphemer: 1.4.0
- ignore: 5.3.2
- imurmurhash: 0.1.4
- is-glob: 4.0.3
- is-path-inside: 3.0.3
- js-yaml: 4.1.0
- json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
- lodash.merge: 4.6.2
- minimatch: 3.1.2
- natural-compare: 1.4.0
- optionator: 0.9.4
- strip-ansi: 6.0.1
- text-table: 0.2.0
- transitivePeerDependencies:
- - supports-color
-
- espree@9.6.1:
- dependencies:
- acorn: 8.15.0
- acorn-jsx: 5.3.2(acorn@8.15.0)
- eslint-visitor-keys: 3.4.3
-
esprima@4.0.1: {}
- esquery@1.6.0:
- dependencies:
- estraverse: 5.3.0
-
- esrecurse@4.3.0:
- dependencies:
- estraverse: 5.3.0
-
- estraverse@4.3.0: {}
-
- estraverse@5.3.0: {}
-
estree-walker@0.6.1: {}
estree-walker@2.0.2: {}
- esutils@2.0.3: {}
-
eventemitter2@6.4.7: {}
eventemitter3@4.0.7: {}
- eventemitter3@5.0.1: {}
-
execa@4.1.0:
dependencies:
cross-spawn: 7.0.6
@@ -10576,18 +10838,6 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
- execa@7.2.0:
- dependencies:
- cross-spawn: 7.0.6
- get-stream: 6.0.1
- human-signals: 4.3.1
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.3.0
- onetime: 6.0.0
- signal-exit: 3.0.7
- strip-final-newline: 3.0.0
-
executable@4.1.1:
dependencies:
pify: 2.3.0
@@ -10602,32 +10852,22 @@ snapshots:
jest-message-util: 29.7.0
jest-util: 29.7.0
- extend@3.0.2: {}
-
- extract-react-intl-messages@4.1.1(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3)):
+ expect@30.1.1:
dependencies:
- '@babel/core': 7.28.0
- babel-plugin-react-intl: 7.9.4(ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3))
- flat: 5.0.2
- glob: 7.2.3
- js-yaml: 3.14.1
- load-json-file: 6.2.0
- lodash.merge: 4.6.2
- lodash.mergewith: 4.6.2
- lodash.pick: 4.4.0
- meow: 6.1.1
- mkdirp: 1.0.4
- pify: 5.0.0
- read-babelrc-up: 1.1.0
- sort-keys: 4.2.0
- write-json-file: 4.3.0
- transitivePeerDependencies:
- - supports-color
- - ts-jest
+ '@jest/expect-utils': 30.1.1
+ '@jest/get-type': 30.1.0
+ jest-matcher-utils: 30.1.1
+ jest-message-util: 30.1.0
+ jest-mock: 30.0.5
+ jest-util: 30.0.5
+
+ exsolve@1.0.8: {}
+
+ extend@3.0.2: {}
extract-zip@2.0.1(supports-color@8.1.1):
dependencies:
- debug: 4.4.1(supports-color@8.1.1)
+ debug: 4.4.3(supports-color@8.1.1)
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
@@ -10637,9 +10877,11 @@ snapshots:
extsprintf@1.3.0: {}
- fast-deep-equal@3.1.3: {}
+ fast-check@3.23.2:
+ dependencies:
+ pure-rand: 6.1.0
- fast-diff@1.3.0: {}
+ fast-deep-equal@3.1.3: {}
fast-glob@3.3.3:
dependencies:
@@ -10651,11 +10893,7 @@ snapshots:
fast-json-stable-stringify@2.1.0: {}
- fast-levenshtein@2.0.6: {}
-
- fast-uri@3.0.6: {}
-
- fastest-levenshtein@1.0.16: {}
+ fast-uri@3.1.0: {}
fastq@1.19.1:
dependencies:
@@ -10669,7 +10907,7 @@ snapshots:
dependencies:
pend: 1.2.0
- fdir@6.4.6(picomatch@4.0.3):
+ fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -10678,22 +10916,12 @@ snapshots:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
+ fflate@0.4.8: {}
+
figures@3.2.0:
dependencies:
escape-string-regexp: 1.0.5
- file-entry-cache@6.0.1:
- dependencies:
- flat-cache: 3.2.0
-
- file-entry-cache@7.0.2:
- dependencies:
- flat-cache: 3.2.0
-
- filelist@1.0.4:
- dependencies:
- minimatch: 5.1.6
-
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
@@ -10703,20 +10931,11 @@ snapshots:
locate-path: 5.0.0
path-exists: 4.0.0
- find-up@5.0.0:
+ fix-dts-default-cjs-exports@1.0.1:
dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
-
- flat-cache@3.2.0:
- dependencies:
- flatted: 3.3.3
- keyv: 4.5.4
- rimraf: 3.0.2
-
- flat@5.0.2: {}
-
- flatted@3.3.3: {}
+ magic-string: 0.30.21
+ mlly: 1.8.0
+ rollup: 4.60.1
for-each@0.3.5:
dependencies:
@@ -10743,12 +10962,6 @@ snapshots:
fraction.js@4.3.7: {}
- fs-extra@10.1.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.1
-
fs-extra@8.1.0:
dependencies:
graceful-fs: 4.2.11
@@ -10759,13 +10972,9 @@ snapshots:
dependencies:
at-least-node: 1.0.0
graceful-fs: 4.2.11
- jsonfile: 6.1.0
+ jsonfile: 6.2.0
universalify: 2.0.1
- fs-minipass@2.1.0:
- dependencies:
- minipass: 3.3.6
-
fs.realpath@1.0.0: {}
fsevents@2.3.3:
@@ -10784,6 +10993,10 @@ snapshots:
functions-have-names@1.2.3: {}
+ generate-function@2.3.1:
+ dependencies:
+ is-property: 1.0.2
+
generic-names@4.0.0:
dependencies:
loader-utils: 3.3.1
@@ -10809,6 +11022,8 @@ snapshots:
get-package-type@0.1.0: {}
+ get-port-please@3.2.0: {}
+
get-proto@1.0.1:
dependencies:
dunder-proto: 1.0.1
@@ -10826,7 +11041,7 @@ snapshots:
es-errors: 1.3.0
get-intrinsic: 1.3.0
- get-tsconfig@4.10.1:
+ get-tsconfig@4.13.0:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -10838,20 +11053,26 @@ snapshots:
dependencies:
assert-plus: 1.0.0
+ giget@2.0.0:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.4.2
+ defu: 6.1.4
+ node-fetch-native: 1.6.7
+ nypm: 0.6.5
+ pathe: 2.0.3
+
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
- glob-parent@6.0.2:
- dependencies:
- is-glob: 4.0.3
-
- glob@10.3.10:
+ glob@10.5.0:
dependencies:
foreground-child: 3.3.1
- jackspeak: 2.3.6
+ jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
+ package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@7.2.3:
@@ -10875,20 +11096,6 @@ snapshots:
dependencies:
ini: 2.0.0
- global-modules@2.0.0:
- dependencies:
- global-prefix: 3.0.0
-
- global-prefix@3.0.0:
- dependencies:
- ini: 1.3.8
- kind-of: 6.0.3
- which: 1.3.1
-
- globals@13.24.0:
- dependencies:
- type-fest: 0.20.2
-
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
@@ -10914,19 +11121,31 @@ snapshots:
merge2: 1.4.1
slash: 3.0.0
- globjoin@0.1.4: {}
-
- gonzales-pe@4.3.0:
+ globby@14.1.0:
dependencies:
- minimist: 1.2.8
+ '@sindresorhus/merge-streams': 2.3.0
+ fast-glob: 3.3.3
+ ignore: 7.0.5
+ path-type: 6.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.3.0
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
- graphemer@1.4.0: {}
+ grammex@3.1.12: {}
- hard-rejection@2.1.0: {}
+ graphmatch@1.1.1: {}
+
+ handlebars@4.7.8:
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.19.3
has-bigints@1.1.0: {}
@@ -10952,47 +11171,47 @@ snapshots:
dependencies:
function-bind: 1.1.2
- hoist-non-react-statics@3.3.2:
- dependencies:
- react-is: 16.13.1
+ hono@4.12.9: {}
hosted-git-info@2.8.9: {}
- hosted-git-info@4.1.0:
- dependencies:
- lru-cache: 6.0.0
-
html-escaper@2.0.2: {}
- html-tags@3.3.1: {}
-
http-signature@1.4.0:
dependencies:
assert-plus: 1.0.0
jsprim: 2.0.2
sshpk: 1.18.0
+ http-status-codes@2.3.0: {}
+
human-signals@1.1.1: {}
human-signals@2.1.0: {}
- human-signals@4.3.1: {}
-
- husky@8.0.3: {}
+ iconv-lite@0.7.2:
+ dependencies:
+ safer-buffer: 2.1.2
icss-replace-symbols@1.1.0: {}
- icss-utils@5.1.0(postcss@8.5.6):
+ icss-utils@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
+
+ icu-minify@4.8.4:
+ dependencies:
+ '@formatjs/icu-messageformat-parser': 3.5.3
ieee754@1.2.1: {}
ignore@5.3.2: {}
+ ignore@7.0.5: {}
+
immediate@3.0.6: {}
- immer@9.0.21: {}
+ immer@11.1.4: {}
import-cwd@3.0.0:
dependencies:
@@ -11007,8 +11226,6 @@ snapshots:
dependencies:
resolve-from: 5.0.0
- import-lazy@4.0.0: {}
-
import-local@3.2.0:
dependencies:
pkg-dir: 4.2.0
@@ -11018,8 +11235,6 @@ snapshots:
indent-string@4.0.0: {}
- indent-string@5.0.0: {}
-
inflight@1.0.6:
dependencies:
once: 1.4.0
@@ -11027,8 +11242,6 @@ snapshots:
inherits@2.0.4: {}
- ini@1.3.8: {}
-
ini@2.0.0: {}
internal-slot@1.1.0:
@@ -11039,23 +11252,20 @@ snapshots:
internmap@1.0.1: {}
- intl-messageformat-parser@5.5.1:
+ intl-messageformat@10.7.18:
dependencies:
- '@formatjs/intl-numberformat': 5.7.6
-
- intl-messageformat-parser@6.1.2:
- dependencies:
- '@formatjs/ecma402-abstract': 1.5.0
+ '@formatjs/ecma402-abstract': 2.3.6
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/icu-messageformat-parser': 2.11.4
tslib: 2.8.1
- intl-messageformat@10.7.7:
+ intl-messageformat@11.2.0:
dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/fast-memoize': 2.2.3
- '@formatjs/icu-messageformat-parser': 2.9.4
- tslib: 2.8.1
+ '@formatjs/ecma402-abstract': 3.2.0
+ '@formatjs/fast-memoize': 3.1.1
+ '@formatjs/icu-messageformat-parser': 3.5.3
- ipaddr.js@2.2.0: {}
+ ipaddr.js@2.3.0: {}
is-array-buffer@3.0.5:
dependencies:
@@ -11082,12 +11292,6 @@ snapshots:
call-bound: 1.0.4
has-tostringtag: 1.0.2
- is-buffer@1.1.6: {}
-
- is-bun-module@2.0.0:
- dependencies:
- semver: 7.7.2
-
is-callable@1.2.7: {}
is-ci@3.0.1:
@@ -11119,8 +11323,6 @@ snapshots:
is-fullwidth-code-point@3.0.0: {}
- is-fullwidth-code-point@4.0.0: {}
-
is-generator-fn@2.1.0: {}
is-generator-function@1.1.0:
@@ -11139,7 +11341,7 @@ snapshots:
global-dirs: 3.0.1
is-path-inside: 3.0.3
- is-localhost-ip@1.4.0: {}
+ is-localhost-ip@2.0.0: {}
is-map@2.0.3: {}
@@ -11156,15 +11358,18 @@ snapshots:
is-path-cwd@2.2.0: {}
+ is-path-cwd@3.0.0: {}
+
is-path-inside@3.0.3: {}
- is-plain-obj@1.1.0: {}
-
- is-plain-obj@2.1.0: {}
+ is-path-inside@4.0.0: {}
is-plain-object@3.0.1: {}
- is-plain-object@5.0.0: {}
+ is-plain-object@5.0.0:
+ optional: true
+
+ is-property@1.0.2: {}
is-reference@1.2.1:
dependencies:
@@ -11183,9 +11388,9 @@ snapshots:
dependencies:
call-bound: 1.0.4
- is-stream@2.0.1: {}
+ is-standalone-pwa@0.1.1: {}
- is-stream@3.0.0: {}
+ is-stream@2.0.1: {}
is-string@1.1.1:
dependencies:
@@ -11221,7 +11426,7 @@ snapshots:
isarray@2.0.5: {}
- isbot@5.1.28: {}
+ isbot@5.1.37: {}
isexe@2.0.0: {}
@@ -11231,8 +11436,8 @@ snapshots:
istanbul-lib-instrument@5.2.1:
dependencies:
- '@babel/core': 7.28.0
- '@babel/parser': 7.28.0
+ '@babel/core': 7.28.3
+ '@babel/parser': 7.28.3
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
semver: 6.3.1
@@ -11241,11 +11446,11 @@ snapshots:
istanbul-lib-instrument@6.0.3:
dependencies:
- '@babel/core': 7.28.0
- '@babel/parser': 7.28.0
+ '@babel/core': 7.28.3
+ '@babel/parser': 7.28.3
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
- semver: 7.7.2
+ semver: 7.7.4
transitivePeerDependencies:
- supports-color
@@ -11257,7 +11462,7 @@ snapshots:
istanbul-lib-source-maps@4.0.1:
dependencies:
- debug: 4.4.1(supports-color@8.1.1)
+ debug: 4.4.3(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
@@ -11268,28 +11473,12 @@ snapshots:
html-escaper: 2.0.2
istanbul-lib-report: 3.0.1
- iterator.prototype@1.1.5:
- dependencies:
- define-data-property: 1.1.4
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- has-symbols: 1.1.0
- set-function-name: 2.0.2
-
- jackspeak@2.3.6:
+ jackspeak@3.4.3:
dependencies:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
- jake@10.9.2:
- dependencies:
- async: 3.2.6
- chalk: 4.1.2
- filelist: 1.0.4
- minimatch: 3.1.2
-
jest-changed-files@29.7.0:
dependencies:
execa: 5.1.1
@@ -11302,7 +11491,7 @@ snapshots:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
chalk: 4.1.2
co: 4.6.0
dedent: 1.6.0
@@ -11322,16 +11511,16 @@ snapshots:
- babel-plugin-macros
- supports-color
- jest-cli@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ jest-cli@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
- create-jest: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ create-jest: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
exit: 0.1.2
import-local: 3.2.0
- jest-config: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ jest-config: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -11341,12 +11530,12 @@ snapshots:
- supports-color
- ts-node
- jest-config@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ jest-config@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.0)
+ babel-jest: 29.7.0(@babel/core@7.28.3)
chalk: 4.1.2
ci-info: 3.9.0
deepmerge: 4.3.1
@@ -11366,8 +11555,8 @@ snapshots:
slash: 3.0.0
strip-json-comments: 3.1.1
optionalDependencies:
- '@types/node': 22.16.5
- ts-node: 10.9.2(@types/node@22.16.5)(typescript@5.8.3)
+ '@types/node': 24.12.0
+ ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@@ -11379,6 +11568,13 @@ snapshots:
jest-get-type: 29.6.3
pretty-format: 29.7.0
+ jest-diff@30.1.1:
+ dependencies:
+ '@jest/diff-sequences': 30.0.1
+ '@jest/get-type': 30.1.0
+ chalk: 4.1.2
+ pretty-format: 30.0.5
+
jest-docblock@29.7.0:
dependencies:
detect-newline: 3.1.0
@@ -11396,7 +11592,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -11406,7 +11602,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -11430,9 +11626,16 @@ snapshots:
jest-get-type: 29.6.3
pretty-format: 29.7.0
+ jest-matcher-utils@30.1.1:
+ dependencies:
+ '@jest/get-type': 30.1.0
+ chalk: 4.1.2
+ jest-diff: 30.1.1
+ pretty-format: 30.0.5
+
jest-message-util@29.7.0:
dependencies:
- '@babel/code-frame': 7.27.1
+ '@babel/code-frame': 7.29.0
'@jest/types': 29.6.3
'@types/stack-utils': 2.0.3
chalk: 4.1.2
@@ -11442,18 +11645,38 @@ snapshots:
slash: 3.0.0
stack-utils: 2.0.6
+ jest-message-util@30.1.0:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@jest/types': 30.0.5
+ '@types/stack-utils': 2.0.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ micromatch: 4.0.8
+ pretty-format: 30.0.5
+ slash: 3.0.0
+ stack-utils: 2.0.6
+
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
jest-util: 29.7.0
+ jest-mock@30.0.5:
+ dependencies:
+ '@jest/types': 30.0.5
+ '@types/node': 24.12.0
+ jest-util: 30.0.5
+
jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
optionalDependencies:
jest-resolve: 29.7.0
jest-regex-util@29.6.3: {}
+ jest-regex-util@30.0.1: {}
+
jest-resolve-dependencies@29.7.0:
dependencies:
jest-regex-util: 29.6.3
@@ -11480,7 +11703,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -11508,7 +11731,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
chalk: 4.1.2
cjs-module-lexer: 1.4.3
collect-v8-coverage: 1.0.2
@@ -11528,15 +11751,15 @@ snapshots:
jest-snapshot@29.7.0:
dependencies:
- '@babel/core': 7.28.0
- '@babel/generator': 7.28.0
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
- '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0)
- '@babel/types': 7.28.1
+ '@babel/core': 7.28.3
+ '@babel/generator': 7.28.3
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3)
+ '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3)
+ '@babel/types': 7.28.2
'@jest/expect-utils': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0)
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3)
chalk: 4.1.2
expect: 29.7.0
graceful-fs: 4.2.11
@@ -11547,19 +11770,28 @@ snapshots:
jest-util: 29.7.0
natural-compare: 1.4.0
pretty-format: 29.7.0
- semver: 7.7.2
+ semver: 7.7.4
transitivePeerDependencies:
- supports-color
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
picomatch: 2.3.1
+ jest-util@30.0.5:
+ dependencies:
+ '@jest/types': 30.0.5
+ '@types/node': 24.12.0
+ chalk: 4.1.2
+ ci-info: 4.3.0
+ graceful-fs: 4.2.11
+ picomatch: 4.0.3
+
jest-validate@29.7.0:
dependencies:
'@jest/types': 29.6.3
@@ -11573,7 +11805,7 @@ snapshots:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -11582,23 +11814,25 @@ snapshots:
jest-worker@29.7.0:
dependencies:
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
- jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ jest@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
'@jest/types': 29.6.3
import-local: 3.2.0
- jest-cli: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ jest-cli: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
- supports-color
- ts-node
+ jiti@2.6.1: {}
+
joycon@3.1.1: {}
js-tokens@4.0.0: {}
@@ -11614,57 +11848,33 @@ snapshots:
jsbn@0.1.1: {}
- jsesc@3.0.2: {}
-
jsesc@3.1.0: {}
- json-buffer@3.0.1: {}
-
json-parse-better-errors@1.0.2: {}
json-parse-even-better-errors@2.3.1: {}
- json-schema-traverse@0.4.1: {}
-
json-schema-traverse@1.0.0: {}
json-schema@0.4.0: {}
- json-stable-stringify-without-jsonify@1.0.1: {}
-
- json-stable-stringify@1.3.0:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- isarray: 2.0.5
- jsonify: 0.0.1
- object-keys: 1.1.1
-
json-stringify-safe@5.0.1: {}
- json5@1.0.2:
- dependencies:
- minimist: 1.2.8
-
json5@2.2.3: {}
- jsonc-parser@3.3.1: {}
-
jsonfile@4.0.0:
optionalDependencies:
graceful-fs: 4.2.11
- jsonfile@6.1.0:
+ jsonfile@6.2.0:
dependencies:
universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
- jsonify@0.0.1: {}
-
- jsonwebtoken@9.0.2:
+ jsonwebtoken@9.0.3:
dependencies:
- jws: 3.2.2
+ jws: 4.0.1
lodash.includes: 4.3.0
lodash.isboolean: 3.0.3
lodash.isinteger: 4.0.4
@@ -11673,7 +11883,7 @@ snapshots:
lodash.isstring: 4.0.1
lodash.once: 4.1.1
ms: 2.1.3
- semver: 7.7.2
+ semver: 7.7.4
jsprim@2.0.2:
dependencies:
@@ -11682,13 +11892,6 @@ snapshots:
json-schema: 0.4.0
verror: 1.10.0
- jsx-ast-utils@3.3.5:
- dependencies:
- array-includes: 3.1.9
- array.prototype.flat: 1.3.3
- object.assign: 4.1.7
- object.values: 1.2.1
-
jszip@3.10.1:
dependencies:
lie: 3.3.0
@@ -11696,70 +11899,37 @@ snapshots:
readable-stream: 2.3.8
setimmediate: 1.0.5
- jwa@1.4.2:
+ jwa@2.0.1:
dependencies:
buffer-equal-constant-time: 1.0.1
ecdsa-sig-formatter: 1.0.11
safe-buffer: 5.2.1
- jws@3.2.2:
+ jws@4.0.1:
dependencies:
- jwa: 1.4.2
+ jwa: 2.0.1
safe-buffer: 5.2.1
kafkajs@2.2.4: {}
- keyv@4.5.4:
- dependencies:
- json-buffer: 3.0.1
-
- kind-of@6.0.3: {}
-
kleur@3.0.3: {}
- known-css-properties@0.29.0: {}
-
- known-css-properties@0.36.0:
+ known-css-properties@0.37.0:
optional: true
- language-subtag-registry@0.3.23: {}
-
- language-tags@1.0.9:
- dependencies:
- language-subtag-registry: 0.3.23
-
lazy-ass@1.6.0: {}
leven@3.1.0: {}
- levn@0.4.1:
- dependencies:
- prelude-ls: 1.2.1
- type-check: 0.4.0
-
lie@3.3.0:
dependencies:
immediate: 3.0.6
lilconfig@2.1.0: {}
- lines-and-columns@1.2.4: {}
+ lilconfig@3.1.3: {}
- lint-staged@14.0.1(enquirer@2.4.1):
- dependencies:
- chalk: 5.3.0
- commander: 11.0.0
- debug: 4.3.4
- execa: 7.2.0
- lilconfig: 2.1.0
- listr2: 6.6.1(enquirer@2.4.1)
- micromatch: 4.0.5
- pidtree: 0.6.0
- string-argv: 0.3.2
- yaml: 2.3.1
- transitivePeerDependencies:
- - enquirer
- - supports-color
+ lines-and-columns@1.2.4: {}
listr2@3.14.0(enquirer@2.4.1):
dependencies:
@@ -11774,17 +11944,6 @@ snapshots:
optionalDependencies:
enquirer: 2.4.1
- listr2@6.6.1(enquirer@2.4.1):
- dependencies:
- cli-truncate: 3.1.0
- colorette: 2.0.20
- eventemitter3: 5.0.1
- log-update: 5.0.1
- rfdc: 1.4.1
- wrap-ansi: 8.1.0
- optionalDependencies:
- enquirer: 2.4.1
-
load-json-file@4.0.0:
dependencies:
graceful-fs: 4.2.11
@@ -11792,12 +11951,7 @@ snapshots:
pify: 3.0.0
strip-bom: 3.0.0
- load-json-file@6.2.0:
- dependencies:
- graceful-fs: 4.2.11
- parse-json: 5.2.0
- strip-bom: 4.0.0
- type-fest: 0.6.0
+ load-tsconfig@0.2.5: {}
loader-utils@3.3.1: {}
@@ -11805,14 +11959,8 @@ snapshots:
dependencies:
p-locate: 4.1.0
- locate-path@6.0.0:
- dependencies:
- p-locate: 5.0.0
-
lodash.camelcase@4.3.0: {}
- lodash.debounce@4.0.8: {}
-
lodash.includes@4.3.0: {}
lodash.isboolean@3.0.3: {}
@@ -11827,16 +11975,8 @@ snapshots:
lodash.memoize@4.1.2: {}
- lodash.merge@4.6.2: {}
-
- lodash.mergewith@4.6.2: {}
-
lodash.once@4.1.1: {}
- lodash.pick@4.4.0: {}
-
- lodash.truncate@4.4.2: {}
-
lodash.uniq@4.5.0: {}
lodash@4.17.21: {}
@@ -11853,23 +11993,12 @@ snapshots:
slice-ansi: 4.0.0
wrap-ansi: 6.2.0
- log-update@5.0.1:
- dependencies:
- ansi-escapes: 5.0.0
- cli-cursor: 4.0.0
- slice-ansi: 5.0.0
- strip-ansi: 7.1.0
- wrap-ansi: 8.1.0
+ long@5.3.2: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
- loud-rejection@2.2.0:
- dependencies:
- currently-unhandled: 0.4.1
- signal-exit: 3.0.7
-
lower-case@2.0.2:
dependencies:
tslib: 2.8.1
@@ -11880,21 +12009,31 @@ snapshots:
dependencies:
yallist: 3.1.1
- lru-cache@6.0.0:
+ lru.min@1.1.4: {}
+
+ lucide-react@0.542.0(react@19.2.4):
dependencies:
- yallist: 4.0.0
+ react: 19.2.4
+
+ lucide-react@0.555.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+
+ lucide-react@1.7.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
magic-string@0.30.17:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.4
+ '@jridgewell/sourcemap-codec': 1.5.5
- make-dir@3.1.0:
+ magic-string@0.30.21:
dependencies:
- semver: 6.3.1
+ '@jridgewell/sourcemap-codec': 1.5.5
make-dir@4.0.0:
dependencies:
- semver: 7.7.2
+ semver: 7.7.4
make-error@1.3.6: {}
@@ -11902,24 +12041,12 @@ snapshots:
dependencies:
tmpl: 1.0.5
- map-obj@1.0.1: {}
-
- map-obj@4.3.0: {}
-
math-intrinsics@1.1.0: {}
- mathml-tag-names@2.1.3: {}
-
- maxmind@4.3.28:
+ maxmind@5.0.5:
dependencies:
- mmdb-lib: 2.2.1
- tiny-lru: 11.3.3
-
- md5@2.3.0:
- dependencies:
- charenc: 0.0.2
- crypt: 0.0.2
- is-buffer: 1.1.6
+ mmdb-lib: 3.0.2
+ tiny-lru: 11.4.7
mdn-data@2.0.14: {}
@@ -11930,7 +12057,7 @@ snapshots:
mdn-data@2.12.2:
optional: true
- mdn-data@2.23.0:
+ mdn-data@2.27.1:
optional: true
memoize-one@5.2.1: {}
@@ -11939,44 +12066,10 @@ snapshots:
memorystream@0.3.1: {}
- meow@10.1.5:
- dependencies:
- '@types/minimist': 1.2.5
- camelcase-keys: 7.0.2
- decamelize: 5.0.1
- decamelize-keys: 1.1.1
- hard-rejection: 2.1.0
- minimist-options: 4.1.0
- normalize-package-data: 3.0.3
- read-pkg-up: 8.0.0
- redent: 4.0.0
- trim-newlines: 4.1.1
- type-fest: 1.4.0
- yargs-parser: 20.2.9
-
- meow@6.1.1:
- dependencies:
- '@types/minimist': 1.2.5
- camelcase-keys: 6.2.2
- decamelize-keys: 1.1.1
- hard-rejection: 2.1.0
- minimist-options: 4.1.0
- normalize-package-data: 2.5.0
- read-pkg-up: 7.0.1
- redent: 3.0.0
- trim-newlines: 3.0.1
- type-fest: 0.13.1
- yargs-parser: 18.1.3
-
merge-stream@2.0.0: {}
merge2@1.4.1: {}
- micromatch@4.0.5:
- dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
-
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -11990,10 +12083,6 @@ snapshots:
mimic-fn@2.1.0: {}
- mimic-fn@4.0.0: {}
-
- min-indent@1.0.1: {}
-
minimatch@10.0.3:
dependencies:
'@isaacs/brace-expansion': 5.0.0
@@ -12006,68 +12095,101 @@ snapshots:
dependencies:
brace-expansion: 2.0.2
- minimatch@9.0.3:
- dependencies:
- brace-expansion: 2.0.2
-
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.2
- minimist-options@4.1.0:
- dependencies:
- arrify: 1.0.1
- is-plain-obj: 1.1.0
- kind-of: 6.0.3
-
minimist@1.2.8: {}
- minipass@3.3.6:
- dependencies:
- yallist: 4.0.0
-
- minipass@5.0.0: {}
-
minipass@7.1.2: {}
- minizlib@2.1.2:
+ minizlib@3.1.0:
dependencies:
- minipass: 3.3.6
- yallist: 4.0.0
+ minipass: 7.1.2
- mkdirp@1.0.4: {}
+ mitt@3.0.1: {}
- mmdb-lib@2.2.1: {}
+ mlly@1.8.0:
+ dependencies:
+ acorn: 8.15.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.1
- ms@2.1.2: {}
+ mmdb-lib@3.0.2: {}
ms@2.1.3: {}
- nanoid@3.3.11: {}
+ mysql2@3.15.3:
+ dependencies:
+ aws-ssl-profiles: 1.1.2
+ denque: 2.1.0
+ generate-function: 2.3.1
+ iconv-lite: 0.7.2
+ long: 5.3.2
+ lru.min: 1.1.4
+ named-placeholders: 1.1.6
+ seq-queue: 0.0.5
+ sqlstring: 2.3.3
- napi-postinstall@0.3.2: {}
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ named-placeholders@1.1.6:
+ dependencies:
+ lru.min: 1.1.4
+
+ nanoid@3.3.11: {}
natural-compare@1.4.0: {}
- next@15.4.7(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ negotiator@1.0.0: {}
+
+ neo-async@2.6.2: {}
+
+ next-intl-swc-plugin-extractor@4.8.4: {}
+
+ next-intl@4.8.3(@swc/helpers@0.5.20)(next@16.2.1(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
dependencies:
- '@next/env': 15.4.7
- '@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001743
- postcss: 8.4.31
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- styled-jsx: 5.1.6(@babel/core@7.28.0)(react@19.1.0)
+ '@formatjs/intl-localematcher': 0.8.2
+ '@parcel/watcher': 2.5.6
+ '@swc/core': 1.15.11(@swc/helpers@0.5.20)
+ icu-minify: 4.8.4
+ negotiator: 1.0.0
+ next: 16.2.1(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ next-intl-swc-plugin-extractor: 4.8.4
+ po-parser: 2.1.1
+ react: 19.2.4
+ use-intl: 4.8.4(react@19.2.4)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.4.7
- '@next/swc-darwin-x64': 15.4.7
- '@next/swc-linux-arm64-gnu': 15.4.7
- '@next/swc-linux-arm64-musl': 15.4.7
- '@next/swc-linux-x64-gnu': 15.4.7
- '@next/swc-linux-x64-musl': 15.4.7
- '@next/swc-win32-arm64-msvc': 15.4.7
- '@next/swc-win32-x64-msvc': 15.4.7
- sharp: 0.34.4
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - '@swc/helpers'
+
+ next@16.2.1(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@next/env': 16.2.1
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.10.12
+ caniuse-lite: 1.0.30001781
+ postcss: 8.4.31
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.4)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.2.1
+ '@next/swc-darwin-x64': 16.2.1
+ '@next/swc-linux-arm64-gnu': 16.2.1
+ '@next/swc-linux-arm64-musl': 16.2.1
+ '@next/swc-linux-x64-gnu': 16.2.1
+ '@next/swc-linux-x64-musl': 16.2.1
+ '@next/swc-win32-arm64-msvc': 16.2.1
+ '@next/swc-win32-x64-msvc': 16.2.1
+ babel-plugin-react-compiler: 19.1.0-rc.2
+ sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@@ -12079,8 +12201,12 @@ snapshots:
lower-case: 2.0.2
tslib: 2.8.1
+ node-addon-api@7.1.1: {}
+
node-domexception@1.0.0: {}
+ node-fetch-native@1.6.7: {}
+
node-fetch@3.3.2:
dependencies:
data-uri-to-buffer: 4.0.1
@@ -12098,13 +12224,6 @@ snapshots:
semver: 5.7.2
validate-npm-package-license: 3.0.4
- normalize-package-data@3.0.3:
- dependencies:
- hosted-git-info: 4.1.0
- is-core-module: 2.16.1
- semver: 7.7.2
- validate-npm-package-license: 3.0.4
-
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
@@ -12127,14 +12246,16 @@ snapshots:
dependencies:
path-key: 3.1.1
- npm-run-path@5.3.0:
- dependencies:
- path-key: 4.0.0
-
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
+ nypm@0.6.5:
+ dependencies:
+ citty: 0.2.1
+ pathe: 2.0.3
+ tinyexec: 1.0.4
+
object-assign@4.1.1: {}
object-inspect@1.13.4: {}
@@ -12150,32 +12271,7 @@ snapshots:
has-symbols: 1.1.0
object-keys: 1.1.1
- object.entries@1.1.9:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- object.fromentries@2.0.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
-
- object.groupby@1.0.3:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
-
- object.values@1.2.1:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
+ ohash@2.0.11: {}
once@1.4.0:
dependencies:
@@ -12185,19 +12281,6 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
- onetime@6.0.0:
- dependencies:
- mimic-fn: 4.0.0
-
- optionator@0.9.4:
- dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.4.1
- prelude-ls: 1.2.1
- type-check: 0.4.0
- word-wrap: 1.2.5
-
ospath@1.2.2: {}
own-keys@1.0.1:
@@ -12220,14 +12303,12 @@ snapshots:
dependencies:
p-limit: 2.3.0
- p-locate@5.0.0:
- dependencies:
- p-limit: 3.1.0
-
p-map@4.0.0:
dependencies:
aggregate-error: 3.1.0
+ p-map@7.0.4: {}
+
p-queue@6.6.2:
dependencies:
eventemitter3: 4.0.7
@@ -12239,6 +12320,8 @@ snapshots:
p-try@2.2.0: {}
+ package-json-from-dist@1.0.1: {}
+
pako@1.0.11: {}
papaparse@5.5.3: {}
@@ -12259,6 +12342,8 @@ snapshots:
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
+ path-browserify@1.0.1: {}
+
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
@@ -12267,8 +12352,6 @@ snapshots:
path-key@3.1.1: {}
- path-key@4.0.0: {}
-
path-parse@1.0.7: {}
path-scurry@1.11.1:
@@ -12282,10 +12365,51 @@ snapshots:
path-type@4.0.0: {}
+ path-type@6.0.0: {}
+
+ pathe@2.0.3: {}
+
pend@1.2.0: {}
+ perfect-debounce@1.0.0: {}
+
performance-now@2.1.0: {}
+ pg-cloudflare@1.3.0:
+ optional: true
+
+ pg-connection-string@2.12.0: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.13.0(pg@8.20.0):
+ dependencies:
+ pg: 8.20.0
+
+ pg-protocol@1.13.0: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.1
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.20.0:
+ dependencies:
+ pg-connection-string: 2.12.0
+ pg-pool: 3.13.0(pg@8.20.0)
+ pg-protocol: 1.13.0
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.3.0
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -12294,8 +12418,6 @@ snapshots:
pidtree@0.3.1: {}
- pidtree@0.6.0: {}
-
pify@2.3.0: {}
pify@3.0.0: {}
@@ -12308,392 +12430,412 @@ snapshots:
dependencies:
find-up: 4.1.0
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.0
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.4
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
+ po-parser@2.1.1: {}
+
possible-typed-array-names@1.1.0: {}
- postcss-attribute-case-insensitive@5.0.2(postcss@8.5.6):
+ postcss-attribute-case-insensitive@5.0.2(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-calc@8.2.4(postcss@8.5.6):
+ postcss-calc@8.2.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
- postcss-clamp@4.1.0(postcss@8.5.6):
+ postcss-clamp@4.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-color-functional-notation@4.2.4(postcss@8.5.6):
+ postcss-color-functional-notation@4.2.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-color-hex-alpha@8.0.4(postcss@8.5.6):
+ postcss-color-hex-alpha@8.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-color-rebeccapurple@7.1.1(postcss@8.5.6):
+ postcss-color-rebeccapurple@7.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-colormin@5.3.1(postcss@8.5.6):
+ postcss-colormin@5.3.1(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
+ browserslist: 4.25.2
caniuse-api: 3.0.0
colord: 2.9.3
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-convert-values@5.1.3(postcss@8.5.6):
+ postcss-convert-values@5.1.3(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
- postcss: 8.5.6
+ browserslist: 4.25.2
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-custom-media@8.0.2(postcss@8.5.6):
+ postcss-custom-media@8.0.2(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-custom-properties@12.1.11(postcss@8.5.6):
+ postcss-custom-properties@12.1.11(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-custom-selectors@6.0.3(postcss@8.5.6):
+ postcss-custom-selectors@6.0.3(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-dir-pseudo-class@6.0.5(postcss@8.5.6):
+ postcss-dir-pseudo-class@6.0.5(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-discard-comments@5.1.2(postcss@8.5.6):
+ postcss-discard-comments@5.1.2(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-discard-duplicates@5.1.0(postcss@8.5.6):
+ postcss-discard-duplicates@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-discard-empty@5.1.1(postcss@8.5.6):
+ postcss-discard-empty@5.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-discard-overridden@5.1.0(postcss@8.5.6):
+ postcss-discard-overridden@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-double-position-gradients@3.1.2(postcss@8.5.6):
+ postcss-double-position-gradients@3.1.2(postcss@8.5.8):
dependencies:
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- postcss: 8.5.6
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-env-function@4.0.6(postcss@8.5.6):
+ postcss-env-function@4.0.6(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-flexbugs-fixes@5.0.2(postcss@8.5.6):
+ postcss-flexbugs-fixes@5.0.2(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-focus-visible@6.0.4(postcss@8.5.6):
+ postcss-focus-visible@6.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-focus-within@5.0.4(postcss@8.5.6):
+ postcss-focus-within@5.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-font-variant@5.0.0(postcss@8.5.6):
+ postcss-font-variant@5.0.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-gap-properties@3.0.5(postcss@8.5.6):
+ postcss-gap-properties@3.0.5(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-image-set-function@4.0.7(postcss@8.5.6):
+ postcss-image-set-function@4.0.7(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-import@15.1.0(postcss@8.5.6):
+ postcss-import@15.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.10
- postcss-initial@4.0.1(postcss@8.5.6):
+ postcss-initial@4.0.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-lab-function@4.2.1(postcss@8.5.6):
+ postcss-lab-function@4.2.1(postcss@8.5.8):
dependencies:
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- postcss: 8.5.6
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
lilconfig: 2.1.0
yaml: 1.10.2
optionalDependencies:
- postcss: 8.5.6
- ts-node: 10.9.2(@types/node@22.16.5)(typescript@5.8.3)
+ postcss: 8.5.8
+ ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)
- postcss-logical@5.0.4(postcss@8.5.6):
+ postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
- postcss: 8.5.6
+ lilconfig: 3.1.3
+ optionalDependencies:
+ jiti: 2.6.1
+ postcss: 8.5.8
+ tsx: 4.21.0
+ yaml: 2.8.1
- postcss-media-minmax@5.0.0(postcss@8.5.6):
+ postcss-logical@5.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
+
+ postcss-media-minmax@5.0.0(postcss@8.5.8):
+ dependencies:
+ postcss: 8.5.8
postcss-media-query-parser@0.2.3:
optional: true
- postcss-merge-longhand@5.1.7(postcss@8.5.6):
+ postcss-merge-longhand@5.1.7(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- stylehacks: 5.1.1(postcss@8.5.6)
+ stylehacks: 5.1.1(postcss@8.5.8)
- postcss-merge-rules@5.1.4(postcss@8.5.6):
+ postcss-merge-rules@5.1.4(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
+ browserslist: 4.25.2
caniuse-api: 3.0.0
- cssnano-utils: 3.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ cssnano-utils: 3.1.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-minify-font-values@5.1.0(postcss@8.5.6):
+ postcss-minify-font-values@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-minify-gradients@5.1.1(postcss@8.5.6):
+ postcss-minify-gradients@5.1.1(postcss@8.5.8):
dependencies:
colord: 2.9.3
- cssnano-utils: 3.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ cssnano-utils: 3.1.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-minify-params@5.1.4(postcss@8.5.6):
+ postcss-minify-params@5.1.4(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
- cssnano-utils: 3.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ browserslist: 4.25.2
+ cssnano-utils: 3.1.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-minify-selectors@5.2.1(postcss@8.5.6):
+ postcss-minify-selectors@5.2.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-modules-extract-imports@3.1.0(postcss@8.5.6):
+ postcss-modules-extract-imports@3.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-modules-local-by-default@4.2.0(postcss@8.5.6):
+ postcss-modules-local-by-default@4.2.0(postcss@8.5.8):
dependencies:
- icss-utils: 5.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ icss-utils: 5.1.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-selector-parser: 7.1.0
postcss-value-parser: 4.2.0
- postcss-modules-scope@3.2.1(postcss@8.5.6):
+ postcss-modules-scope@3.2.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 7.1.0
- postcss-modules-values@4.0.0(postcss@8.5.6):
+ postcss-modules-values@4.0.0(postcss@8.5.8):
dependencies:
- icss-utils: 5.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ icss-utils: 5.1.0(postcss@8.5.8)
+ postcss: 8.5.8
- postcss-modules@4.3.1(postcss@8.5.6):
+ postcss-modules@4.3.1(postcss@8.5.8):
dependencies:
generic-names: 4.0.0
icss-replace-symbols: 1.1.0
lodash.camelcase: 4.3.0
- postcss: 8.5.6
- postcss-modules-extract-imports: 3.1.0(postcss@8.5.6)
- postcss-modules-local-by-default: 4.2.0(postcss@8.5.6)
- postcss-modules-scope: 3.2.1(postcss@8.5.6)
- postcss-modules-values: 4.0.0(postcss@8.5.6)
+ postcss: 8.5.8
+ postcss-modules-extract-imports: 3.1.0(postcss@8.5.8)
+ postcss-modules-local-by-default: 4.2.0(postcss@8.5.8)
+ postcss-modules-scope: 3.2.1(postcss@8.5.8)
+ postcss-modules-values: 4.0.0(postcss@8.5.8)
string-hash: 1.1.3
- postcss-nesting@10.2.0(postcss@8.5.6):
+ postcss-nesting@10.2.0(postcss@8.5.8):
dependencies:
'@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-normalize-charset@5.1.0(postcss@8.5.6):
+ postcss-normalize-charset@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-normalize-display-values@5.1.0(postcss@8.5.6):
+ postcss-normalize-display-values@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-positions@5.1.1(postcss@8.5.6):
+ postcss-normalize-positions@5.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-repeat-style@5.1.1(postcss@8.5.6):
+ postcss-normalize-repeat-style@5.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-string@5.1.0(postcss@8.5.6):
+ postcss-normalize-string@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-timing-functions@5.1.0(postcss@8.5.6):
+ postcss-normalize-timing-functions@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-unicode@5.1.1(postcss@8.5.6):
+ postcss-normalize-unicode@5.1.1(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
- postcss: 8.5.6
+ browserslist: 4.25.2
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-url@5.1.0(postcss@8.5.6):
+ postcss-normalize-url@5.1.0(postcss@8.5.8):
dependencies:
normalize-url: 6.1.0
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-normalize-whitespace@5.1.1(postcss@8.5.6):
+ postcss-normalize-whitespace@5.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-opacity-percentage@1.1.3(postcss@8.5.6):
+ postcss-opacity-percentage@1.1.3(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-ordered-values@5.1.3(postcss@8.5.6):
+ postcss-ordered-values@5.1.3(postcss@8.5.8):
dependencies:
- cssnano-utils: 3.1.0(postcss@8.5.6)
- postcss: 8.5.6
+ cssnano-utils: 3.1.0(postcss@8.5.8)
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-overflow-shorthand@3.0.4(postcss@8.5.6):
+ postcss-overflow-shorthand@3.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-page-break@3.0.4(postcss@8.5.6):
+ postcss-page-break@3.0.4(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-place@7.0.5(postcss@8.5.6):
+ postcss-place@7.0.5(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-preset-env@7.8.3(postcss@8.5.6):
+ postcss-preset-env@7.8.3(postcss@8.5.8):
dependencies:
- '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.5.6)
- '@csstools/postcss-color-function': 1.1.1(postcss@8.5.6)
- '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.6)
- '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.6)
- '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.6)
- '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.6)
- '@csstools/postcss-nested-calc': 1.0.0(postcss@8.5.6)
- '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.6)
- '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.6)
- '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
- '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.6)
- '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.6)
- '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.6)
- '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.6)
- autoprefixer: 10.4.21(postcss@8.5.6)
- browserslist: 4.25.1
- css-blank-pseudo: 3.0.3(postcss@8.5.6)
- css-has-pseudo: 3.0.4(postcss@8.5.6)
- css-prefers-color-scheme: 6.0.3(postcss@8.5.6)
+ '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.5.8)
+ '@csstools/postcss-color-function': 1.1.1(postcss@8.5.8)
+ '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.8)
+ '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.8)
+ '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.8)
+ '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.8)
+ '@csstools/postcss-nested-calc': 1.0.0(postcss@8.5.8)
+ '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.8)
+ '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.8)
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.8)
+ '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.8)
+ '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.8)
+ '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.8)
+ '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.8)
+ autoprefixer: 10.4.21(postcss@8.5.8)
+ browserslist: 4.25.2
+ css-blank-pseudo: 3.0.3(postcss@8.5.8)
+ css-has-pseudo: 3.0.4(postcss@8.5.8)
+ css-prefers-color-scheme: 6.0.3(postcss@8.5.8)
cssdb: 7.11.2
- postcss: 8.5.6
- postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.6)
- postcss-clamp: 4.1.0(postcss@8.5.6)
- postcss-color-functional-notation: 4.2.4(postcss@8.5.6)
- postcss-color-hex-alpha: 8.0.4(postcss@8.5.6)
- postcss-color-rebeccapurple: 7.1.1(postcss@8.5.6)
- postcss-custom-media: 8.0.2(postcss@8.5.6)
- postcss-custom-properties: 12.1.11(postcss@8.5.6)
- postcss-custom-selectors: 6.0.3(postcss@8.5.6)
- postcss-dir-pseudo-class: 6.0.5(postcss@8.5.6)
- postcss-double-position-gradients: 3.1.2(postcss@8.5.6)
- postcss-env-function: 4.0.6(postcss@8.5.6)
- postcss-focus-visible: 6.0.4(postcss@8.5.6)
- postcss-focus-within: 5.0.4(postcss@8.5.6)
- postcss-font-variant: 5.0.0(postcss@8.5.6)
- postcss-gap-properties: 3.0.5(postcss@8.5.6)
- postcss-image-set-function: 4.0.7(postcss@8.5.6)
- postcss-initial: 4.0.1(postcss@8.5.6)
- postcss-lab-function: 4.2.1(postcss@8.5.6)
- postcss-logical: 5.0.4(postcss@8.5.6)
- postcss-media-minmax: 5.0.0(postcss@8.5.6)
- postcss-nesting: 10.2.0(postcss@8.5.6)
- postcss-opacity-percentage: 1.1.3(postcss@8.5.6)
- postcss-overflow-shorthand: 3.0.4(postcss@8.5.6)
- postcss-page-break: 3.0.4(postcss@8.5.6)
- postcss-place: 7.0.5(postcss@8.5.6)
- postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.6)
- postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6)
- postcss-selector-not: 6.0.1(postcss@8.5.6)
+ postcss: 8.5.8
+ postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.8)
+ postcss-clamp: 4.1.0(postcss@8.5.8)
+ postcss-color-functional-notation: 4.2.4(postcss@8.5.8)
+ postcss-color-hex-alpha: 8.0.4(postcss@8.5.8)
+ postcss-color-rebeccapurple: 7.1.1(postcss@8.5.8)
+ postcss-custom-media: 8.0.2(postcss@8.5.8)
+ postcss-custom-properties: 12.1.11(postcss@8.5.8)
+ postcss-custom-selectors: 6.0.3(postcss@8.5.8)
+ postcss-dir-pseudo-class: 6.0.5(postcss@8.5.8)
+ postcss-double-position-gradients: 3.1.2(postcss@8.5.8)
+ postcss-env-function: 4.0.6(postcss@8.5.8)
+ postcss-focus-visible: 6.0.4(postcss@8.5.8)
+ postcss-focus-within: 5.0.4(postcss@8.5.8)
+ postcss-font-variant: 5.0.0(postcss@8.5.8)
+ postcss-gap-properties: 3.0.5(postcss@8.5.8)
+ postcss-image-set-function: 4.0.7(postcss@8.5.8)
+ postcss-initial: 4.0.1(postcss@8.5.8)
+ postcss-lab-function: 4.2.1(postcss@8.5.8)
+ postcss-logical: 5.0.4(postcss@8.5.8)
+ postcss-media-minmax: 5.0.0(postcss@8.5.8)
+ postcss-nesting: 10.2.0(postcss@8.5.8)
+ postcss-opacity-percentage: 1.1.3(postcss@8.5.8)
+ postcss-overflow-shorthand: 3.0.4(postcss@8.5.8)
+ postcss-page-break: 3.0.4(postcss@8.5.8)
+ postcss-place: 7.0.5(postcss@8.5.8)
+ postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.8)
+ postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.8)
+ postcss-selector-not: 6.0.1(postcss@8.5.8)
postcss-value-parser: 4.2.0
- postcss-pseudo-class-any-link@7.1.6(postcss@8.5.6):
+ postcss-pseudo-class-any-link@7.1.6(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- postcss-reduce-initial@5.1.2(postcss@8.5.6):
+ postcss-reduce-initial@5.1.2(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
+ browserslist: 4.25.2
caniuse-api: 3.0.0
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-reduce-transforms@5.1.0(postcss@8.5.6):
+ postcss-reduce-transforms@5.1.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
- postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6):
+ postcss-replace-overflow-wrap@4.0.0(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
- postcss-resolve-nested-selector@0.1.6: {}
+ postcss-resolve-nested-selector@0.1.6:
+ optional: true
- postcss-safe-parser@6.0.0(postcss@8.5.6):
+ postcss-selector-not@6.0.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
-
- postcss-selector-not@6.0.1(postcss@8.5.6):
- dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
postcss-selector-parser@6.1.2:
@@ -12706,15 +12848,21 @@ snapshots:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss-svgo@5.1.0(postcss@8.5.6):
+ postcss-selector-parser@7.1.1:
dependencies:
- postcss: 8.5.6
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ optional: true
+
+ postcss-svgo@5.1.0(postcss@8.5.8):
+ dependencies:
+ postcss: 8.5.8
postcss-value-parser: 4.2.0
svgo: 2.8.0
- postcss-unique-selectors@5.1.1(postcss@8.5.6):
+ postcss-unique-selectors@5.1.1(postcss@8.5.8):
dependencies:
- postcss: 8.5.6
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
postcss-value-parser@4.2.0: {}
@@ -12725,17 +12873,27 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.5.6:
+ postcss@8.5.8:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
- prelude-ls@1.2.1: {}
+ postgres-array@2.0.0: {}
- prettier-linter-helpers@1.0.0:
+ postgres-array@3.0.4: {}
+
+ postgres-bytea@1.0.1: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
dependencies:
- fast-diff: 1.3.0
+ xtend: 4.0.2
+
+ postgres@3.4.7: {}
+
+ presentable-error@0.0.1: {}
prettier@2.8.8: {}
@@ -12747,15 +12905,28 @@ snapshots:
ansi-styles: 5.2.0
react-is: 18.3.1
- prisma@6.7.0(typescript@5.8.3):
+ pretty-format@30.0.5:
dependencies:
- '@prisma/config': 6.7.0
- '@prisma/engines': 6.7.0
+ '@jest/schemas': 30.0.5
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+
+ prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
+ dependencies:
+ '@prisma/config': 7.6.0
+ '@prisma/dev': 0.24.3(typescript@5.9.3)
+ '@prisma/engines': 7.6.0
+ '@prisma/studio-core': 0.27.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ mysql2: 3.15.3
+ postgres: 3.4.7
optionalDependencies:
- fsevents: 2.3.3
- typescript: 5.8.3
+ typescript: 5.9.3
transitivePeerDependencies:
- - supports-color
+ - '@types/react'
+ - '@types/react-dom'
+ - magicast
+ - react
+ - react-dom
process-nextick-args@2.0.1: {}
@@ -12774,6 +12945,12 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
+ proper-lockfile@4.1.2:
+ dependencies:
+ graceful-fs: 4.2.11
+ retry: 0.12.0
+ signal-exit: 3.0.7
+
proxy-from-env@1.0.0: {}
pump@3.0.3:
@@ -12781,148 +12958,208 @@ snapshots:
end-of-stream: 1.4.5
once: 1.4.0
- punycode@2.3.1: {}
-
pure-rand@6.1.0: {}
+ pure-rand@7.0.1: {}
+
qs@6.14.0:
dependencies:
side-channel: 1.1.0
queue-microtask@1.2.3: {}
- quick-lru@4.0.1: {}
-
- quick-lru@5.1.1: {}
-
raf-schd@4.0.3: {}
randombytes@2.1.0:
dependencies:
safe-buffer: 5.2.1
- react-basics@0.126.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ rc9@2.1.2:
dependencies:
- '@react-spring/web': 9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- classnames: 2.5.1
- date-fns: 2.30.0
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- react-hook-form: 7.60.0(react@19.1.0)
- react-window: 1.8.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ defu: 6.1.4
+ destr: 2.0.5
- react-dom@19.1.0(react@19.1.0):
+ react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- react: 19.1.0
- scheduler: 0.26.0
+ '@internationalized/date': 3.12.0
+ '@internationalized/string': 3.2.7
+ '@react-aria/autocomplete': 3.0.0-rc.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/collections': 3.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/dnd': 3.11.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/live-announcer': 3.4.4
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/toolbar': 3.0.0-beta.22(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/virtualizer': 4.1.13(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/autocomplete': 3.0.0-beta.4(react@19.2.4)
+ '@react-stately/layout': 4.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/table': 3.15.4(react@19.2.4)
+ '@react-stately/utils': 3.11.0(react@19.2.4)
+ '@react-stately/virtualizer': 4.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/form': 3.7.18(react@19.2.4)
+ '@react-types/grid': 3.3.8(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ '@react-types/table': 3.13.6(react@19.2.4)
+ '@swc/helpers': 0.5.20
+ client-only: 0.0.1
+ react: 19.2.4
+ react-aria: 3.47.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react-dom: 19.2.4(react@19.2.4)
+ react-stately: 3.45.0(react@19.2.4)
+ use-sync-external-store: 1.6.0(react@19.2.4)
- react-error-boundary@4.1.2(react@19.1.0):
+ react-aria@3.47.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@babel/runtime': 7.27.6
- react: 19.1.0
+ '@internationalized/string': 3.2.7
+ '@react-aria/breadcrumbs': 3.5.32(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/button': 3.14.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/calendar': 3.9.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/checkbox': 3.16.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/color': 3.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/combobox': 3.15.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/datepicker': 3.16.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/dialog': 3.5.34(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/disclosure': 3.1.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/dnd': 3.11.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/focus': 3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/gridlist': 3.14.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/i18n': 3.12.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/label': 3.7.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/landmark': 3.0.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/link': 3.8.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/listbox': 3.15.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/menu': 3.21.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/meter': 3.4.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/numberfield': 3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/overlays': 3.31.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/progress': 3.4.30(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/radio': 3.12.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/searchfield': 3.8.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/select': 3.17.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/selection': 3.27.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/separator': 3.4.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/slider': 3.8.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/ssr': 3.9.10(react@19.2.4)
+ '@react-aria/switch': 3.7.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/table': 3.17.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/tabs': 3.11.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/tag': 3.8.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/textfield': 3.18.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/toast': 3.0.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/tooltip': 3.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/tree': 3.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/utils': 3.33.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-aria/visually-hidden': 3.8.31(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
- react-hook-form@7.60.0(react@19.1.0):
+ react-dom@19.2.4(react@19.2.4):
dependencies:
- react: 19.1.0
+ react: 19.2.4
+ scheduler: 0.27.0
- react-intl@6.8.9(react@19.1.0)(typescript@5.8.3):
+ react-error-boundary@4.1.2(react@19.2.4):
dependencies:
- '@formatjs/ecma402-abstract': 2.2.4
- '@formatjs/icu-messageformat-parser': 2.9.4
- '@formatjs/intl': 2.10.15(typescript@5.8.3)
- '@formatjs/intl-displaynames': 6.8.5
- '@formatjs/intl-listformat': 7.7.5
- '@types/hoist-non-react-statics': 3.3.6
- '@types/react': 18.3.23
- hoist-non-react-statics: 3.3.2
- intl-messageformat: 10.7.7
- react: 19.1.0
- tslib: 2.8.1
- optionalDependencies:
- typescript: 5.8.3
+ '@babel/runtime': 7.28.3
+ react: 19.2.4
+
+ react-hook-form@7.71.1(react@19.2.4):
+ dependencies:
+ react: 19.2.4
react-is@16.13.1: {}
react-is@18.3.1: {}
- react-redux@9.2.0(@types/react@19.1.8)(react@19.1.0)(redux@5.0.1):
+ react-redux@9.2.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1):
dependencies:
'@types/use-sync-external-store': 0.0.6
- react: 19.1.0
- use-sync-external-store: 1.5.0(react@19.1.0)
+ react: 19.2.4
+ use-sync-external-store: 1.5.0(react@19.2.4)
optionalDependencies:
- '@types/react': 19.1.8
+ '@types/react': 19.2.14
redux: 5.0.1
- react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ react-resizable-panels@4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
d3-geo: 2.0.2
d3-selection: 2.0.0
d3-zoom: 2.0.0
prop-types: 15.8.1
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
topojson-client: 3.1.0
- react-use-measure@2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ react-stately@3.45.0(react@19.2.4):
dependencies:
- react: 19.1.0
+ '@react-stately/calendar': 3.9.3(react@19.2.4)
+ '@react-stately/checkbox': 3.7.5(react@19.2.4)
+ '@react-stately/collections': 3.12.10(react@19.2.4)
+ '@react-stately/color': 3.9.5(react@19.2.4)
+ '@react-stately/combobox': 3.13.0(react@19.2.4)
+ '@react-stately/data': 3.15.2(react@19.2.4)
+ '@react-stately/datepicker': 3.16.1(react@19.2.4)
+ '@react-stately/disclosure': 3.0.11(react@19.2.4)
+ '@react-stately/dnd': 3.7.4(react@19.2.4)
+ '@react-stately/form': 3.2.4(react@19.2.4)
+ '@react-stately/list': 3.13.4(react@19.2.4)
+ '@react-stately/menu': 3.9.11(react@19.2.4)
+ '@react-stately/numberfield': 3.11.0(react@19.2.4)
+ '@react-stately/overlays': 3.6.23(react@19.2.4)
+ '@react-stately/radio': 3.11.5(react@19.2.4)
+ '@react-stately/searchfield': 3.5.19(react@19.2.4)
+ '@react-stately/select': 3.9.2(react@19.2.4)
+ '@react-stately/selection': 3.20.9(react@19.2.4)
+ '@react-stately/slider': 3.7.5(react@19.2.4)
+ '@react-stately/table': 3.15.4(react@19.2.4)
+ '@react-stately/tabs': 3.8.9(react@19.2.4)
+ '@react-stately/toast': 3.1.3(react@19.2.4)
+ '@react-stately/toggle': 3.9.5(react@19.2.4)
+ '@react-stately/tooltip': 3.5.11(react@19.2.4)
+ '@react-stately/tree': 3.9.6(react@19.2.4)
+ '@react-types/shared': 3.33.1(react@19.2.4)
+ react: 19.2.4
+
+ react-use-measure@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ react: 19.2.4
optionalDependencies:
- react-dom: 19.1.0(react@19.1.0)
+ react-dom: 19.2.4(react@19.2.4)
- react-window@1.8.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ react-window@1.8.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@babel/runtime': 7.27.6
+ '@babel/runtime': 7.28.3
memoize-one: 5.2.1
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
- react@19.1.0: {}
-
- read-babelrc-up@1.1.0:
- dependencies:
- find-up: 4.1.0
- json5: 2.2.3
+ react@19.2.4: {}
read-cache@1.0.0:
dependencies:
pify: 2.3.0
- read-pkg-up@7.0.1:
- dependencies:
- find-up: 4.1.0
- read-pkg: 5.2.0
- type-fest: 0.8.1
-
- read-pkg-up@8.0.0:
- dependencies:
- find-up: 5.0.0
- read-pkg: 6.0.0
- type-fest: 1.4.0
-
read-pkg@3.0.0:
dependencies:
load-json-file: 4.0.0
normalize-package-data: 2.5.0
path-type: 3.0.0
- read-pkg@5.2.0:
- dependencies:
- '@types/normalize-package-data': 2.4.4
- normalize-package-data: 2.5.0
- parse-json: 5.2.0
- type-fest: 0.6.0
-
- read-pkg@6.0.0:
- dependencies:
- '@types/normalize-package-data': 2.4.4
- normalize-package-data: 3.0.3
- parse-json: 5.2.0
- type-fest: 1.4.0
-
readable-stream@2.3.8:
dependencies:
- core-util-is: 1.0.2
+ core-util-is: 1.0.3
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
@@ -12930,15 +13167,7 @@ snapshots:
string_decoder: 1.1.1
util-deprecate: 1.0.2
- redent@3.0.0:
- dependencies:
- indent-string: 4.0.0
- strip-indent: 3.0.0
-
- redent@4.0.0:
- dependencies:
- indent-string: 5.0.0
- strip-indent: 4.0.0
+ readdirp@4.1.2: {}
redis@4.7.1:
dependencies:
@@ -12962,12 +13191,6 @@ snapshots:
get-proto: 1.0.1
which-builtin-type: 1.2.1
- regenerate-unicode-properties@10.2.0:
- dependencies:
- regenerate: 1.4.2
-
- regenerate@1.4.2: {}
-
regexp.prototype.flags@1.5.4:
dependencies:
call-bind: 1.0.8
@@ -12977,20 +13200,7 @@ snapshots:
gopd: 1.2.0
set-function-name: 2.0.2
- regexpu-core@6.2.0:
- dependencies:
- regenerate: 1.4.2
- regenerate-unicode-properties: 10.2.0
- regjsgen: 0.8.0
- regjsparser: 0.12.0
- unicode-match-property-ecmascript: 2.0.0
- unicode-match-property-value-ecmascript: 2.2.0
-
- regjsgen@0.8.0: {}
-
- regjsparser@0.12.0:
- dependencies:
- jsesc: 3.0.2
+ remeda@2.33.4: {}
request-ip@3.3.0: {}
@@ -13020,21 +13230,12 @@ snapshots:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- resolve@2.0.0-next.5:
- dependencies:
- is-core-module: 2.16.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
restore-cursor@3.1.0:
dependencies:
onetime: 5.1.2
signal-exit: 3.0.7
- restore-cursor@4.0.0:
- dependencies:
- onetime: 5.1.2
- signal-exit: 3.0.7
+ retry@0.12.0: {}
reusify@1.1.0: {}
@@ -13052,46 +13253,41 @@ snapshots:
globby: 10.0.1
is-plain-object: 3.0.1
- rollup-plugin-delete@2.2.0(rollup@3.29.5):
+ rollup-plugin-delete@3.0.2(rollup@4.60.1):
dependencies:
- del: 6.1.1
- rollup: 3.29.5
+ del: 8.0.1
+ rollup: 4.60.1
- rollup-plugin-dts@5.3.1(rollup@3.29.5)(typescript@5.8.3):
+ rollup-plugin-dts@6.4.1(rollup@4.60.1)(typescript@5.9.3):
dependencies:
- magic-string: 0.30.17
- rollup: 3.29.5
- typescript: 5.8.3
+ '@jridgewell/remapping': 2.3.5
+ '@jridgewell/sourcemap-codec': 1.5.5
+ convert-source-map: 2.0.0
+ magic-string: 0.30.21
+ rollup: 4.60.1
+ typescript: 5.9.3
optionalDependencies:
- '@babel/code-frame': 7.27.1
+ '@babel/code-frame': 7.29.0
- rollup-plugin-esbuild@5.0.0(esbuild@0.25.8)(rollup@3.29.5):
+ rollup-plugin-node-externals@8.1.2(rollup@4.60.1):
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@3.29.5)
- debug: 4.4.1(supports-color@8.1.1)
- es-module-lexer: 1.7.0
- esbuild: 0.25.8
- joycon: 3.1.1
- jsonc-parser: 3.3.1
- rollup: 3.29.5
- transitivePeerDependencies:
- - supports-color
+ rollup: 4.60.1
- rollup-plugin-node-externals@6.1.2(rollup@3.29.5):
+ rollup-plugin-peer-deps-external@2.2.4(rollup@4.60.1):
dependencies:
- rollup: 3.29.5
+ rollup: 4.60.1
- rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)):
+ rollup-plugin-postcss@4.0.2(postcss@8.5.8)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)):
dependencies:
chalk: 4.1.2
concat-with-sourcemaps: 1.1.0
- cssnano: 5.1.15(postcss@8.5.6)
+ cssnano: 5.1.15(postcss@8.5.8)
import-cwd: 3.0.0
p-queue: 6.6.2
pify: 5.0.0
- postcss: 8.5.6
- postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
- postcss-modules: 4.3.1(postcss@8.5.6)
+ postcss: 8.5.8
+ postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
+ postcss-modules: 4.3.1(postcss@8.5.8)
promise.series: 0.2.0
resolve: 1.22.10
rollup-pluginutils: 2.8.2
@@ -13104,10 +13300,59 @@ snapshots:
dependencies:
estree-walker: 0.6.1
- rollup@3.29.5:
+ rollup@4.60.1:
+ dependencies:
+ '@types/estree': 1.0.8
optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.60.1
+ '@rollup/rollup-android-arm64': 4.60.1
+ '@rollup/rollup-darwin-arm64': 4.60.1
+ '@rollup/rollup-darwin-x64': 4.60.1
+ '@rollup/rollup-freebsd-arm64': 4.60.1
+ '@rollup/rollup-freebsd-x64': 4.60.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.60.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.60.1
+ '@rollup/rollup-linux-arm64-gnu': 4.60.1
+ '@rollup/rollup-linux-arm64-musl': 4.60.1
+ '@rollup/rollup-linux-loong64-gnu': 4.60.1
+ '@rollup/rollup-linux-loong64-musl': 4.60.1
+ '@rollup/rollup-linux-ppc64-gnu': 4.60.1
+ '@rollup/rollup-linux-ppc64-musl': 4.60.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.60.1
+ '@rollup/rollup-linux-riscv64-musl': 4.60.1
+ '@rollup/rollup-linux-s390x-gnu': 4.60.1
+ '@rollup/rollup-linux-x64-gnu': 4.60.1
+ '@rollup/rollup-linux-x64-musl': 4.60.1
+ '@rollup/rollup-openbsd-x64': 4.60.1
+ '@rollup/rollup-openharmony-arm64': 4.60.1
+ '@rollup/rollup-win32-arm64-msvc': 4.60.1
+ '@rollup/rollup-win32-ia32-msvc': 4.60.1
+ '@rollup/rollup-win32-x64-gnu': 4.60.1
+ '@rollup/rollup-win32-x64-msvc': 4.60.1
fsevents: 2.3.3
+ rrdom@0.1.7:
+ dependencies:
+ rrweb-snapshot: 2.0.0-alpha.4
+
+ rrweb-player@1.0.0-alpha.4:
+ dependencies:
+ '@tsconfig/svelte': 1.0.13
+ rrweb: 2.0.0-alpha.4
+
+ rrweb-snapshot@2.0.0-alpha.4: {}
+
+ rrweb@2.0.0-alpha.4:
+ dependencies:
+ '@rrweb/types': 2.0.0-alpha.20
+ '@types/css-font-loading-module': 0.0.7
+ '@xstate/fsm': 1.6.5
+ base64-arraybuffer: 1.0.2
+ fflate: 0.4.8
+ mitt: 3.0.1
+ rrdom: 0.1.7
+ rrweb-snapshot: 2.0.0-alpha.4
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
@@ -13143,19 +13388,15 @@ snapshots:
safer-buffer@2.1.2: {}
- scheduler@0.26.0: {}
-
- schema-utils@2.7.1:
- dependencies:
- '@types/json-schema': 7.0.15
- ajv: 6.12.6
- ajv-keywords: 3.5.2(ajv@6.12.6)
+ scheduler@0.27.0: {}
semver@5.7.2: {}
semver@6.3.1: {}
- semver@7.7.2: {}
+ semver@7.7.4: {}
+
+ seq-queue@0.0.5: {}
serialize-error@12.0.0:
dependencies:
@@ -13189,34 +13430,36 @@ snapshots:
setimmediate@1.0.5: {}
- sharp@0.34.4:
+ sharp@0.34.5:
dependencies:
- '@img/colour': 1.0.0
- detect-libc: 2.1.0
- semver: 7.7.2
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
optionalDependencies:
- '@img/sharp-darwin-arm64': 0.34.4
- '@img/sharp-darwin-x64': 0.34.4
- '@img/sharp-libvips-darwin-arm64': 1.2.3
- '@img/sharp-libvips-darwin-x64': 1.2.3
- '@img/sharp-libvips-linux-arm': 1.2.3
- '@img/sharp-libvips-linux-arm64': 1.2.3
- '@img/sharp-libvips-linux-ppc64': 1.2.3
- '@img/sharp-libvips-linux-s390x': 1.2.3
- '@img/sharp-libvips-linux-x64': 1.2.3
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.3
- '@img/sharp-libvips-linuxmusl-x64': 1.2.3
- '@img/sharp-linux-arm': 0.34.4
- '@img/sharp-linux-arm64': 0.34.4
- '@img/sharp-linux-ppc64': 0.34.4
- '@img/sharp-linux-s390x': 0.34.4
- '@img/sharp-linux-x64': 0.34.4
- '@img/sharp-linuxmusl-arm64': 0.34.4
- '@img/sharp-linuxmusl-x64': 0.34.4
- '@img/sharp-wasm32': 0.34.4
- '@img/sharp-win32-arm64': 0.34.4
- '@img/sharp-win32-ia32': 0.34.4
- '@img/sharp-win32-x64': 0.34.4
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
optional: true
shebang-command@1.2.0:
@@ -13269,6 +13512,8 @@ snapshots:
slash@3.0.0: {}
+ slash@5.1.0: {}
+
slice-ansi@3.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -13281,11 +13526,6 @@ snapshots:
astral-regex: 2.0.0
is-fullwidth-code-point: 3.0.0
- slice-ansi@5.0.0:
- dependencies:
- ansi-styles: 6.2.1
- is-fullwidth-code-point: 4.0.0
-
smob@1.5.0: {}
snake-case@3.0.4:
@@ -13293,10 +13533,6 @@ snapshots:
dot-case: 3.0.4
tslib: 2.8.1
- sort-keys@4.2.0:
- dependencies:
- is-plain-obj: 2.1.0
-
source-map-js@1.2.1: {}
source-map-support@0.5.13:
@@ -13311,22 +13547,28 @@ snapshots:
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.21
+ spdx-license-ids: 3.0.22
spdx-exceptions@2.5.0: {}
spdx-expression-parse@3.0.1:
dependencies:
spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.21
+ spdx-license-ids: 3.0.22
- spdx-license-ids@3.0.21: {}
+ spdx-license-ids@3.0.22: {}
+
+ split2@4.2.0: {}
sprintf-js@1.0.3: {}
+ sqlstring@2.3.3: {}
+
sshpk@1.18.0:
dependencies:
asn1: 0.2.6
@@ -13339,21 +13581,19 @@ snapshots:
safer-buffer: 2.1.2
tweetnacl: 0.14.5
- stable-hash@0.0.5: {}
-
stable@0.1.8: {}
stack-utils@2.0.6:
dependencies:
escape-string-regexp: 2.0.0
+ std-env@3.10.0: {}
+
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
internal-slot: 1.1.0
- string-argv@0.3.2: {}
-
string-hash@1.1.3: {}
string-length@4.0.2:
@@ -13371,29 +13611,7 @@ snapshots:
dependencies:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
- strip-ansi: 7.1.0
-
- string.prototype.includes@2.0.1:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
-
- string.prototype.matchall@4.0.12:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- regexp.prototype.flags: 1.5.4
- set-function-name: 2.0.2
- side-channel: 1.1.0
+ strip-ansi: 7.1.2
string.prototype.padend@3.1.6:
dependencies:
@@ -13402,11 +13620,6 @@ snapshots:
es-abstract: 1.24.0
es-object-atoms: 1.1.1
- string.prototype.repeat@1.0.0:
- dependencies:
- define-properties: 1.2.1
- es-abstract: 1.24.0
-
string.prototype.trim@1.2.10:
dependencies:
call-bind: 1.0.8
@@ -13438,9 +13651,9 @@ snapshots:
dependencies:
ansi-regex: 5.0.1
- strip-ansi@7.1.0:
+ strip-ansi@7.1.2:
dependencies:
- ansi-regex: 6.1.0
+ ansi-regex: 6.2.2
strip-bom@3.0.0: {}
@@ -13448,107 +13661,50 @@ snapshots:
strip-final-newline@2.0.0: {}
- strip-final-newline@3.0.0: {}
-
- strip-indent@3.0.0:
- dependencies:
- min-indent: 1.0.1
-
- strip-indent@4.0.0:
- dependencies:
- min-indent: 1.0.1
-
strip-json-comments@3.1.1: {}
style-inject@0.3.0: {}
- style-search@0.1.0: {}
-
- styled-jsx@5.1.6(@babel/core@7.28.0)(react@19.1.0):
+ styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.4):
dependencies:
client-only: 0.0.1
- react: 19.1.0
+ react: 19.2.4
optionalDependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
- stylehacks@5.1.1(postcss@8.5.6):
+ stylehacks@5.1.1(postcss@8.5.8):
dependencies:
- browserslist: 4.25.1
- postcss: 8.5.6
+ browserslist: 4.25.2
+ postcss: 8.5.8
postcss-selector-parser: 6.1.2
- stylelint-config-css-modules@4.5.1(stylelint@15.11.0(typescript@5.8.3)):
- dependencies:
- stylelint: 15.11.0(typescript@5.8.3)
+ stylelint-config-css-modules@4.6.0:
optionalDependencies:
- stylelint-scss: 6.12.1(stylelint@15.11.0(typescript@5.8.3))
+ stylelint-scss: 7.0.0
- stylelint-config-prettier@9.0.5(stylelint@15.11.0(typescript@5.8.3)):
- dependencies:
- stylelint: 15.11.0(typescript@5.8.3)
+ stylelint-config-prettier@9.0.5: {}
- stylelint-config-recommended@14.0.1(stylelint@15.11.0(typescript@5.8.3)):
- dependencies:
- stylelint: 15.11.0(typescript@5.8.3)
-
- stylelint-scss@6.12.1(stylelint@15.11.0(typescript@5.8.3)):
+ stylelint-scss@7.0.0:
dependencies:
css-tree: 3.1.0
is-plain-object: 5.0.0
- known-css-properties: 0.36.0
- mdn-data: 2.23.0
+ known-css-properties: 0.37.0
+ mdn-data: 2.27.1
postcss-media-query-parser: 0.2.3
postcss-resolve-nested-selector: 0.1.6
- postcss-selector-parser: 7.1.0
+ postcss-selector-parser: 7.1.1
postcss-value-parser: 4.2.0
- stylelint: 15.11.0(typescript@5.8.3)
optional: true
- stylelint@15.11.0(typescript@5.8.3):
+ sucrase@3.35.0:
dependencies:
- '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
- '@csstools/css-tokenizer': 2.4.1
- '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
- '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2)
- balanced-match: 2.0.0
- colord: 2.9.3
- cosmiconfig: 8.3.6(typescript@5.8.3)
- css-functions-list: 3.2.3
- css-tree: 2.3.1
- debug: 4.4.1(supports-color@8.1.1)
- fast-glob: 3.3.3
- fastest-levenshtein: 1.0.16
- file-entry-cache: 7.0.2
- global-modules: 2.0.0
- globby: 11.1.0
- globjoin: 0.1.4
- html-tags: 3.3.1
- ignore: 5.3.2
- import-lazy: 4.0.0
- imurmurhash: 0.1.4
- is-plain-object: 5.0.0
- known-css-properties: 0.29.0
- mathml-tag-names: 2.1.3
- meow: 10.1.5
- micromatch: 4.0.8
- normalize-path: 3.0.0
- picocolors: 1.1.1
- postcss: 8.5.6
- postcss-resolve-nested-selector: 0.1.6
- postcss-safe-parser: 6.0.0(postcss@8.5.6)
- postcss-selector-parser: 6.1.2
- postcss-value-parser: 4.2.0
- resolve-from: 5.0.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
- style-search: 0.1.0
- supports-hyperlinks: 3.2.0
- svg-tags: 1.0.0
- table: 6.9.0
- write-file-atomic: 5.0.1
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@jridgewell/gen-mapping': 0.3.13
+ commander: 4.1.1
+ glob: 10.5.0
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.7
+ ts-interface-checker: 0.1.13
supports-color@5.5.0:
dependencies:
@@ -13562,17 +13718,10 @@ snapshots:
dependencies:
has-flag: 4.0.0
- supports-hyperlinks@3.2.0:
- dependencies:
- has-flag: 4.0.0
- supports-color: 7.2.0
-
supports-preserve-symlinks-flag@1.0.0: {}
svg-parser@2.0.4: {}
- svg-tags@1.0.0: {}
-
svgo@2.8.0:
dependencies:
'@trysound/sax': 0.2.0
@@ -13593,26 +13742,27 @@ snapshots:
csso: 5.0.5
picocolors: 1.1.1
- table@6.9.0:
- dependencies:
- ajv: 8.17.1
- lodash.truncate: 4.4.2
- slice-ansi: 4.0.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
+ tailwind-merge@3.4.0: {}
- tar@6.2.1:
+ tailwind-variants@3.2.2(tailwind-merge@3.4.0)(tailwindcss@4.1.18):
dependencies:
- chownr: 2.0.0
- fs-minipass: 2.1.0
- minipass: 5.0.0
- minizlib: 2.1.2
- mkdirp: 1.0.4
- yallist: 4.0.0
+ tailwindcss: 4.1.18
+ optionalDependencies:
+ tailwind-merge: 3.4.0
+
+ tailwindcss@4.1.18: {}
+
+ tar@7.5.13:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
terser@5.43.1:
dependencies:
- '@jridgewell/source-map': 0.3.10
+ '@jridgewell/source-map': 0.3.11
acorn: 8.15.0
commander: 2.20.3
source-map-support: 0.5.21
@@ -13623,21 +13773,31 @@ snapshots:
glob: 7.2.3
minimatch: 3.1.2
- text-table@0.2.0: {}
-
thenby@1.3.4: {}
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
throttleit@1.0.1: {}
through@2.3.8: {}
tiny-invariant@1.3.3: {}
- tiny-lru@11.3.3: {}
+ tiny-lru@11.4.7: {}
+
+ tinyexec@0.3.2: {}
+
+ tinyexec@1.0.4: {}
tinyglobby@0.2.14:
dependencies:
- fdir: 6.4.6(picomatch@4.0.3)
+ fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
tldts-core@6.1.86: {}
@@ -13646,7 +13806,7 @@ snapshots:
dependencies:
tldts-core: 6.1.86
- tmp@0.2.3: {}
+ tmp@0.2.5: {}
tmpl@1.0.5: {}
@@ -13664,68 +13824,91 @@ snapshots:
tree-kill@1.2.2: {}
- trim-newlines@3.0.1: {}
+ ts-interface-checker@0.1.13: {}
- trim-newlines@4.1.1: {}
-
- ts-api-utils@1.4.3(typescript@5.8.3):
- dependencies:
- typescript: 5.8.3
-
- ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.25.8)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3)))(typescript@5.8.3):
+ ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.27.4)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3)))(typescript@5.9.3):
dependencies:
bs-logger: 0.2.6
- ejs: 3.1.10
fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@22.16.5)(ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3))
+ handlebars: 4.7.8
+ jest: 29.7.0(@types/node@24.12.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3))
json5: 2.2.3
lodash.memoize: 4.1.2
make-error: 1.3.6
- semver: 7.7.2
+ semver: 7.7.4
type-fest: 4.41.0
- typescript: 5.8.3
+ typescript: 5.9.3
yargs-parser: 21.1.1
optionalDependencies:
- '@babel/core': 7.28.0
+ '@babel/core': 7.28.3
'@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.0)
- esbuild: 0.25.8
- jest-util: 29.7.0
+ '@jest/types': 30.0.5
+ babel-jest: 29.7.0(@babel/core@7.28.3)
+ esbuild: 0.27.4
+ jest-util: 30.0.5
- ts-node@10.9.2(@types/node@22.16.5)(typescript@5.8.3):
+ ts-morph@27.0.2:
+ dependencies:
+ '@ts-morph/common': 0.28.1
+ code-block-writer: 13.0.3
+
+ ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.20))(@types/node@24.12.0)(typescript@5.9.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 22.16.5
+ '@types/node': 24.12.0
acorn: 8.15.0
acorn-walk: 8.3.4
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.8.3
+ typescript: 5.9.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
-
- tsconfig-paths@3.15.0:
- dependencies:
- '@types/json5': 0.0.29
- json5: 1.0.2
- minimist: 1.2.8
- strip-bom: 3.0.0
-
- tslib@1.14.1: {}
+ optionalDependencies:
+ '@swc/core': 1.15.11(@swc/helpers@0.5.20)
tslib@2.8.1: {}
- tsutils@3.21.0(typescript@5.8.3):
+ tsup@8.5.1(@swc/core@1.15.11(@swc/helpers@0.5.20))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1):
dependencies:
- tslib: 1.14.1
- typescript: 5.8.3
+ bundle-require: 5.1.0(esbuild@0.27.4)
+ cac: 6.7.14
+ chokidar: 4.0.3
+ consola: 3.4.2
+ debug: 4.4.3(supports-color@8.1.1)
+ esbuild: 0.27.4
+ fix-dts-default-cjs-exports: 1.0.1
+ joycon: 3.1.1
+ picocolors: 1.1.1
+ postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.1)
+ resolve-from: 5.0.0
+ rollup: 4.60.1
+ source-map: 0.7.6
+ sucrase: 3.35.0
+ tinyexec: 0.3.2
+ tinyglobby: 0.2.14
+ tree-kill: 1.2.2
+ optionalDependencies:
+ '@swc/core': 1.15.11(@swc/helpers@0.5.20)
+ postcss: 8.5.8
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - jiti
+ - supports-color
+ - tsx
+ - yaml
+
+ tsx@4.21.0:
+ dependencies:
+ esbuild: 0.27.4
+ get-tsconfig: 4.13.0
+ optionalDependencies:
+ fsevents: 2.3.3
tunnel-agent@0.6.0:
dependencies:
@@ -13733,24 +13916,10 @@ snapshots:
tweetnacl@0.14.5: {}
- type-check@0.4.0:
- dependencies:
- prelude-ls: 1.2.1
-
type-detect@4.0.8: {}
- type-fest@0.13.1: {}
-
- type-fest@0.20.2: {}
-
type-fest@0.21.3: {}
- type-fest@0.6.0: {}
-
- type-fest@0.8.1: {}
-
- type-fest@1.4.0: {}
-
type-fest@4.41.0: {}
typed-array-buffer@1.0.3:
@@ -13786,13 +13955,20 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typedarray-to-buffer@3.1.5:
+ typescript@5.9.3: {}
+
+ ua-is-frozen@0.1.2: {}
+
+ ua-parser-js@2.0.9:
dependencies:
- is-typedarray: 1.0.0
+ detect-europe-js: 0.1.2
+ is-standalone-pwa: 0.1.1
+ ua-is-frozen: 0.1.2
- typescript@4.9.5: {}
+ ufo@1.6.1: {}
- typescript@5.8.3: {}
+ uglify-js@3.19.3:
+ optional: true
unbox-primitive@1.1.0:
dependencies:
@@ -13801,81 +13977,62 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
- undici-types@6.21.0: {}
+ undici-types@7.16.0: {}
- unicode-canonical-property-names-ecmascript@2.0.1: {}
-
- unicode-match-property-ecmascript@2.0.0:
- dependencies:
- unicode-canonical-property-names-ecmascript: 2.0.1
- unicode-property-aliases-ecmascript: 2.1.0
-
- unicode-match-property-value-ecmascript@2.2.0: {}
-
- unicode-property-aliases-ecmascript@2.1.0: {}
+ unicorn-magic@0.3.0: {}
universalify@0.1.2: {}
universalify@2.0.1: {}
- unrs-resolver@1.11.1:
- dependencies:
- napi-postinstall: 0.3.2
- optionalDependencies:
- '@unrs/resolver-binding-android-arm-eabi': 1.11.1
- '@unrs/resolver-binding-android-arm64': 1.11.1
- '@unrs/resolver-binding-darwin-arm64': 1.11.1
- '@unrs/resolver-binding-darwin-x64': 1.11.1
- '@unrs/resolver-binding-freebsd-x64': 1.11.1
- '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
- '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
- '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
- '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
- '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
- '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
- '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
- '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
- '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
- '@unrs/resolver-binding-linux-x64-musl': 1.11.1
- '@unrs/resolver-binding-wasm32-wasi': 1.11.1
- '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
- '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
- '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
-
untildify@4.0.0: {}
- update-browserslist-db@1.1.3(browserslist@4.25.1):
+ update-browserslist-db@1.1.3(browserslist@4.25.2):
dependencies:
- browserslist: 4.25.1
+ browserslist: 4.25.2
escalade: 3.2.0
picocolors: 1.1.1
- uri-js@4.4.1:
+ use-intl@4.8.4(react@19.2.4):
dependencies:
- punycode: 2.3.1
+ '@formatjs/fast-memoize': 3.1.1
+ '@schummar/icu-type-parser': 1.21.5
+ icu-minify: 4.8.4
+ intl-messageformat: 11.2.0
+ react: 19.2.4
- use-memo-one@1.1.3(react@19.1.0):
+ use-memo-one@1.1.3(react@19.2.4):
dependencies:
- react: 19.1.0
+ react: 19.2.4
- use-sync-external-store@1.5.0(react@19.1.0):
+ use-sync-external-store@1.5.0(react@19.2.4):
dependencies:
- react: 19.1.0
+ react: 19.2.4
+
+ use-sync-external-store@1.6.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
util-deprecate@1.0.2: {}
- uuid@8.3.2: {}
+ uuid@11.1.0: {}
- uuid@9.0.1: {}
+ uuid@13.0.0: {}
+
+ uuid@8.3.2: {}
v8-compile-cache-lib@3.0.1: {}
v8-to-istanbul@9.3.0:
dependencies:
- '@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/trace-mapping': 0.3.30
'@types/istanbul-lib-coverage': 2.0.6
convert-source-map: 2.0.0
+ valibot@1.2.0(typescript@5.9.3):
+ optionalDependencies:
+ typescript: 5.9.3
+
validate-npm-package-license@3.0.4:
dependencies:
spdx-correct: 3.2.0
@@ -13889,16 +14046,6 @@ snapshots:
core-util-is: 1.0.2
extsprintf: 1.3.0
- vue@3.5.17(typescript@4.9.5):
- dependencies:
- '@vue/compiler-dom': 3.5.17
- '@vue/compiler-sfc': 3.5.17
- '@vue/runtime-dom': 3.5.17
- '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3))
- '@vue/shared': 3.5.17
- optionalDependencies:
- typescript: 4.9.5
-
walker@1.0.8:
dependencies:
makeerror: 1.0.12
@@ -13954,7 +14101,7 @@ snapshots:
dependencies:
isexe: 2.0.0
- word-wrap@1.2.5: {}
+ wordwrap@1.0.0: {}
wrap-ansi@6.2.0:
dependencies:
@@ -13970,37 +14117,18 @@ snapshots:
wrap-ansi@8.1.0:
dependencies:
- ansi-styles: 6.2.1
+ ansi-styles: 6.2.3
string-width: 5.1.2
- strip-ansi: 7.1.0
+ strip-ansi: 7.1.2
wrappy@1.0.2: {}
- write-file-atomic@3.0.3:
- dependencies:
- imurmurhash: 0.1.4
- is-typedarray: 1.0.0
- signal-exit: 3.0.7
- typedarray-to-buffer: 3.1.5
-
write-file-atomic@4.0.2:
dependencies:
imurmurhash: 0.1.4
signal-exit: 3.0.7
- write-file-atomic@5.0.1:
- dependencies:
- imurmurhash: 0.1.4
- signal-exit: 4.1.0
-
- write-json-file@4.3.0:
- dependencies:
- detect-indent: 6.1.0
- graceful-fs: 4.2.11
- is-plain-obj: 2.1.0
- make-dir: 3.1.0
- sort-keys: 4.2.0
- write-file-atomic: 3.0.3
+ xtend@4.0.2: {}
y18n@5.0.8: {}
@@ -14008,16 +14136,12 @@ snapshots:
yallist@4.0.0: {}
+ yallist@5.0.0: {}
+
yaml@1.10.2: {}
- yaml@2.3.1: {}
-
- yargs-parser@18.1.3:
- dependencies:
- camelcase: 5.3.1
- decamelize: 1.2.0
-
- yargs-parser@20.2.9: {}
+ yaml@2.8.1:
+ optional: true
yargs-parser@21.1.1: {}
@@ -14040,12 +14164,16 @@ snapshots:
yocto-queue@0.1.0: {}
- zod@3.25.76: {}
-
- zustand@4.5.7(@types/react@19.1.8)(immer@9.0.21)(react@19.1.0):
+ zeptomatch@2.1.0:
dependencies:
- use-sync-external-store: 1.5.0(react@19.1.0)
+ grammex: 3.1.12
+ graphmatch: 1.1.1
+
+ zod@4.3.6: {}
+
+ zustand@5.0.12(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)):
optionalDependencies:
- '@types/react': 19.1.8
- immer: 9.0.21
- react: 19.1.0
+ '@types/react': 19.2.14
+ immer: 11.1.4
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 000000000..fc1bf988b
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,17 @@
+export default {
+ plugins: [
+ 'postcss-flexbugs-fixes',
+ [
+ 'postcss-preset-env',
+ {
+ autoprefixer: {
+ flexbox: 'no-2009',
+ },
+ stage: 3,
+ features: {
+ 'custom-properties': false,
+ },
+ },
+ ],
+ ],
+};
diff --git a/prisma.config.ts b/prisma.config.ts
new file mode 100644
index 000000000..8ce899ad8
--- /dev/null
+++ b/prisma.config.ts
@@ -0,0 +1,8 @@
+import 'dotenv/config';
+import { defineConfig, env } from 'prisma/config';
+
+export default defineConfig({
+ datasource: {
+ url: env('DATABASE_URL'),
+ },
+});
diff --git a/db/postgresql/migrations/01_init/migration.sql b/prisma/migrations/01_init/migration.sql
similarity index 100%
rename from db/postgresql/migrations/01_init/migration.sql
rename to prisma/migrations/01_init/migration.sql
diff --git a/db/postgresql/migrations/02_report_schema_session_data/migration.sql b/prisma/migrations/02_report_schema_session_data/migration.sql
similarity index 100%
rename from db/postgresql/migrations/02_report_schema_session_data/migration.sql
rename to prisma/migrations/02_report_schema_session_data/migration.sql
diff --git a/db/postgresql/migrations/03_metric_performance_index/migration.sql b/prisma/migrations/03_metric_performance_index/migration.sql
similarity index 100%
rename from db/postgresql/migrations/03_metric_performance_index/migration.sql
rename to prisma/migrations/03_metric_performance_index/migration.sql
diff --git a/db/postgresql/migrations/04_team_redesign/migration.sql b/prisma/migrations/04_team_redesign/migration.sql
similarity index 100%
rename from db/postgresql/migrations/04_team_redesign/migration.sql
rename to prisma/migrations/04_team_redesign/migration.sql
diff --git a/db/postgresql/migrations/05_add_visit_id/migration.sql b/prisma/migrations/05_add_visit_id/migration.sql
similarity index 100%
rename from db/postgresql/migrations/05_add_visit_id/migration.sql
rename to prisma/migrations/05_add_visit_id/migration.sql
diff --git a/db/postgresql/migrations/06_session_data/migration.sql b/prisma/migrations/06_session_data/migration.sql
similarity index 100%
rename from db/postgresql/migrations/06_session_data/migration.sql
rename to prisma/migrations/06_session_data/migration.sql
diff --git a/db/postgresql/migrations/07_add_tag/migration.sql b/prisma/migrations/07_add_tag/migration.sql
similarity index 100%
rename from db/postgresql/migrations/07_add_tag/migration.sql
rename to prisma/migrations/07_add_tag/migration.sql
diff --git a/db/postgresql/migrations/08_add_utm_clid/migration.sql b/prisma/migrations/08_add_utm_clid/migration.sql
similarity index 100%
rename from db/postgresql/migrations/08_add_utm_clid/migration.sql
rename to prisma/migrations/08_add_utm_clid/migration.sql
diff --git a/db/postgresql/migrations/09_update_hostname_region/migration.sql b/prisma/migrations/09_update_hostname_region/migration.sql
similarity index 100%
rename from db/postgresql/migrations/09_update_hostname_region/migration.sql
rename to prisma/migrations/09_update_hostname_region/migration.sql
diff --git a/db/postgresql/migrations/10_add_distinct_id/migration.sql b/prisma/migrations/10_add_distinct_id/migration.sql
similarity index 100%
rename from db/postgresql/migrations/10_add_distinct_id/migration.sql
rename to prisma/migrations/10_add_distinct_id/migration.sql
diff --git a/db/postgresql/migrations/11_add_segment/migration.sql b/prisma/migrations/11_add_segment/migration.sql
similarity index 100%
rename from db/postgresql/migrations/11_add_segment/migration.sql
rename to prisma/migrations/11_add_segment/migration.sql
diff --git a/db/postgresql/migrations/12_update_report_parameter/migration.sql b/prisma/migrations/12_update_report_parameter/migration.sql
similarity index 100%
rename from db/postgresql/migrations/12_update_report_parameter/migration.sql
rename to prisma/migrations/12_update_report_parameter/migration.sql
diff --git a/db/postgresql/migrations/13_add_revenue/migration.sql b/prisma/migrations/13_add_revenue/migration.sql
similarity index 100%
rename from db/postgresql/migrations/13_add_revenue/migration.sql
rename to prisma/migrations/13_add_revenue/migration.sql
diff --git a/prisma/migrations/14_add_link_and_pixel/migration.sql b/prisma/migrations/14_add_link_and_pixel/migration.sql
new file mode 100644
index 000000000..29d9e300a
--- /dev/null
+++ b/prisma/migrations/14_add_link_and_pixel/migration.sql
@@ -0,0 +1,119 @@
+-- AlterTable
+ALTER TABLE "report" ALTER COLUMN "type" SET DATA TYPE VARCHAR(50);
+
+-- AlterTable
+ALTER TABLE "revenue" ALTER COLUMN "currency" SET DATA TYPE VARCHAR(10);
+
+-- AlterTable
+ALTER TABLE "segment" ALTER COLUMN "type" SET DATA TYPE VARCHAR(50);
+
+-- CreateTable
+CREATE TABLE "link" (
+ "link_id" UUID NOT NULL,
+ "name" VARCHAR(100) NOT NULL,
+ "url" VARCHAR(500) NOT NULL,
+ "slug" VARCHAR(100) NOT NULL,
+ "user_id" UUID,
+ "team_id" UUID,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMPTZ(6),
+ "deleted_at" TIMESTAMPTZ(6),
+
+ CONSTRAINT "link_pkey" PRIMARY KEY ("link_id")
+);
+
+-- CreateTable
+CREATE TABLE "pixel" (
+ "pixel_id" UUID NOT NULL,
+ "name" VARCHAR(100) NOT NULL,
+ "slug" VARCHAR(100) NOT NULL,
+ "user_id" UUID,
+ "team_id" UUID,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMPTZ(6),
+ "deleted_at" TIMESTAMPTZ(6),
+
+ CONSTRAINT "pixel_pkey" PRIMARY KEY ("pixel_id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "link_link_id_key" ON "link"("link_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "link_slug_key" ON "link"("slug");
+
+-- CreateIndex
+CREATE INDEX "link_slug_idx" ON "link"("slug");
+
+-- CreateIndex
+CREATE INDEX "link_user_id_idx" ON "link"("user_id");
+
+-- CreateIndex
+CREATE INDEX "link_team_id_idx" ON "link"("team_id");
+
+-- CreateIndex
+CREATE INDEX "link_created_at_idx" ON "link"("created_at");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "pixel_pixel_id_key" ON "pixel"("pixel_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "pixel_slug_key" ON "pixel"("slug");
+
+-- CreateIndex
+CREATE INDEX "pixel_slug_idx" ON "pixel"("slug");
+
+-- CreateIndex
+CREATE INDEX "pixel_user_id_idx" ON "pixel"("user_id");
+
+-- CreateIndex
+CREATE INDEX "pixel_team_id_idx" ON "pixel"("team_id");
+
+-- CreateIndex
+CREATE INDEX "pixel_created_at_idx" ON "pixel"("created_at");
+
+-- DataMigration Funnel
+DELETE FROM "report" WHERE type = 'funnel' and jsonb_array_length(parameters->'steps') = 1;
+UPDATE "report" SET parameters = parameters - 'websiteId' - 'dateRange' - 'urls' WHERE type = 'funnel';
+
+UPDATE "report"
+SET parameters = jsonb_set(
+ parameters,
+ '{steps}',
+ (
+ SELECT jsonb_agg(
+ CASE
+ WHEN step->>'type' = 'url'
+ THEN jsonb_set(step, '{type}', '"path"')
+ ELSE step
+ END
+ )
+ FROM jsonb_array_elements(parameters->'steps') step
+ )
+)
+WHERE type = 'funnel'
+ and parameters @> '{"steps":[{"type":"url"}]}';
+
+-- DataMigration Goals
+UPDATE "report" SET type = 'goal' WHERE type = 'goals';
+
+INSERT INTO "report" (report_id, user_id, website_id, type, name, description, parameters, created_at, updated_at)
+SELECT gen_random_uuid(),
+ user_id,
+ website_id,
+ 'goal',
+ concat(name, ' - ', elem ->> 'value'),
+ description,
+ jsonb_build_object(
+ 'type', CASE WHEN elem ->> 'type' = 'url' THEN 'path'
+ ELSE elem ->> 'type' END,
+ 'value', elem ->> 'value'
+ ) AS parameters,
+ created_at,
+ updated_at
+FROM "report"
+CROSS JOIN LATERAL jsonb_array_elements(parameters -> 'goals') elem
+WHERE type = 'goal'
+ and elem ->> 'type' IN ('event', 'url');
+
+DELETE FROM "report" WHERE type = 'goal' and parameters ? 'goals';
\ No newline at end of file
diff --git a/prisma/migrations/15_add_share/migration.sql b/prisma/migrations/15_add_share/migration.sql
new file mode 100644
index 000000000..89aece1ee
--- /dev/null
+++ b/prisma/migrations/15_add_share/migration.sql
@@ -0,0 +1,40 @@
+-- CreateTable
+CREATE TABLE "share" (
+ "share_id" UUID NOT NULL,
+ "entity_id" UUID NOT NULL,
+ "name" VARCHAR(200) NOT NULL,
+ "share_type" INTEGER NOT NULL,
+ "slug" VARCHAR(100) NOT NULL,
+ "parameters" JSONB NOT NULL,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMPTZ(6),
+
+ CONSTRAINT "share_pkey" PRIMARY KEY ("share_id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "share_slug_key" ON "share"("slug");
+
+-- CreateIndex
+CREATE INDEX "share_entity_id_idx" ON "share"("entity_id");
+
+-- MigrateData
+INSERT INTO "share" (share_id, entity_id, name, share_type, slug, parameters, created_at)
+SELECT gen_random_uuid(),
+ website_id,
+ name,
+ 1,
+ share_id,
+ '{"overview":true}'::jsonb,
+ now()
+FROM "website"
+WHERE share_id IS NOT NULL;
+
+-- DropIndex
+DROP INDEX "website_share_id_idx";
+
+-- DropIndex
+DROP INDEX "website_share_id_key";
+
+-- AlterTable
+ALTER TABLE "website" DROP COLUMN "share_id";
diff --git a/prisma/migrations/16_boards/migration.sql b/prisma/migrations/16_boards/migration.sql
new file mode 100644
index 000000000..09608c5fd
--- /dev/null
+++ b/prisma/migrations/16_boards/migration.sql
@@ -0,0 +1,33 @@
+-- CreateTable
+CREATE TABLE "board" (
+ "board_id" UUID NOT NULL,
+ "type" VARCHAR(50) NOT NULL,
+ "name" VARCHAR(200) NOT NULL,
+ "description" VARCHAR(500) NOT NULL,
+ "parameters" JSONB NOT NULL,
+ "slug" VARCHAR(100) NOT NULL,
+ "user_id" UUID,
+ "team_id" UUID,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMPTZ(6),
+
+ CONSTRAINT "board_pkey" PRIMARY KEY ("board_id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "board_board_id_key" ON "board"("board_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "board_slug_key" ON "board"("slug");
+
+-- CreateIndex
+CREATE INDEX "board_slug_idx" ON "board"("slug");
+
+-- CreateIndex
+CREATE INDEX "board_user_id_idx" ON "board"("user_id");
+
+-- CreateIndex
+CREATE INDEX "board_team_id_idx" ON "board"("team_id");
+
+-- CreateIndex
+CREATE INDEX "board_created_at_idx" ON "board"("created_at");
diff --git a/prisma/migrations/17_remove_duplicate_key/migration.sql b/prisma/migrations/17_remove_duplicate_key/migration.sql
new file mode 100644
index 000000000..75f7191ea
--- /dev/null
+++ b/prisma/migrations/17_remove_duplicate_key/migration.sql
@@ -0,0 +1,29 @@
+-- DropIndex
+DROP INDEX "link_link_id_key";
+
+-- DropIndex
+DROP INDEX "pixel_pixel_id_key";
+
+-- DropIndex
+DROP INDEX "report_report_id_key";
+
+-- DropIndex
+DROP INDEX "revenue_revenue_id_key";
+
+-- DropIndex
+DROP INDEX "segment_segment_id_key";
+
+-- DropIndex
+DROP INDEX "session_session_id_key";
+
+-- DropIndex
+DROP INDEX "team_team_id_key";
+
+-- DropIndex
+DROP INDEX "team_user_team_user_id_key";
+
+-- DropIndex
+DROP INDEX "user_user_id_key";
+
+-- DropIndex
+DROP INDEX "website_website_id_key";
diff --git a/prisma/migrations/18_add_performance/migration.sql b/prisma/migrations/18_add_performance/migration.sql
new file mode 100644
index 000000000..a329fac1a
--- /dev/null
+++ b/prisma/migrations/18_add_performance/migration.sql
@@ -0,0 +1,6 @@
+-- AlterTable
+ALTER TABLE "website_event" ADD COLUMN "cls" DECIMAL(10,4),
+ADD COLUMN "fcp" DECIMAL(10,1),
+ADD COLUMN "inp" DECIMAL(10,1),
+ADD COLUMN "lcp" DECIMAL(10,1),
+ADD COLUMN "ttfb" DECIMAL(10,1);
diff --git a/prisma/migrations/19_add_session_replay/migration.sql b/prisma/migrations/19_add_session_replay/migration.sql
new file mode 100644
index 000000000..3d7fe5c2e
--- /dev/null
+++ b/prisma/migrations/19_add_session_replay/migration.sql
@@ -0,0 +1,50 @@
+-- AlterTable board: drop slug
+DROP INDEX IF EXISTS "board_slug_key";
+DROP INDEX IF EXISTS "board_slug_idx";
+ALTER TABLE "board" DROP COLUMN IF EXISTS "slug";
+
+-- AlterTable
+ALTER TABLE "website" ADD COLUMN "replay_enabled" BOOLEAN NOT NULL DEFAULT false;
+ALTER TABLE "website" ADD COLUMN "replay_config" JSONB;
+
+-- CreateTable
+CREATE TABLE "session_replay" (
+ "replay_id" UUID NOT NULL,
+ "website_id" UUID NOT NULL,
+ "session_id" UUID NOT NULL,
+ "visit_id" UUID NOT NULL,
+ "chunk_index" INTEGER NOT NULL,
+ "events" BYTEA NOT NULL,
+ "event_count" INTEGER NOT NULL,
+ "started_at" TIMESTAMPTZ(6) NOT NULL,
+ "ended_at" TIMESTAMPTZ(6) NOT NULL,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "session_replay_pkey" PRIMARY KEY ("replay_id")
+);
+
+-- CreateIndex
+CREATE INDEX "session_replay_website_id_idx" ON "session_replay"("website_id");
+CREATE INDEX "session_replay_session_id_idx" ON "session_replay"("session_id");
+CREATE INDEX "session_replay_website_id_session_id_idx" ON "session_replay"("website_id", "session_id");
+CREATE INDEX "session_replay_website_id_visit_id_idx" ON "session_replay"("website_id", "visit_id");
+CREATE INDEX "session_replay_website_id_created_at_idx" ON "session_replay"("website_id", "created_at");
+CREATE INDEX "session_replay_session_id_chunk_index_idx" ON "session_replay"("session_id", "chunk_index");
+
+-- CreateTable
+CREATE TABLE "session_replay_saved" (
+ "saved_replay_id" UUID NOT NULL,
+ "name" VARCHAR(100) NOT NULL,
+ "website_id" UUID NOT NULL,
+ "visit_id" UUID NOT NULL,
+ "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
+ "updated_at" TIMESTAMPTZ(6),
+
+ CONSTRAINT "session_replay_saved_pkey" PRIMARY KEY ("saved_replay_id"),
+ CONSTRAINT "session_replay_saved_website_id_visit_id_key" UNIQUE ("website_id", "visit_id")
+);
+
+-- CreateIndex
+CREATE INDEX "session_replay_saved_website_id_idx" ON "session_replay_saved"("website_id");
+CREATE INDEX "session_replay_saved_visit_id_idx" ON "session_replay_saved"("visit_id");
+CREATE INDEX "session_replay_saved_website_id_created_at_idx" ON "session_replay_saved"("website_id", "created_at");
diff --git a/db/postgresql/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml
similarity index 100%
rename from db/postgresql/migrations/migration_lock.toml
rename to prisma/migrations/migration_lock.toml
diff --git a/db/postgresql/schema.prisma b/prisma/schema.prisma
similarity index 56%
rename from db/postgresql/schema.prisma
rename to prisma/schema.prisma
index 2535f4963..63c81ec0d 100644
--- a/db/postgresql/schema.prisma
+++ b/prisma/schema.prisma
@@ -1,15 +1,16 @@
generator client {
- provider = "prisma-client-js"
+ provider = "prisma-client"
+ output = "../src/generated/prisma"
+ engineType = "client"
}
datasource db {
provider = "postgresql"
- url = env("DATABASE_URL")
relationMode = "prisma"
}
model User {
- id String @id @unique @map("user_id") @db.Uuid
+ id String @id() @map("user_id") @db.Uuid
username String @unique @db.VarChar(255)
password String @db.VarChar(60)
role String @map("role") @db.VarChar(50)
@@ -19,16 +20,19 @@ model User {
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
- websiteUser Website[] @relation("user")
- websiteCreateUser Website[] @relation("createUser")
- teamUser TeamUser[]
- report Report[]
+ websites Website[] @relation("user")
+ createdBy Website[] @relation("createUser")
+ links Link[] @relation("user")
+ pixels Pixel[] @relation("user")
+ teams TeamUser[]
+ reports Report[]
+ boards Board[] @relation("user")
@@map("user")
}
model Session {
- id String @id @unique @map("session_id") @db.Uuid
+ id String @id() @map("session_id") @db.Uuid
websiteId String @map("website_id") @db.Uuid
browser String? @db.VarChar(20)
os String? @db.VarChar(20)
@@ -41,9 +45,9 @@ model Session {
distinctId String? @map("distinct_id") @db.VarChar(50)
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
- websiteEvent WebsiteEvent[]
- sessionData SessionData[]
- revenue Revenue[]
+ websiteEvents WebsiteEvent[]
+ sessionData SessionData[]
+ revenue Revenue[]
@@index([createdAt])
@@index([websiteId])
@@ -60,10 +64,9 @@ model Session {
}
model Website {
- id String @id @unique @map("website_id") @db.Uuid
+ id String @id() @map("website_id") @db.Uuid
name String @db.VarChar(100)
domain String? @db.VarChar(500)
- shareId String? @unique @map("share_id") @db.VarChar(50)
resetAt DateTime? @map("reset_at") @db.Timestamptz(6)
userId String? @map("user_id") @db.Uuid
teamId String? @map("team_id") @db.Uuid
@@ -72,19 +75,23 @@ model Website {
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
- user User? @relation("user", fields: [userId], references: [id])
- createUser User? @relation("createUser", fields: [createdBy], references: [id])
- team Team? @relation(fields: [teamId], references: [id])
- eventData EventData[]
- report Report[]
- revenue Revenue[]
- sessionData SessionData[]
- segment Segment[]
+ replayEnabled Boolean @default(false) @map("replay_enabled")
+ replayConfig Json? @map("replay_config")
+
+ user User? @relation("user", fields: [userId], references: [id])
+ createUser User? @relation("createUser", fields: [createdBy], references: [id])
+ team Team? @relation(fields: [teamId], references: [id])
+ eventData EventData[]
+ reports Report[]
+ revenue Revenue[]
+ segments Segment[]
+ sessionData SessionData[]
+ sessionReplays SessionReplay[]
+ sessionReplaysSaved SessionReplaySaved[]
@@index([userId])
@@index([teamId])
@@index([createdAt])
- @@index([shareId])
@@index([createdBy])
@@map("website")
}
@@ -116,6 +123,11 @@ model WebsiteEvent {
eventName String? @map("event_name") @db.VarChar(50)
tag String? @db.VarChar(50)
hostname String? @db.VarChar(100)
+ lcp Decimal? @db.Decimal(10, 1)
+ inp Decimal? @db.Decimal(10, 1)
+ cls Decimal? @db.Decimal(10, 4)
+ fcp Decimal? @db.Decimal(10, 1)
+ ttfb Decimal? @db.Decimal(10, 1)
eventData EventData[]
session Session @relation(fields: [sessionId], references: [id])
@@ -183,7 +195,7 @@ model SessionData {
}
model Team {
- id String @id() @unique() @map("team_id") @db.Uuid
+ id String @id() @map("team_id") @db.Uuid
name String @db.VarChar(50)
accessCode String? @unique @map("access_code") @db.VarChar(50)
logoUrl String? @map("logo_url") @db.VarChar(2183)
@@ -191,15 +203,18 @@ model Team {
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
- website Website[]
- teamUser TeamUser[]
+ websites Website[]
+ members TeamUser[]
+ links Link[]
+ pixels Pixel[]
+ boards Board[]
@@index([accessCode])
@@map("team")
}
model TeamUser {
- id String @id() @unique() @map("team_user_id") @db.Uuid
+ id String @id() @map("team_user_id") @db.Uuid
teamId String @map("team_id") @db.Uuid
userId String @map("user_id") @db.Uuid
role String @db.VarChar(50)
@@ -215,13 +230,13 @@ model TeamUser {
}
model Report {
- id String @id() @unique() @map("report_id") @db.Uuid
+ id String @id() @map("report_id") @db.Uuid
userId String @map("user_id") @db.Uuid
websiteId String @map("website_id") @db.Uuid
- type String @db.VarChar(200)
+ type String @db.VarChar(50)
name String @db.VarChar(200)
description String @db.VarChar(500)
- parameters Json
+ parameters Json
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
@@ -236,13 +251,13 @@ model Report {
}
model Segment {
- id String @id() @unique() @map("segment_id") @db.Uuid
- websiteId String @map("website_id") @db.Uuid
- type String @db.VarChar(200)
- name String @db.VarChar(200)
- parameters Json
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+ id String @id() @map("segment_id") @db.Uuid
+ websiteId String @map("website_id") @db.Uuid
+ type String @db.VarChar(50)
+ name String @db.VarChar(200)
+ parameters Json
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
website Website @relation(fields: [websiteId], references: [id])
@@ -251,14 +266,14 @@ model Segment {
}
model Revenue {
- id String @id() @unique() @map("revenue_id") @db.Uuid
- websiteId String @map("website_id") @db.Uuid
- sessionId String @map("session_id") @db.Uuid
- eventId String @map("event_id") @db.Uuid
- eventName String @map("event_name") @db.VarChar(50)
- currency String @db.VarChar(100)
- revenue Decimal? @db.Decimal(19, 4)
- createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ id String @id() @map("revenue_id") @db.Uuid
+ websiteId String @map("website_id") @db.Uuid
+ sessionId String @map("session_id") @db.Uuid
+ eventId String @map("event_id") @db.Uuid
+ eventName String @map("event_name") @db.VarChar(50)
+ currency String @db.VarChar(10)
+ revenue Decimal? @db.Decimal(19, 4)
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
website Website @relation(fields: [websiteId], references: [id])
session Session @relation(fields: [sessionId], references: [id])
@@ -268,4 +283,119 @@ model Revenue {
@@index([websiteId, createdAt])
@@index([websiteId, sessionId, createdAt])
@@map("revenue")
+}
+
+model Link {
+ id String @id() @map("link_id") @db.Uuid
+ name String @db.VarChar(100)
+ url String @db.VarChar(500)
+ slug String @unique() @db.VarChar(100)
+ userId String? @map("user_id") @db.Uuid
+ teamId String? @map("team_id") @db.Uuid
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+ deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
+
+ user User? @relation("user", fields: [userId], references: [id])
+ team Team? @relation(fields: [teamId], references: [id])
+
+ @@index([slug])
+ @@index([userId])
+ @@index([teamId])
+ @@index([createdAt])
+ @@map("link")
+}
+
+model Pixel {
+ id String @id() @map("pixel_id") @db.Uuid
+ name String @db.VarChar(100)
+ slug String @unique() @db.VarChar(100)
+ userId String? @map("user_id") @db.Uuid
+ teamId String? @map("team_id") @db.Uuid
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+ deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6)
+
+ user User? @relation("user", fields: [userId], references: [id])
+ team Team? @relation(fields: [teamId], references: [id])
+
+ @@index([slug])
+ @@index([userId])
+ @@index([teamId])
+ @@index([createdAt])
+ @@map("pixel")
+}
+
+model Board {
+ id String @id() @map("board_id") @db.Uuid
+ type String @db.VarChar(50)
+ name String @db.VarChar(200)
+ description String @db.VarChar(500)
+ parameters Json
+ userId String? @map("user_id") @db.Uuid
+ teamId String? @map("team_id") @db.Uuid
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+
+ user User? @relation("user", fields: [userId], references: [id])
+ team Team? @relation(fields: [teamId], references: [id])
+
+ @@index([userId])
+ @@index([teamId])
+ @@index([createdAt])
+ @@map("board")
+}
+model Share {
+ id String @id() @map("share_id") @db.Uuid
+ entityId String @map("entity_id") @db.Uuid
+ name String @db.VarChar(200)
+ shareType Int @map("share_type") @db.Integer
+ slug String @unique() @db.VarChar(100)
+ parameters Json
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+
+ @@index([entityId])
+ @@map("share")
+}
+
+model SessionReplay {
+ id String @id() @map("replay_id") @db.Uuid
+ websiteId String @map("website_id") @db.Uuid
+ sessionId String @map("session_id") @db.Uuid
+ visitId String @map("visit_id") @db.Uuid
+ chunkIndex Int @map("chunk_index") @db.Integer
+ events Bytes @map("events")
+ eventCount Int @map("event_count") @db.Integer
+ startedAt DateTime @map("started_at") @db.Timestamptz(6)
+ endedAt DateTime @map("ended_at") @db.Timestamptz(6)
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+
+ website Website @relation(fields: [websiteId], references: [id])
+
+ @@index([websiteId])
+ @@index([sessionId])
+ @@index([visitId])
+ @@index([websiteId, sessionId])
+ @@index([websiteId, visitId])
+ @@index([websiteId, createdAt])
+ @@index([sessionId, chunkIndex])
+ @@map("session_replay")
+}
+
+model SessionReplaySaved {
+ id String @id() @map("saved_replay_id") @db.Uuid
+ name String @db.VarChar(100)
+ websiteId String @map("website_id") @db.Uuid
+ visitId String @map("visit_id") @db.Uuid
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
+ updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
+
+ website Website @relation(fields: [websiteId], references: [id])
+
+ @@unique([websiteId, visitId])
+ @@index([websiteId])
+ @@index([visitId])
+ @@index([websiteId, createdAt])
+ @@map("session_replay_saved")
}
\ No newline at end of file
diff --git a/public/images/country/t1.png b/public/images/country/t1.png
new file mode 100644
index 000000000..c45ed0fe9
Binary files /dev/null and b/public/images/country/t1.png differ
diff --git a/public/intl/country/uz-UZ.json b/public/intl/country/uz-UZ.json
new file mode 100644
index 000000000..0105597f7
--- /dev/null
+++ b/public/intl/country/uz-UZ.json
@@ -0,0 +1,251 @@
+{
+ "AF": "Afg\u02bboniston",
+ "AX": "Aland orollari",
+ "AL": "Albaniya",
+ "US": "Amerika Qo\u2018shma Shtatlari",
+ "AS": "Amerika Samoasi",
+ "AD": "Andorra",
+ "AI": "Angilya",
+ "AO": "Angola",
+ "AQ": "Antarktida",
+ "AG": "Antigua va Barbuda",
+ "VI": "AQSH Virgin orollari",
+ "UM": "AQSH yondosh orollari",
+ "AR": "Argentina",
+ "AM": "Armaniston",
+ "AW": "Aruba",
+ "AU": "Avstraliya",
+ "AT": "Avstriya",
+ "BS": "Bagama orollari",
+ "BH": "Bahrayn",
+ "BD": "Bangladesh",
+ "BB": "Barbados",
+ "BY": "Belarus",
+ "BE": "Belgiya",
+ "BZ": "Beliz",
+ "BJ": "Benin",
+ "BM": "Bermuda orollari",
+ "AE": "Birlashgan Arab Amirliklari",
+ "BG": "Bolgariya",
+ "BO": "Boliviya",
+ "BQ": "Boneyr, Sint-Estatius va Saba",
+ "BA": "Bosniya va Gertsegovina",
+ "BW": "Botsvana",
+ "BR": "Braziliya",
+ "VG": "Britaniya Virgin orollari",
+ "IO": "Britaniyaning Hind okeanidagi hududi",
+ "BN": "Bruney",
+ "BF": "Burkina-Faso",
+ "BI": "Burundi",
+ "BT": "Butan",
+ "BV": "Buve oroli",
+ "GB": "Buyuk Britaniya",
+ "DK": "Daniya",
+ "DM": "Dominika",
+ "DO": "Dominikan Respublikasi",
+ "ET": "Efiopiya",
+ "EC": "Ekvador",
+ "GQ": "Ekvatorial Gvineya",
+ "ER": "Eritreya",
+ "IR": "Eron",
+ "EE": "Estoniya",
+ "PS": "Falastin hududlari",
+ "FO": "Farer orollari",
+ "FJ": "Fiji",
+ "PH": "Filippin",
+ "FI": "Finlandiya",
+ "FK": "Folklend orollari",
+ "FR": "Fransiya",
+ "GF": "Fransuz Gvianasi",
+ "TF": "Fransuz Janubiy hududlari",
+ "PF": "Fransuz Polineziyasi",
+ "GA": "Gabon",
+ "HT": "Gaiti",
+ "GM": "Gambiya",
+ "GH": "Gana",
+ "GY": "Gayana",
+ "DE": "Germaniya",
+ "GG": "Gernsi",
+ "GI": "Gibraltar",
+ "HN": "Gonduras",
+ "HK": "Gonkong (Xitoy MMH)",
+ "GD": "Grenada",
+ "GL": "Grenlandiya",
+ "GR": "Gretsiya",
+ "GE": "Gruziya",
+ "GU": "Guam",
+ "GP": "Gvadelupe",
+ "GT": "Gvatemala",
+ "GN": "Gvineya",
+ "GW": "Gvineya-Bisau",
+ "IN": "Hindiston",
+ "ID": "Indoneziya",
+ "JO": "Iordaniya",
+ "IE": "Irlandiya",
+ "IQ": "Iroq",
+ "IS": "Islandiya",
+ "ES": "Ispaniya",
+ "IL": "Isroil",
+ "IT": "Italiya",
+ "ZA": "Janubiy Afrika Respublikasi",
+ "GS": "Janubiy Georgiya va Janubiy Sendvich orollari",
+ "KR": "Janubiy Koreya",
+ "SS": "Janubiy Sudan",
+ "DZ": "Jazoir",
+ "JE": "Jersi",
+ "DJ": "Jibuti",
+ "CV": "Kabo-Verde",
+ "KH": "Kambodja",
+ "CM": "Kamerun",
+ "CA": "Kanada",
+ "KY": "Kayman orollari",
+ "KE": "Keniya",
+ "CY": "Kipr",
+ "KI": "Kiribati",
+ "CC": "Kokos (Kiling) orollari",
+ "CO": "Kolumbiya",
+ "KM": "Komor orollari",
+ "CG": "Kongo \u2013 Brazzavil",
+ "CD": "Kongo \u2013 Kinshasa",
+ "CR": "Kosta-Rika",
+ "CI": "Kot-d\u2019Ivuar",
+ "CU": "Kuba",
+ "CK": "Kuk orollari",
+ "CW": "Kyurasao",
+ "LA": "Laos",
+ "LV": "Latviya",
+ "LS": "Lesoto",
+ "LR": "Liberiya",
+ "LT": "Litva",
+ "LB": "Livan",
+ "LY": "Liviya",
+ "LI": "Lixtenshteyn",
+ "LU": "Lyuksemburg",
+ "MG": "Madagaskar",
+ "MO": "Makao (Xitoy MMH)",
+ "MW": "Malavi",
+ "MY": "Malayziya",
+ "MV": "Maldiv orollari",
+ "ML": "Mali",
+ "MT": "Malta",
+ "CF": "Markaziy Afrika Respublikasi",
+ "MA": "Marokash",
+ "MQ": "Martinika",
+ "MH": "Marshall orollari",
+ "MU": "Mavrikiy",
+ "MR": "Mavritaniya",
+ "YT": "Mayotta",
+ "MX": "Meksika",
+ "IM": "Men oroli",
+ "FM": "Mikroneziya",
+ "EG": "Misr",
+ "MD": "Moldova",
+ "MC": "Monako",
+ "MN": "Mongoliya",
+ "MS": "Montserrat",
+ "MZ": "Mozambik",
+ "SH": "Muqaddas Yelena oroli",
+ "MM": "Myanma (Birma)",
+ "NA": "Namibiya",
+ "NR": "Nauru",
+ "NP": "Nepal",
+ "NL": "Niderlandiya",
+ "NE": "Niger",
+ "NG": "Nigeriya",
+ "NI": "Nikaragua",
+ "NU": "Niue",
+ "NF": "Norfolk oroli",
+ "NO": "Norvegiya",
+ "AZ": "Ozarbayjon",
+ "PW": "Palau",
+ "PA": "Panama",
+ "PG": "Papua \u2013 Yangi Gvineya",
+ "PY": "Paragvay",
+ "PE": "Peru",
+ "PN": "Pitkern orollari",
+ "PK": "Pokiston",
+ "PL": "Polsha",
+ "PT": "Portugaliya",
+ "PR": "Puerto-Riko",
+ "QA": "Qatar",
+ "KG": "Qirg\u02bbiziston",
+ "KZ": "Qozog\u02bbiston",
+ "KW": "Quvayt",
+ "RE": "Reyunion",
+ "CX": "Rojdestvo oroli",
+ "RU": "Rossiya",
+ "RW": "Ruanda",
+ "RO": "Ruminiya",
+ "SV": "Salvador",
+ "WS": "Samoa",
+ "SM": "San-Marino",
+ "ST": "San-Tome va Prinsipi",
+ "SA": "Saudiya Arabistoni",
+ "BL": "Sen-Bartelemi",
+ "PM": "Sen-Pyer va Mikelon",
+ "SN": "Senegal",
+ "KN": "Sent-Kits va Nevis",
+ "LC": "Sent-Lyusiya",
+ "MF": "Sent-Martin",
+ "VC": "Sent-Vinsent va Grenadin",
+ "RS": "Serbiya",
+ "SC": "Seyshel orollari",
+ "SG": "Singapur",
+ "SX": "Sint-Marten",
+ "SK": "Slovakiya",
+ "SI": "Sloveniya",
+ "SB": "Solomon orollari",
+ "SO": "Somali",
+ "SD": "Sudan",
+ "SR": "Surinam",
+ "SY": "Suriya",
+ "SZ": "Svazilend",
+ "SL": "Syerra-Leone",
+ "TH": "Tailand",
+ "TZ": "Tanzaniya",
+ "TW": "Tayvan",
+ "TL": "Timor-Leste",
+ "TG": "Togo",
+ "TJ": "Tojikiston",
+ "TK": "Tokelau",
+ "TO": "Tonga",
+ "TT": "Trinidad va Tobago",
+ "TN": "Tunis",
+ "TR": "Turkiya",
+ "TM": "Turkmaniston",
+ "TC": "Turks va Kaykos orollari",
+ "TV": "Tuvalu",
+ "UG": "Uganda",
+ "UA": "Ukraina",
+ "OM": "Ummon",
+ "WF": "Uollis va Futuna",
+ "UY": "Urugvay",
+ "VU": "Vanuatu",
+ "VA": "Vatikan",
+ "VE": "Venesuela",
+ "HU": "Vengriya",
+ "VN": "Vyetnam",
+ "HM": "Xerd va Makdonald orollari",
+ "CN": "Xitoy",
+ "HR": "Xorvatiya",
+ "YE": "Yaman",
+ "JM": "Yamayka",
+ "NC": "Yangi Kaledoniya",
+ "NZ": "Yangi Zelandiya",
+ "JP": "Yaponiya",
+ "ZM": "Zambiya",
+ "ZW": "Zimbabve",
+ "UZ": "O\u02bbzbekiston",
+ "EH": "G\u2018arbiy Sahroi Kabir",
+ "KP": "Shimoliy Koreya",
+ "MK": "Shimoliy Makedoniya",
+ "MP": "Shimoliy Mariana orollari",
+ "SJ": "Shpitsbergen va Yan-Mayen",
+ "LK": "Shri-Lanka",
+ "SE": "Shvetsiya",
+ "CH": "Shveytsariya",
+ "TD": "Chad",
+ "ME": "Chernogoriya",
+ "CZ": "Chexiya",
+ "CL": "Chili"
+}
diff --git a/public/intl/language/uz-UZ.json b/public/intl/language/uz-UZ.json
new file mode 100644
index 000000000..daacab88b
--- /dev/null
+++ b/public/intl/language/uz-UZ.json
@@ -0,0 +1,611 @@
+{
+ "ab": "abxazcha",
+ "ace": "Achinese",
+ "ach": "Acoli",
+ "ada": "Adangme",
+ "ady": "Adyghe",
+ "aa": "Afar",
+ "afh": "Afrihili",
+ "af": "afrikancha",
+ "agq": "ag\u2018emcha",
+ "ain": "Ainu",
+ "ak": "akancha",
+ "akk": "Akkadian",
+ "bss": "Akoose",
+ "akz": "Alabama",
+ "sq": "albancha",
+ "ale": "Aleut",
+ "arq": "Algerian Arabic",
+ "en_US": "American English",
+ "ase": "American Sign Language",
+ "am": "amxarcha",
+ "egy": "Ancient Egyptian",
+ "grc": "Ancient Greek",
+ "anp": "Angika",
+ "zh_Hant": "an\u02bcanaviy xitoycha",
+ "njo": "Ao Naga",
+ "ar": "arabcha",
+ "an": "Aragonese",
+ "arc": "Aramaic",
+ "aro": "Araona",
+ "arp": "Arapaho",
+ "arw": "Arawak",
+ "hy": "armancha",
+ "rup": "Aromanian",
+ "frp": "Arpitan",
+ "as": "assamcha",
+ "ast": "Asturian",
+ "asa": "asucha",
+ "cch": "Atsam",
+ "av": "Avaric",
+ "ae": "Avestan",
+ "en_AU": "Avstraliya inglizchasi",
+ "de_AT": "Avstriya olmonchasi",
+ "awa": "Awadhi",
+ "ay": "Aymara",
+ "bfq": "Badaga",
+ "ksf": "bafiycha",
+ "bfd": "Bafut",
+ "bqi": "Bakhtiari",
+ "ban": "Balinese",
+ "bal": "Baluchi",
+ "bm": "bambarcha",
+ "bax": "Bamun",
+ "bjn": "Banjar",
+ "bas": "Basaa",
+ "eu": "baskcha",
+ "bbc": "Batak Toba",
+ "bar": "Bavarian",
+ "bej": "Beja",
+ "be": "belaruscha",
+ "bem": "bembacha",
+ "bez": "benacha",
+ "bn": "bengalcha",
+ "bew": "Betawi",
+ "bho": "Bhojpuri",
+ "bik": "Bikol",
+ "bin": "Bini",
+ "my": "birmancha",
+ "bpy": "Bishnupriya",
+ "bi": "Bislama",
+ "byn": "Blin",
+ "zbl": "Blissymbols",
+ "brx": "bodocha",
+ "bg": "bolgarcha",
+ "ba": "boshqircha",
+ "bs": "bosniycha",
+ "brh": "Brahui",
+ "bra": "Braj",
+ "pt_BR": "Braziliya portugalchasi",
+ "br": "bretoncha",
+ "en_GB": "Britaniya inglizchasi",
+ "bug": "Buginese",
+ "bum": "Bulu",
+ "bua": "Buriat",
+ "cad": "Caddo",
+ "frc": "Cajun French",
+ "yue": "Cantonese",
+ "cps": "Capiznon",
+ "car": "Carib",
+ "cay": "Cayuga",
+ "ceb": "Cebuano",
+ "dtp": "Central Dusun",
+ "esu": "Central Yupik",
+ "shu": "Chadian Arabic",
+ "chg": "Chagatai",
+ "ch": "Chamorro",
+ "ce": "Chechen",
+ "chr": "cherokcha",
+ "cs": "chexcha",
+ "chy": "Cheyenne",
+ "chb": "Chibcha",
+ "cgg": "chigcha",
+ "qug": "Chimborazo Highland Quichua",
+ "chn": "Chinook Jargon",
+ "chp": "Chipewyan",
+ "cho": "Choctaw",
+ "cu": "Church Slavic",
+ "chk": "Chuukese",
+ "cv": "Chuvash",
+ "nwc": "Classical Newari",
+ "syc": "Classical Syriac",
+ "ksh": "Colognian",
+ "swb": "Comorian",
+ "cop": "Coptic",
+ "cr": "Cree",
+ "mus": "Creek",
+ "crh": "Crimean Turkish",
+ "dak": "Dakota",
+ "dar": "Dargwa",
+ "da": "datcha",
+ "dzg": "Dazaga",
+ "del": "Delaware",
+ "din": "Dinka",
+ "dv": "Divehi",
+ "doi": "Dogri",
+ "dgr": "Dogrib",
+ "dua": "dualcha",
+ "dyu": "Dyula",
+ "frs": "Eastern Frisian",
+ "efi": "Efik",
+ "arz": "Egyptian Arabic",
+ "eka": "Ekajuk",
+ "elx": "Elamite",
+ "ebu": "embucha",
+ "egl": "Emilian",
+ "myv": "Erzya",
+ "eo": "esperantocha",
+ "et": "estoncha",
+ "ewo": "Ewondo",
+ "ext": "Extremaduran",
+ "fan": "Fang",
+ "fat": "Fanti",
+ "fo": "farercha",
+ "fj": "fijcha",
+ "hif": "Fiji Hindi",
+ "fil": "filipincha",
+ "fi": "fincha",
+ "nl_BE": "flamandcha",
+ "fon": "Fon",
+ "fa": "forscha",
+ "gur": "Frafra",
+ "fr": "fransuzcha",
+ "fur": "Friulian",
+ "ff": "Fulah",
+ "gaa": "Ga",
+ "gag": "gagozcha",
+ "ht": "gaitcha",
+ "gl": "galitsiycha",
+ "gan": "Gan Chinese",
+ "lg": "gandcha",
+ "haw": "gavaycha",
+ "gay": "Gayo",
+ "gba": "Gbaya",
+ "gez": "Geez",
+ "aln": "Gheg Albanian",
+ "bbj": "Ghomala",
+ "fy": "g\u02bbarbiy friziancha",
+ "glk": "Gilaki",
+ "gil": "Gilbertese",
+ "gom": "Goan Konkani",
+ "nl": "gollandcha",
+ "gon": "Gondi",
+ "gn": "gorancha",
+ "gor": "Gorontalo",
+ "got": "Gothic",
+ "grb": "Grebo",
+ "ka": "gruzincha",
+ "gu": "gujoratcha",
+ "guz": "guzcha",
+ "gwi": "Gwich\u02bcin",
+ "hai": "Haida",
+ "hak": "Hakka Chinese",
+ "hz": "Herero",
+ "hil": "Hiligaynon",
+ "hi": "hindcha",
+ "ho": "Hiri Motu",
+ "hit": "Hittite",
+ "hmn": "Hmong",
+ "hup": "Hupa",
+ "iba": "Iban",
+ "ibb": "Ibibio",
+ "he": "ibroniy",
+ "io": "Ido",
+ "ig": "igbocha",
+ "ilo": "Iloko",
+ "smn": "inari semiycha",
+ "id": "indoneyzcha",
+ "en": "inglizcha",
+ "izh": "Ingrian",
+ "inh": "Ingush",
+ "ia": "Interlingua",
+ "ie": "Interlingue",
+ "iu": "inuktitutcha",
+ "ik": "Inupiaq",
+ "ga": "irlandcha",
+ "is": "islandcha",
+ "es": "ispancha",
+ "it": "italyancha",
+ "ee": "ivicha",
+ "jam": "Jamaican Creole English",
+ "sma": "janubiy semiycha",
+ "kaj": "Jju",
+ "jrb": "Judeo-Arabic",
+ "jpr": "Judeo-Persian",
+ "jut": "Jutish",
+ "kbd": "Kabardian",
+ "kea": "kabuverdiancha",
+ "kac": "Kachin",
+ "kgp": "Kaingang",
+ "kkj": "Kako",
+ "kl": "kalallisutcha",
+ "kln": "kalenjincha",
+ "xal": "Kalmyk",
+ "kam": "kambcha",
+ "fr_CA": "Kanada fransuzchasi",
+ "en_CA": "Kanada inglizchasi",
+ "kbl": "Kanembu",
+ "kn": "kannadcha",
+ "kr": "Kanuri",
+ "kaa": "Kara-Kalpak",
+ "krc": "Karachay-Balkar",
+ "krl": "Karelian",
+ "ks": "kashmircha",
+ "csb": "Kashubian",
+ "ca": "katalancha",
+ "kaw": "Kawi",
+ "ken": "Kenyang",
+ "kha": "Khasi",
+ "kho": "Khotanese",
+ "khw": "Khowar",
+ "ki": "kikuycha",
+ "kmb": "Kimbundu",
+ "krj": "Kinaray-a",
+ "rw": "kinyarvandcha",
+ "kiu": "Kirmanjki",
+ "tlh": "Klingon",
+ "bkm": "Kom",
+ "kv": "Komi",
+ "koi": "komi-permyakcha",
+ "kg": "Kongo",
+ "swc": "kongo svahiliycha",
+ "kok": "konkancha",
+ "ko": "koreyscha",
+ "kw": "kornishcha",
+ "kfo": "Koro",
+ "co": "korsiancha",
+ "ses": "koryaboro senniycha",
+ "kos": "Kosraean",
+ "avk": "Kotava",
+ "kpe": "Kpelle",
+ "kri": "Krio",
+ "kj": "Kuanyama",
+ "kum": "Kumyk",
+ "ku": "kurdcha",
+ "kru": "Kurukh",
+ "kut": "Kutenai",
+ "nmg": "kvaziycha",
+ "lad": "Ladino",
+ "lah": "Lahnda",
+ "lkt": "lakotcha",
+ "lam": "Lamba",
+ "lag": "langcha",
+ "lo": "laoscha",
+ "ltg": "Latgalian",
+ "lv": "latishcha",
+ "lzz": "Laz",
+ "lez": "Lezghian",
+ "lij": "Ligurian",
+ "li": "Limburgish",
+ "ln": "lingalcha",
+ "lfn": "Lingua Franca Nova",
+ "lzh": "Literary Chinese",
+ "lt": "litovcha",
+ "liv": "Livonian",
+ "jbo": "Lojban",
+ "lmo": "Lombard",
+ "es_419": "Lotin Amerika ispanchasi",
+ "la": "lotincha",
+ "nds": "Low German",
+ "sli": "Lower Silesian",
+ "loz": "Lozi",
+ "lu": "luba-katangcha",
+ "lua": "Luba-Lulua",
+ "lui": "Luiseno",
+ "smj": "luli semiycha",
+ "lun": "Lunda",
+ "luo": "luocha",
+ "luy": "luycha",
+ "lb": "lyuksemburgcha",
+ "mde": "Maba",
+ "jmc": "machamcha",
+ "mad": "Madurese",
+ "maf": "Mafa",
+ "mag": "Magahi",
+ "vmf": "Main-Franconian",
+ "mai": "Maithili",
+ "mak": "Makasar",
+ "mk": "makedoncha",
+ "mgh": "makuva-mittocha",
+ "mg": "malagasiycha",
+ "ml": "malayamcha",
+ "ms": "malaycha",
+ "mt": "maltacha",
+ "mnc": "Manchu",
+ "mdr": "Mandar",
+ "man": "Mandingo",
+ "mni": "Manipuri",
+ "mi": "maoriycha",
+ "arn": "mapuchiycha",
+ "kde": "maqondiy",
+ "mr": "maratcha",
+ "chm": "Mari",
+ "tzm": "markaziy atlas vaqt zonasi",
+ "mh": "Marshallese",
+ "mwr": "Marwari",
+ "mas": "masaycha",
+ "mzn": "Mazanderani",
+ "byv": "Medumba",
+ "es_MX": "Meksika ispanchasi",
+ "gv": "mencha",
+ "men": "Mende",
+ "mwv": "Mentawai",
+ "mer": "merucha",
+ "mgo": "metacha",
+ "mic": "Micmac",
+ "dum": "Middle Dutch",
+ "enm": "Middle English",
+ "frm": "Middle French",
+ "gmh": "Middle High German",
+ "mga": "Middle Irish",
+ "nan": "Min Nan Chinese",
+ "min": "Minangkabau",
+ "xmf": "Mingrelian",
+ "mwl": "Mirandese",
+ "lus": "Mizo",
+ "mn": "mo\u2018g\u2018ulcha",
+ "moh": "mohaukcha",
+ "mdf": "Moksha",
+ "ro_MD": "moldovan rumincha",
+ "lol": "Mongo",
+ "mfe": "morisyencha",
+ "ary": "Moroccan Arabic",
+ "mos": "Mossi",
+ "mul": "Multiple Languages",
+ "mua": "mundangcha",
+ "ttt": "Muslim Tat",
+ "mye": "Myene",
+ "naq": "namacha",
+ "na": "Nauru",
+ "nv": "Navajo",
+ "ng": "Ndonga",
+ "nap": "Neapolitan",
+ "de": "nemischa",
+ "ne": "nepalcha",
+ "new": "Newari",
+ "sba": "Ngambay",
+ "nnh": "Ngiemboon",
+ "jgo": "ngombcha",
+ "yrl": "Nheengatu",
+ "nia": "Nias",
+ "niu": "Niuean",
+ "nog": "Nogai",
+ "und": "noma\u02bclum til",
+ "frr": "Northern Frisian",
+ "nso": "Northern Sotho",
+ "nb": "norvegcha bokmal",
+ "nn": "norvegcha ninorsk",
+ "no": "Norwegian",
+ "nov": "Novial",
+ "nus": "noyrcha",
+ "nqo": "nqoancha",
+ "nym": "Nyamwezi",
+ "ny": "Nyanja",
+ "nyn": "nyankolcha",
+ "tog": "Nyasa Tonga",
+ "nyo": "Nyoro",
+ "nzi": "Nzima",
+ "oc": "Occitan",
+ "uz": "o\u02bbzbekcha",
+ "oj": "Ojibwa",
+ "ang": "Old English",
+ "fro": "Old French",
+ "goh": "Old High German",
+ "sga": "Old Irish",
+ "non": "Old Norse",
+ "peo": "Old Persian",
+ "pro": "Old Proven\u00e7al",
+ "or": "oriycha",
+ "om": "oromocha",
+ "osa": "Osage",
+ "os": "Ossetic",
+ "ota": "Ottoman Turkish",
+ "az": "ozarbayjoncha",
+ "pal": "Pahlavi",
+ "pfl": "Palatine German",
+ "pau": "Palauan",
+ "pi": "Pali",
+ "pam": "Pampanga",
+ "pag": "Pangasinan",
+ "pa": "panjobcha",
+ "pap": "Papiamento",
+ "pdc": "Pennsylvania German",
+ "phn": "Phoenician",
+ "pcd": "Picard",
+ "pms": "Piedmontese",
+ "pdt": "Plautdietsch",
+ "pon": "Pohnpeian",
+ "pl": "polyakcha",
+ "pnt": "Pontic",
+ "pt": "portugalcha",
+ "prg": "Prussian",
+ "ps": "pushtu tili",
+ "quc": "qichiancha",
+ "ky": "qirg\u02bbizcha",
+ "kab": "qobilcha",
+ "khq": "qoyra-chincha",
+ "kk": "qozoqcha",
+ "dsb": "quyi sorbcha",
+ "qu": "qvechuancha",
+ "raj": "Rajasthani",
+ "rap": "Rapanui",
+ "rar": "Rarotongan",
+ "rif": "Riffian",
+ "rgn": "Romagnol",
+ "rm": "romancha",
+ "rom": "Romany",
+ "rof": "rombacha",
+ "root": "Root",
+ "rtm": "Rotuman",
+ "rug": "Roviana",
+ "rwk": "ruandcha",
+ "ro": "rumincha",
+ "rn": "rundcha",
+ "ru": "ruscha",
+ "rue": "Rusyn",
+ "ssy": "Saho",
+ "sah": "Sakha",
+ "sam": "Samaritan Aramaic",
+ "saq": "samburcha",
+ "sm": "Samoan",
+ "sgs": "Samogitian",
+ "sad": "Sandawe",
+ "sg": "sangoancha",
+ "sbp": "sanguancha",
+ "sa": "sanskritcha",
+ "sat": "Santali",
+ "sc": "Sardinian",
+ "sas": "Sasak",
+ "sdc": "Sassarese Sardinian",
+ "stq": "Saterland Frisian",
+ "saz": "Saurashtra",
+ "sco": "Scots",
+ "gd": "Scottish Gaelic",
+ "sly": "Selayar",
+ "sel": "Selkup",
+ "see": "Seneca",
+ "seh": "seniycha",
+ "sr": "serbcha",
+ "sh": "Serbo-Croatian",
+ "srr": "Serer",
+ "sei": "Seri",
+ "ksb": "shambalacha",
+ "shn": "Shan",
+ "nd": "shimoliy ndebelcha",
+ "se": "shimoliy semiycha",
+ "sms": "shkolt semiycha",
+ "sn": "shoniycha",
+ "sv": "shvedcha",
+ "fr_CH": "Shvesariya fransuzchasi",
+ "de_CH": "Shvesariya olmonchasi",
+ "gsw": "shveysariya nemischasi",
+ "scn": "Sicilian",
+ "sid": "Sidamo",
+ "bla": "Siksika",
+ "szl": "Silesian",
+ "sd": "sindxiycha",
+ "si": "sinholcha",
+ "den": "Slave",
+ "sk": "slovakcha",
+ "sl": "slovencha",
+ "zh_Hans": "soddalashtirilgan xitoycha",
+ "xog": "sogancha",
+ "sog": "Sogdien",
+ "so": "somalicha",
+ "snk": "Soninke",
+ "ckb": "sorani kurd tili",
+ "azb": "South Azerbaijani",
+ "nr": "South Ndebele",
+ "alt": "Southern Altai",
+ "st": "Southern Sotho",
+ "srn": "Sranan Tongo",
+ "zgh": "standart marokash tamazit",
+ "suk": "Sukuma",
+ "sux": "Sumerian",
+ "su": "sundancha",
+ "sus": "Susu",
+ "sw": "svahilcha",
+ "ss": "Swati",
+ "syr": "Syriac",
+ "shi": "tachilgitcha",
+ "tl": "Tagalog",
+ "ty": "Tahitian",
+ "dav": "taitcha",
+ "tly": "Talysh",
+ "tmh": "Tamashek",
+ "ta": "tamilcha",
+ "trv": "Taroko",
+ "tt": "tatarcha",
+ "th": "taycha",
+ "te": "telugvancha",
+ "ter": "Tereno",
+ "teo": "tesoancha",
+ "tet": "Tetum",
+ "bo": "tibetcha",
+ "tig": "Tigre",
+ "ti": "tigrincha",
+ "zxx": "til tarkibi yo\u02bbq",
+ "tem": "Timne",
+ "tiv": "Tiv",
+ "tli": "Tlingit",
+ "tg": "tojikcha",
+ "tpi": "Tok Pisin",
+ "tkl": "Tokelau",
+ "to": "tongocha",
+ "fit": "Tornedalen Finnish",
+ "twq": "tosovoqcha",
+ "tkr": "Tsakhur",
+ "tsd": "Tsakonian",
+ "tsi": "Tsimshian",
+ "ts": "Tsonga",
+ "tn": "Tswana",
+ "tcy": "Tulu",
+ "tum": "Tumbuka",
+ "aeb": "Tunisian Arabic",
+ "tr": "turkcha",
+ "tk": "turkmancha",
+ "tru": "Turoyo",
+ "tvl": "Tuvalu",
+ "tyv": "Tuvinian",
+ "tw": "Twi",
+ "kcg": "Tyap",
+ "udm": "Udmurt",
+ "cy": "uelscha",
+ "uga": "Ugaritic",
+ "uk": "ukraincha",
+ "umb": "Umbundu",
+ "ur": "urducha",
+ "ug": "uyg\u02bburcha",
+ "vai": "vayancha",
+ "ve": "Venda",
+ "vec": "Venetian",
+ "hu": "vengrcha",
+ "vep": "Veps",
+ "vo": "Volap\u00fck",
+ "wo": "volofcha",
+ "vro": "V\u00f5ro",
+ "vot": "Votic",
+ "vun": "vunjoancha",
+ "vi": "vyetnamcha",
+ "wa": "Walloon",
+ "wae": "Walser",
+ "war": "Waray",
+ "wbp": "Warlpiri",
+ "was": "Washo",
+ "guc": "Wayuu",
+ "vls": "West Flemish",
+ "mrj": "Western Mari",
+ "wal": "Wolaytta",
+ "wuu": "Wu Chinese",
+ "ha": "xauscha",
+ "hsn": "Xiang Chinese",
+ "zh": "xitoycha",
+ "km": "xmercha",
+ "hr": "xorvatcha",
+ "xh": "xosancha",
+ "yav": "Yangben",
+ "yao": "Yao",
+ "yap": "Yapese",
+ "ja": "yaponcha",
+ "jv": "yavancha",
+ "ybb": "Yemba",
+ "es_ES": "Yevropa ispanchasi",
+ "pt_PT": "Yevropa portugalchasi",
+ "yi": "Yiddish",
+ "dyo": "yola-fonyicha",
+ "yo": "yorubcha",
+ "dz": "yovoncha",
+ "el": "yunoncha",
+ "hsb": "yuqori sorbcha",
+ "ar_001": "zamonavij standart arabcha",
+ "zap": "Zapotec",
+ "dje": "zarmacha",
+ "zza": "Zaza",
+ "zea": "Zeelandic",
+ "zen": "Zenaga",
+ "za": "Zhuang",
+ "ii": "zichuan yicha",
+ "gbz": "Zoroastrian Dari",
+ "zu": "zuluancha",
+ "zun": "Zuni"
+}
diff --git a/public/intl/messages/am-ET.json b/public/intl/messages/am-ET.json
deleted file mode 100644
index 6ab57eb20..000000000
--- a/public/intl/messages/am-ET.json
+++ /dev/null
@@ -1,1882 +0,0 @@
-{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Add website"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "All"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Back"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancel"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Change password"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirm password"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Countries"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Current password"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Custom range"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dashboard"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Date range"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Default date range"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Delete"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Delete website"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Devices"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Dismiss"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edit"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Enable share URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event Data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Events"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combined"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " days"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hours"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Login"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logout"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "More"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Name"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "New password"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Page views"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Password"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profile"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtime"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresh"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Required"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Save"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Settings"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Share URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Single day"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "This month"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "This week"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "This year"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Timezone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Today"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Tracking code"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unique visitors"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Unknown"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Username"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "View details"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Views"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitors"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " current "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitor"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitors"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Are you sure you want to delete "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are you sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All website data will be deleted."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Something went wrong."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Go to settings"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Incorrect username/password."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Invalid domain. Do not include http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No data available."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwords do not match."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "You do not have any websites configured."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Page not found."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your settings will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Saved."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "This is the publicly shared URL for "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "To track stats for this website, place the following code in the "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " section of your HTML."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
-}
diff --git a/public/intl/messages/ar-SA.json b/public/intl/messages/ar-SA.json
index da0109c02..dfae6b16d 100644
--- a/public/intl/messages/ar-SA.json
+++ b/public/intl/messages/ar-SA.json
@@ -1,1884 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "كود الدعوة"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "الإجراءات"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "سجل الأحداث"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "أضِف"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "أضِف وصف"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "أضِف عضو"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "إضافة خطوة"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "إضافة موقع"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "مدير"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "يعد"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "الكل"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "كل الوقت"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "تحليلات"
- }
- ],
- "label.attribution": [
- {
- "type": 0,
- "value": "الإسناد"
- }
- ],
- "label.attribution-description": [
- {
- "type": 0,
- "value": "شاهد كيف يتفاعل المستخدمون مع حملاتك التسويقية وما الذي يحفز التحويلات."
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "المتوسط"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "للخلف"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "قبل"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "معدل الارتداد"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "التصنيف"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "المتصفح"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "المتصفحات"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "إلغاء"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "تغيير كلمة المرور"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "المدن"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "المدينة"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "مسح الكل"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "المقارنة"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "تأكيد"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "تأكيد كلمة المرور"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "يحتوي على"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "تابع"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "العدد"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "الدول"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "الدولة"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "أنشِئ"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "أنشِئ تقرير"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "أنشِئ فريق"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "أنشِئ مستخدم"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "أُنشئت"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "أُنشئ من قبل"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "الحالي"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "كلمة المرور الحالية"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "فترة مخصّصة"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "لوحة التحكم"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "البيانات"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "التاريخ"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "فترة مخصّصة"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "يوم"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "الفترة المخصّصة الافتراضية"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "حذف"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "احذف التقرير"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "حذف الفريق"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "جذف مستخدم"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "حذف الموقع"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "الوصف"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "كمبيوتر"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "تفاصيل"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "الجهاز"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "الأجهزة"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "تجاهل"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "لا يحتوي على"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "النطاق"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "إنزال"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "تعديل"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "عدّل لوحة التحكم"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "عدّل العضو"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "فعّل مشاركة الرابط"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "الخطوة الأخيرة"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "رابط الدخول"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "الحدث"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "تاريخ الحدث"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "الأحداث"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "رابط المغادرة"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "خطأ"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "الحقل"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "الحقول"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "تصفيَة"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "مُجمّعة"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "خام"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "التصفيات"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "أول ظهور"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "قمع"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "فهم معدل التحويل والانقطاع عن المستخدمين."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "الهدف"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "الأهداف"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "تابع تحقق أهدافك المرتبطة بمشاهدات الصفحات والأحداث."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "أكبَر مِن"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "أكبَر مِن أو يساوي"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "نتائج التحليلات"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "تعمق في بياناتك باستخدام الشرائح والتصفيات."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "يساوي"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "لا يساوي"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "لم ضُبط"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "ضُبط"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "انضم"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "انضم للفريق"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "رحلة المستخدم"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "تعرّف على كيفية تنقّل المستخدمين داخل موقعك."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "اللغة"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "اللغات"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "لابتوب"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "آخر "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " يوم/ايام"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "آخر "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ساعة"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "آخر "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " شهر/أشهر"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "آخر ظهور"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "غادر"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "مغادرة المجموعة"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "أقل مِن"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "أقل مِن أو يساوي"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "تسجيل الدخول"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "تسجيل الخروج"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "التحكم"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "مدير"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "الحد الأقصى"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "عضو"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "الأعضاء"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "الحد الأدنى"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "جوال"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "المزيد"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "حسابي"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "مواقعي"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "الاسم"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "كلمة مرور جديدة"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "غير معرّف"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "نعم"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "نظام التشغيل"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "نظرة عامة"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "المالك"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "صفحة "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " من "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "مشاهدات الصفحة"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "عنوان الصفحة"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "الصفحات"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "كلمة المرور"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "المسار"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "المسارات"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "مشغل بواسطة "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "السابق"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "الفترة السابقة"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "العام السابق"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "الملف الشخصي"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "الخصائص"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "الخاصية"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "استعلامات"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "استعلام"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "متغيرات الرابط"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "الوقت الفعلي"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "المرجع"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "التحويلات"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "تحديث"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "إعادة توليد"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "المنطقة"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "المناطق"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "أزِل"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "احذف عضو"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "التقارير"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "اجباري"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "اعادة تعيين"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "اعادة تعيين الإحصائيات"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "الاحتفاظ"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "قس مدى ثبات موقعك على الويب من خلال تتبع عدد مرات عودة المستخدمين."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "الإيرادات"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "قم بإلقاء نظرة على بيانات إيراداتك وكيفية إنفاق المستخدمين."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "خاصية الإيرادات"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "الصلاحية"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "شغّل الاستعلام"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "حفظ"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "الشاشات"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "بحث"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "اختر"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "حدد التاريخ"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "حدد الدور"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "حدد موقع"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "الزيارة"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "الزيارات"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "الإعدادات"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "مشاركة الرابط"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "يوم واحد"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "الخطوة الأولى"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "الخطوات"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "المجموع"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "تابلت"
- }
- ],
- "label.tag": [
- {
- "type": 0,
- "value": "الوسم"
- }
- ],
- "label.tags": [
- {
- "type": 0,
- "value": "الوسوم"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "الفريق"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "معرّف الفريق"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "مدير الفريق"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "عضو الفريق"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "اسم الفريق"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "مدير الفريق"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "عرض الفريق فقط"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "مواقع الفريق"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "الفرق"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "السمة"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "الشهر الحالي"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "الاسبوع الحالي"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "السنة الحالية"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "المنطقة الزمنية"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "العنوان"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "اليوم"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "تغيير الإحصائيات"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "الإجمالي"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "إجمالي السجلات"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "كود التتبع"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "المعاملات"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "نقل"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "انقل الموقع"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "حقيقي"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "النوع"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "فريد"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "زائرون فريدون"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "العملاء الفريدون"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "غير معروف"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "بدون عنوان"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "تحديث"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "الرابط"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "الروابط"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "المستخدم"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "سمات المستخدم"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "اسم المستخدم"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "المستخدمين"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "تابع حملاتك التسويقية باستخدام معلمات UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "القيمة"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "عرض"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "عرض التفاصيل"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "عرض فقط"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "المشاهدات"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "مشاهدات لكل زيارة"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "متوسط وقت الزيارة"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "الزوار"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "الزيارات"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "الموقع"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "معرّف الموقع"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "المواقع"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "النافذة"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "الأمس"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "اكتب "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " في المربع أدناه للتأكيد."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " حاليا "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "زائر واحد"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "زوار"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "البيانات المجمعة"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "هل أنت متأكد من حذف "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "هل أنت متأكد من مغادرة "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "هل انت متأكد من حذف "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "هل أنت متأكد من اعادة تعيين الإحصائيات لـ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "؟"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "سيؤدي حذف الفريق أيضًا إلى حذف كافة مواقع الفريق"
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "سيتم حذف كافة بيانات الموقع."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "حدث خطأ ما."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " في "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "الذهاب إلى الإعدادات"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "اسم المستخدم او كلمة المرور غير صحيحة."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "النطاق غير صحيح"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "اقل عدد مسموح به "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " حرف/أحرف"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "إصدار جديد من Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " متاح!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "لا توجد بيانات متاحة."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "لا توجد بيانات الحدث متاحة."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "كلمة المرور غير متطابقة"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "لا توجد نتائج."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "هذا الفريق ليس لديه أي مواقع."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "لم تنشِئ اي فرق."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "لا يوجد مستخدمين."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "لم تقم بإعداد اي موقع."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "الصفحة غير موجودة."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "لإعادة ضبط موقع الويب هذا، اكتب "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " في المربع أدناه للتأكيد."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تعيير كود التتبع"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "تم الحفظ بنجاح."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "إحصائيات موقعك متاحة للجميع على الرابط التالي:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "أنت عضو في الفريق"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "لم يتم العثور على الفريق"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "يمكن مشاهدة الموقع من اي عضو في الفريق."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "كود التتبع"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "نقل هذا الموقع إلى حسابك؟"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "اختر الفريق الذي تريد نقل الموقع إليه."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "نقل ملكية الموقع لحسابك أو فريق أخر."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "أُطلق الحدث"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "تم حذف المستخدم."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "شوهدت الصفحة"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "زائر من "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " يستخدم "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " على "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "أنخفض عدد الزوار"
- }
- ]
+ "label": {
+ "access-code": "كود الدعوة",
+ "account": "حساب",
+ "action": "إجراء",
+ "actions": "الإجراءات",
+ "activity": "سجل الأحداث",
+ "add": "أضِف",
+ "add-board": "أضف لوحة",
+ "add-description": "أضِف وصف",
+ "add-link": "إضافة رابط",
+ "add-member": "أضِف عضو",
+ "add-pixel": "إضافة بكسل",
+ "add-step": "إضافة خطوة",
+ "add-website": "إضافة موقع",
+ "admin": "مدير",
+ "affiliate": "شريك تسويقي",
+ "after": "يعد",
+ "all": "الكل",
+ "all-time": "كل الوقت",
+ "analysis": "تحليل",
+ "analytics": "تحليلات",
+ "aov": "AOV",
+ "application": "تطبيق",
+ "apply": "تطبيق",
+ "arpu": "ARPU",
+ "attribution": "الإسناد",
+ "attribution-description": "شاهد كيف يتفاعل المستخدمون مع حملاتك التسويقية وما الذي يحفز التحويلات.",
+ "audience": "جمهور",
+ "average": "المتوسط",
+ "back": "للخلف",
+ "before": "قبل",
+ "behavior": "السلوك",
+ "block-selector": "محدد الكتلة",
+ "boards": "لوحات",
+ "bounce-rate": "معدل الارتداد",
+ "breakdown": "التصنيف",
+ "browser": "المتصفح",
+ "browsers": "المتصفحات",
+ "campaign": "حملة",
+ "campaigns": "حملات",
+ "cancel": "إلغاء",
+ "change-password": "تغيير كلمة المرور",
+ "channel": "قناة",
+ "channels": "قنوات",
+ "chart": "مخطط",
+ "cities": "المدن",
+ "city": "المدينة",
+ "clear-all": "مسح الكل",
+ "cls": "CLS",
+ "cohort": "مجموعة",
+ "cohorts": "مجموعات",
+ "compare": "المقارنة",
+ "compare-dates": "قارن التواريخ",
+ "confirm": "تأكيد",
+ "confirm-password": "تأكيد كلمة المرور",
+ "contains": "يحتوي على",
+ "content": "المحتوى",
+ "continue": "تابع",
+ "conversion": "تحويل",
+ "conversion-rate": "معدل التحويل",
+ "conversion-step": "خطوة التحويل",
+ "count": "العدد",
+ "countries": "الدول",
+ "country": "الدولة",
+ "create": "أنشِئ",
+ "create-report": "أنشِئ تقرير",
+ "create-team": "أنشِئ فريق",
+ "create-user": "أنشِئ مستخدم",
+ "created": "أُنشئت",
+ "created-by": "أُنشئ من قبل",
+ "criteria": "معايير",
+ "currency": "العملة",
+ "current": "الحالي",
+ "current-password": "كلمة المرور الحالية",
+ "custom-range": "فترة مخصّصة",
+ "dashboard": "لوحة التحكم",
+ "data": "البيانات",
+ "date": "التاريخ",
+ "date-range": "فترة مخصّصة",
+ "day": "يوم",
+ "default-date-range": "الفترة المخصّصة الافتراضية",
+ "delete": "حذف",
+ "delete-report": "احذف التقرير",
+ "delete-team": "حذف الفريق",
+ "delete-user": "جذف مستخدم",
+ "delete-website": "حذف الموقع",
+ "description": "الوصف",
+ "desktop": "كمبيوتر",
+ "destination-url": "رابط الوجهة",
+ "details": "تفاصيل",
+ "device": "الجهاز",
+ "devices": "الأجهزة",
+ "direct": "مباشر",
+ "dismiss": "تجاهل",
+ "distinct-id": "معرّف مميز",
+ "documentation": "التوثيق",
+ "does-not-contain": "لا يحتوي على",
+ "does-not-include": "لا يتضمن",
+ "doest-not-exist": "غير موجود",
+ "domain": "النطاق",
+ "download": "تحميل",
+ "dropoff": "إنزال",
+ "duration": "المدة",
+ "edit": "تعديل",
+ "edit-member": "عدّل العضو",
+ "email": "بريد إلكتروني",
+ "enable-share-url": "فعّل مشاركة الرابط",
+ "end-step": "الخطوة الأخيرة",
+ "entry": "رابط الدخول",
+ "environment": "بيئة",
+ "event": "الحدث",
+ "event-data": "تاريخ الحدث",
+ "event-name": "اسم الحدث",
+ "events": "الأحداث",
+ "exclude-bounce": "استبعاد الارتداد",
+ "exists": "موجود",
+ "exit": "رابط المغادرة",
+ "false": "خطأ",
+ "fcp": "FCP",
+ "field": "الحقل",
+ "fields": "الحقول",
+ "filter": "تصفيَة",
+ "filter-combined": "مُجمّعة",
+ "filter-raw": "خام",
+ "filters": "التصفيات",
+ "first-click": "النقرة الأولى",
+ "first-seen": "أول ظهور",
+ "funnel": "قمع",
+ "funnel-description": "فهم معدل التحويل والانقطاع عن المستخدمين.",
+ "funnels": "قمعات",
+ "goal": "الهدف",
+ "goals": "الأهداف",
+ "goals-description": "تابع تحقق أهدافك المرتبطة بمشاهدات الصفحات والأحداث.",
+ "good": "جيد",
+ "greater-than": "أكبَر مِن",
+ "greater-than-equals": "أكبَر مِن أو يساوي",
+ "grouped": "مجمع",
+ "growth": "نمو",
+ "hostname": "اسم المضيف",
+ "hour": "ساعة",
+ "includes": "يتضمن",
+ "inp": "INP",
+ "insight": "رؤية معمقة",
+ "insights": "نتائج التحليلات",
+ "insights-description": "تعمق في بياناتك باستخدام الشرائح والتصفيات.",
+ "invalid-url": "رابط غير صالح",
+ "is": "يساوي",
+ "is-false": "غير صحيح",
+ "is-not": "لا يساوي",
+ "is-not-set": "لم ضُبط",
+ "is-set": "ضُبط",
+ "is-true": "صحيح",
+ "join": "انضم",
+ "join-team": "انضم للفريق",
+ "journey": "رحلة المستخدم",
+ "journey-description": "تعرّف على كيفية تنقّل المستخدمين داخل موقعك.",
+ "journeys": "رحلات المستخدم",
+ "language": "اللغة",
+ "languages": "اللغات",
+ "laptop": "لابتوب",
+ "last-click": "النقرة الأخيرة",
+ "last-days": "آخر {x} يوم/ايام",
+ "last-hours": "آخر {x} ساعة",
+ "last-months": "آخر {x} شهر/أشهر",
+ "last-seen": "آخر ظهور",
+ "lcp": "LCP",
+ "leave": "غادر",
+ "leave-team": "مغادرة المجموعة",
+ "less-than": "أقل مِن",
+ "less-than-equals": "أقل مِن أو يساوي",
+ "link": "رابط",
+ "links": "روابط",
+ "location": "موقع",
+ "login": "تسجيل الدخول",
+ "logout": "تسجيل الخروج",
+ "manage": "التحكم",
+ "manager": "مدير",
+ "mask-level": "مستوى القناع",
+ "match": "تطابق",
+ "match-all": "الكل",
+ "match-any": "أي",
+ "max": "الحد الأقصى",
+ "max-duration": "الحد الأقصى للمدة",
+ "maximize": "توسيع",
+ "medium": "وسيط",
+ "member": "عضو",
+ "members": "الأعضاء",
+ "min": "الحد الأدنى",
+ "minute": "دقيقة",
+ "mobile": "جوال",
+ "model": "نموذج",
+ "month": "شهر",
+ "more": "المزيد",
+ "my-account": "حسابي",
+ "my-websites": "مواقعي",
+ "name": "الاسم",
+ "needs-improvement": "يحتاج إلى تحسين",
+ "new-password": "كلمة مرور جديدة",
+ "none": "لا شيء",
+ "number-of-records": "{x} {x, plural, one {سجل} other {سجلات}}",
+ "ok": "نعم",
+ "online": "متصل",
+ "organic-search": "بحث عضوي",
+ "organic-shopping": "تسوق عضوي",
+ "organic-social": "اجتماعي عضوي",
+ "organic-video": "فيديو عضوي",
+ "os": "نظام التشغيل",
+ "other": "أخرى",
+ "overview": "نظرة عامة",
+ "owner": "المالك",
+ "page": "صفحة",
+ "page-of": "صفحة {current} من {total}",
+ "page-views": "مشاهدات الصفحة",
+ "pages": "صفحات",
+ "pageTitle": "عنوان الصفحة",
+ "paid-ads": "إعلانات مدفوعة",
+ "paid-search": "بحث مدفوع",
+ "paid-shopping": "تسوق مدفوع",
+ "paid-social": "اجتماعي مدفوع",
+ "paid-video": "فيديو مدفوع",
+ "password": "كلمة المرور",
+ "path": "مسار",
+ "paths": "مسارات",
+ "performance": "الأداء",
+ "pixel": "بكسل",
+ "pixels": "بكسلات",
+ "play": "تشغيل",
+ "poor": "ضعيف",
+ "powered-by": "مشغل بواسطة {name}",
+ "preferences": "التفضيلات",
+ "previous": "السابق",
+ "previous-period": "الفترة السابقة",
+ "previous-year": "العام السابق",
+ "profile": "الملف الشخصي",
+ "profiles": "الملفات الشخصية",
+ "properties": "خصائص",
+ "property": "خاصية",
+ "queries": "استعلامات",
+ "query": "استعلام",
+ "query-parameters": "معاملات الاستعلام",
+ "realtime": "الوقت الفعلي",
+ "recorded": "سُجِّل في",
+ "referral": "إحالة",
+ "referrer": "المرجع",
+ "referrers": "التحويلات",
+ "refresh": "تحديث",
+ "regenerate": "إعادة توليد",
+ "regex-match": "يطابق التعبير النمطي",
+ "regex-not-match": "لا يطابق التعبير النمطي",
+ "region": "المنطقة",
+ "regions": "المناطق",
+ "remaining": "متبقي",
+ "remove": "أزِل",
+ "remove-member": "احذف عضو",
+ "replay": "إعادة التشغيل",
+ "replay-enabled": "إعادة التشغيل مفعلة",
+ "replay-id": "Replay ID",
+ "replays": "إعادات التشغيل",
+ "reports": "التقارير",
+ "required": "اجباري",
+ "reset": "اعادة تعيين",
+ "reset-website": "اعادة تعيين الإحصائيات",
+ "retention": "الاحتفاظ",
+ "retention-days": "أيام الاحتفاظ",
+ "retention-description": "قس مدى ثبات موقعك على الويب من خلال تتبع عدد مرات عودة المستخدمين.",
+ "revenue": "الإيرادات",
+ "revenue-description": "قم بإلقاء نظرة على بيانات إيراداتك وكيفية إنفاق المستخدمين.",
+ "role": "الصلاحية",
+ "run-query": "شغّل الاستعلام",
+ "sample-rate": "معدل أخذ العينات",
+ "sample-size": "حجم العينة",
+ "save": "حفظ",
+ "save-cohort": "حفظ المجموعة",
+ "save-segment": "حفظ الشريحة",
+ "screen": "شاشة",
+ "screens": "الشاشات",
+ "search": "بحث",
+ "segment": "شريحة",
+ "segments": "شرائح",
+ "select": "اختر",
+ "select-component": "اختر مكونًا",
+ "select-date": "حدد التاريخ",
+ "select-filter": "اختر تصفية",
+ "select-role": "حدد الدور",
+ "select-website": "حدد موقع",
+ "session": "الزيارة",
+ "session-data": "بيانات الجلسة",
+ "sessions": "الزيارات",
+ "settings": "الإعدادات",
+ "share": "مشاركة",
+ "share-url": "مشاركة الرابط",
+ "single-day": "يوم واحد",
+ "slug": "Slug",
+ "sms": "رسالة نصية",
+ "source": "مصدر",
+ "sources": "مصادر",
+ "start-step": "الخطوة الأولى",
+ "steps": "الخطوات",
+ "sum": "المجموع",
+ "support": "دعم",
+ "switch-account": "تبديل الحساب",
+ "table": "جدول",
+ "tablet": "تابلت",
+ "tag": "الوسم",
+ "tags": "الوسوم",
+ "team": "الفريق",
+ "team-id": "معرّف الفريق",
+ "team-manager": "مدير الفريق",
+ "team-member": "عضو الفريق",
+ "team-name": "اسم الفريق",
+ "team-owner": "مدير الفريق",
+ "team-settings": "إعدادات الفريق",
+ "team-view-only": "عرض الفريق فقط",
+ "team-websites": "مواقع الفريق",
+ "teams": "الفرق",
+ "term": "مصطلح البحث",
+ "terms": "مصطلحات",
+ "theme": "السمة",
+ "this-month": "الشهر الحالي",
+ "this-week": "الاسبوع الحالي",
+ "this-year": "السنة الحالية",
+ "timezone": "المنطقة الزمنية",
+ "title": "العنوان",
+ "today": "اليوم",
+ "toggle-charts": "تغيير الإحصائيات",
+ "total": "الإجمالي",
+ "total-records": "إجمالي السجلات",
+ "tracking-code": "كود التتبع",
+ "traffic": "حركة المرور",
+ "transactions": "المعاملات",
+ "transfer": "نقل",
+ "transfer-website": "انقل الموقع",
+ "true": "حقيقي",
+ "ttfb": "TTFB",
+ "type": "النوع",
+ "unique": "فريد",
+ "unique-events": "أحداث فريدة",
+ "unique-visitors": "زائرون فريدون",
+ "uniqueCustomers": "العملاء الفريدون",
+ "unknown": "غير معروف",
+ "untitled": "بدون عنوان",
+ "update": "تحديث",
+ "url": "URL",
+ "user": "المستخدم",
+ "username": "اسم المستخدم",
+ "users": "المستخدمين",
+ "utm": "UTM",
+ "utm-campaign": "UTM حملة",
+ "utm-content": "UTM محتوى",
+ "utm-description": "تابع حملاتك التسويقية باستخدام معلمات UTM.",
+ "utm-medium": "UTM وسيط",
+ "utm-source": "UTM مصدر",
+ "utm-term": "UTM مصطلح",
+ "value": "القيمة",
+ "version": "إصدار",
+ "view": "عرض",
+ "view-details": "عرض التفاصيل",
+ "view-only": "عرض فقط",
+ "views": "المشاهدات",
+ "views-per-visit": "مشاهدات لكل زيارة",
+ "visit-duration": "متوسط وقت الزيارة",
+ "visitors": "الزوار",
+ "visits": "الزيارات",
+ "website": "الموقع",
+ "website-id": "معرّف الموقع",
+ "websites": "المواقع",
+ "window": "النافذة",
+ "yesterday": "الأمس"
+ },
+ "message": {
+ "action-confirmation": "اكتب {confirmation} في المربع أدناه للتأكيد.",
+ "active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}",
+ "bad-request": "طلب غير صالح",
+ "collected-data": "البيانات المجمعة",
+ "confirm-delete": "هل أنت متأكد من حذف {target}?",
+ "confirm-leave": "هل أنت متأكد من مغادرة {target} ?",
+ "confirm-remove": "هل انت متأكد من حذف {target} ?",
+ "confirm-reset": "هل أنت متأكد من اعادة تعيين الإحصائيات لـ {target}؟",
+ "delete-team-warning": "سيؤدي حذف الفريق أيضًا إلى حذف كافة مواقع الفريق",
+ "delete-website-warning": "سيتم حذف كافة بيانات الموقع.",
+ "empty-dashboard": "لوحة التحكم الخاصة بك فارغة. انقر فوق تحرير لإضافة مكونك الأول.",
+ "error": "حدث خطأ ما.",
+ "event-log": "{event} في {url} ",
+ "forbidden": "محظور",
+ "go-to-settings": "الذهاب إلى الإعدادات",
+ "incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.",
+ "invalid-domain": "النطاق غير صحيح",
+ "min-password-length": "اقل عدد مسموح به {n} حرف/أحرف",
+ "new-version-available": "إصدار جديد من Umami {version} متاح!",
+ "no-data-available": "لا توجد بيانات متاحة.",
+ "no-event-data": "لا توجد بيانات الحدث متاحة.",
+ "no-match-password": "كلمة المرور غير متطابقة",
+ "no-results-found": "لا توجد نتائج.",
+ "no-team-websites": "هذا الفريق ليس لديه أي مواقع.",
+ "no-teams": "لم تنشِئ اي فرق.",
+ "no-users": "لا يوجد مستخدمين.",
+ "no-websites-configured": "لم تقم بإعداد اي موقع.",
+ "not-found": "غير موجود",
+ "nothing-selected": "لم يتم تحديد شيء.",
+ "page-not-found": "الصفحة غير موجودة.",
+ "reset-website": "لإعادة ضبط موقع الويب هذا، اكتب {confirmation} في المربع أدناه للتأكيد.",
+ "reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تغيير كود التتبع",
+ "saved": "تم الحفظ بنجاح.",
+ "select-component-preview": "اختر مكونًا للمعاينة",
+ "select-website-first": "اختر موقعًا أولاً",
+ "sever-error": "خطأ في الخادم",
+ "share-url": "إحصائيات موقعك متاحة للجميع على الرابط التالي:",
+ "team-already-member": "أنت عضو في الفريق",
+ "team-not-found": "لم يتم العثور على الفريق",
+ "team-websites-info": "يمكن مشاهدة الموقع من اي عضو في الفريق.",
+ "tracking-code": "كود التتبع",
+ "transfer-team-website-to-user": "نقل هذا الموقع إلى حسابك؟",
+ "transfer-user-website-to-team": "اختر الفريق الذي تريد نقل الموقع إليه.",
+ "transfer-website": "نقل ملكية الموقع لحسابك أو فريق أخر.",
+ "triggered-event": "أُطلق الحدث",
+ "unauthorized": "غير مصرح",
+ "user-deleted": "تم حذف المستخدم.",
+ "viewed-page": "شوهدت الصفحة",
+ "visitor-log": "زائر من {country} يستخدم {browser} على {os} {device} "
+ }
}
diff --git a/public/intl/messages/be-BY.json b/public/intl/messages/be-BY.json
index d5ca0a1e7..4c1d35461 100644
--- a/public/intl/messages/be-BY.json
+++ b/public/intl/messages/be-BY.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Код доступу"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Дзеянні"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Журнал актыўнасці"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Дадаць"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Дадаць апісанне"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Дадаць удзельніка"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Дадаць крок"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Дадаць сайт"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Адміністратар"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Пасля"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Усё"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Увесь час"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Аналітыка"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Сярэдняе"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Назад"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Да"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Паказчык адмоваў"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Разбіўка"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Браўзер"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Браўзеры"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Адмена"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Змяніць пароль"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Гарады"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Горад"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Ачысціць усё"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Параўнаць"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Падцвердзіць"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Падцвердзіць пароль"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Уключае"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Працягнуць"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Колькасць"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Краіны"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Краіна"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Стварыць"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Стварыць справаздачу"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Стварыць каманду"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Стварыць карыстальніка"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Створана"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Створана"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Цяперашні"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Цяперашні пароль"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Іншы дыяпазон"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Інфармацыйная панэль"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Дадзеныя"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Дата"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Дыяпазон дат"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Дзень"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Дыяпазон дат па змаўчанню"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Выдаліць"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Выдаліць справаздачу"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Выдаліць каманду"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Выдаліць карыстальніка"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Выдаліць сайт"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Апісанне"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Настольны ПК"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Дэталі"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Прылада"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Прылады"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Адхіліць"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Не ўключае"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Дамен"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Адмовы"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Змяніць"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Змяніць інфармацыйную панэль"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Рэдагаваць удзельніка"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Дазволіць дзяліцца спасылкай"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Канчатковы крок"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL уваходу"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Падзея"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Дадзеныя падзеі"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Падзеі"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL выхаду"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Ложна"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Поле"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Палі"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Фільтр"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Камбініраваны"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Сырыя"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Фільтры"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Варонка"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Разумець паказчыкі канверсіі і адмоваў."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Мэта"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Мэты"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Сачыць за мэтамі па праглядах старонак і падзеях."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Больш чым"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Больш чым або роўна"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Хост"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Хасты"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Інсайты"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Даследваць дадзеныя з дапамогай сегментаў і фільтраў."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "З'яўляецца"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Не з'яўляецца"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Не ўстаноўлена"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Устаноўлена"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Далучыцца"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Далучыцца да каманды"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Маршрут карыстальніка"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Разумець як карыстальнікі навігуюць па сайце."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Мова"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Мовы"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Ноўтбук"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Апошнія "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " дзён"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Апошнія "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " гадзіны"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Апошнія "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " месяцаў"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Пакінуць"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Пакінуць каманду"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Менш чым"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Менш чым або роўна"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Увайсці"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Выйсці"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Кіраваць"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Кіраўнік"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Максімум"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Удзельнік"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Удзельнікі"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Мінімум"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Мабільны"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Болей"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Мой уліковы запіс"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Мае сайты"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Імя"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Новы пароль"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Няма"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "запіс"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "запісаў"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "ОК"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Аперацыйная сістэма"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Агляд"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Уласнік"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Старонка "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " з "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Прагляды старонкі"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Загаловак старонкі"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Старонкі"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Пароль"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Зроблена "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Папярэдні"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Папярэдні перыяд"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Папярэдні год"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Профіль"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Уласцівасць"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Запыты"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Запыт"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Параметры запыту"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "У рэяльным часе"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Рэферэр"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Рэферэры"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Аднавіць"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Рэгенераваць"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Рэгіён"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Рэгіёны"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Выдаліць"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Выдаліць удзельніка"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Справаздачы"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Абавязкова"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Скінуць"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Скінуць статыстыку"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Утрыманне"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Ацаніць прыцягальнасць сайта, адсочваючы павяртанні карыстальнікаў."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Роля"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Запусціць запыт"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Захаваць"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Экраны"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Пошук"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Выбраць"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Выбраць дату"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Выбраць ролю"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Выбраць сайт"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Сесіі"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Налады"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Падзяліцца спасылкай"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Адзін дзень"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Першы кроку"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Крокі"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Сума"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Планшэт"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Каманда"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Ідэнтыфікатар каманды"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Кіраўнік каманды"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Удзельнік каманды"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Назва каманды"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Уласнік каманды"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Толькі для каманднага прагляду"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Сайты каманды"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Каманды"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Тэма"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Гэты месяц"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Гэты тыдзень"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Гэты год"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Часавы пояс"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Загаловак"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Сёння"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Пераключыць графікі"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Агульная колькасць"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Агульная колькасць запісаў"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Код адсочвання"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Перадаць"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Перадаць сайт"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Ісціна"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Тып"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Унікальны"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Унікальныя наведвальнікі"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Невядома"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Без назвы"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Абнавіць"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Карыстальнік"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Імя карыстальніка"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Карыстальнікі"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Сачыць за кампаніямі з дапамогай UTM-метак."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Значэнне"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Паглядзець"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Паглядзець дэталі"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Толькі прагляд"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Прагляды"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Прагляды за наведванне"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Сярэдняя даўжыня наведвання"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Наведвальнікі"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Наведванні"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Сайт"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Ідэнтыфікатар сайта"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Сайты"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Вакно"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Учора"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Увядзіце "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " у поле ніжэй, каб пацвердзіць."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " цякучых "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "наведвальнік"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "наведвальнікаў"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Сабраныя дадзеныя"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Вы дакладна хочаце выдаліць "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Вы дакладна хочаце пакінуць "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Вы дакладна хочаце выдаліць "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Вы дакладна хочаце скінуць "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " статыстыку?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Выдаленне каманды таксама выдаліць усе сайты каманды."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Усе асацыяваныя дадзеныя будуць таксама выдалены."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Нешта пайшло не так."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Да налад"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Некарэктнае імя карыстальніка/пароль."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Некарэктны дамен"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Мінімальная даўжыня "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " знакаў"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Даступная новая версія Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Няма дадзеных."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Дадзеныя падзеі недаступныя."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Паролі не супадаюць"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Вынікаў не знойдзена."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Гэтая каманда не мае ніводнага сайта."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Вы не стварылі ніводнай каманды."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Няма карыстальнікаў."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Вы не наладзілі ніводнага сайта."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Старонка не знойдзена."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Каб скінуць гэты сайт, увядзіце "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " у поле ніжэй для пацверджання."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Уся статыстыка для гэтага сайта будзе выдалена, але код адсочвання будзе працягваць працаваць."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Захавана паспяхова."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Гэта публічная спасылка для "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Вы ўжо ўдзельнік каманды."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Каманда не знойдзена."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Сайты могуць быць праглядацца любым удзельнікам каманды."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Код адсочвання"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Перадаць гэты сайт на ваш уліковы запіс?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Выберыце каманду для перадачы гэтага сайта."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Перадача сайта на ваш уліковы запіс або іншай камандзе."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Падзея якая спрацавала"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Карыстальнік выдалены."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Праглядзеў старонку"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Наведвальнік з "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " праз "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Наведвальнікі сышлі"
- }
- ]
+ "label": {
+ "access-code": "Код доступу",
+ "account": "Акаўнт",
+ "action": "Дзеянне",
+ "actions": "Дзеянні",
+ "activity": "Журнал актыўнасці",
+ "add": "Дадаць",
+ "add-board": "Дадаць дошку",
+ "add-description": "Дадаць апісанне",
+ "add-link": "Дадаць спасылку",
+ "add-member": "Дадаць удзельніка",
+ "add-pixel": "Дадаць піксель",
+ "add-step": "Дадаць крок",
+ "add-website": "Дадаць сайт",
+ "admin": "Адміністратар",
+ "affiliate": "Партнёр",
+ "after": "Пасля",
+ "all": "Усё",
+ "all-time": "Увесь час",
+ "analysis": "Аналіз",
+ "analytics": "Аналітыка",
+ "aov": "AOV",
+ "application": "Прыкладанне",
+ "apply": "Ужыць",
+ "arpu": "ARPU",
+ "attribution": "Атрыбуцыя",
+ "attribution-description": "Глядзіце, як карыстальнікі ўзаемадзейнічаюць з вашым маркетынгам і што прыводзіць да канверсій.",
+ "audience": "Аўдыторыя",
+ "average": "Сярэдняе",
+ "back": "Назад",
+ "before": "Да",
+ "behavior": "Паводзіны",
+ "block-selector": "Выбар блока",
+ "boards": "Дошкі",
+ "bounce-rate": "Паказчык адмоваў",
+ "breakdown": "Разбіўка",
+ "browser": "Браўзер",
+ "browsers": "Браўзеры",
+ "campaign": "Кампанія",
+ "campaigns": "Кампаніі",
+ "cancel": "Адмена",
+ "change-password": "Змяніць пароль",
+ "channel": "Канал",
+ "channels": "Каналы",
+ "chart": "Дыяграма",
+ "cities": "Гарады",
+ "city": "Горад",
+ "clear-all": "Ачысціць усё",
+ "cls": "CLS",
+ "cohort": "Кагорта",
+ "cohorts": "Кагорты",
+ "compare": "Параўнаць",
+ "compare-dates": "Параўнаць даты",
+ "confirm": "Падцвердзіць",
+ "confirm-password": "Падцвердзіць пароль",
+ "contains": "Уключае",
+ "content": "Змест",
+ "continue": "Працягнуць",
+ "conversion": "Канверсія",
+ "conversion-rate": "Канверсійная стаўка",
+ "conversion-step": "Крок канверсіі",
+ "count": "Колькасць",
+ "countries": "Краіны",
+ "country": "Краіна",
+ "create": "Стварыць",
+ "create-report": "Стварыць справаздачу",
+ "create-team": "Стварыць каманду",
+ "create-user": "Стварыць карыстальніка",
+ "created": "Створана",
+ "created-by": "Створана",
+ "criteria": "Крытэрыі",
+ "currency": "Валюта",
+ "current": "Цяперашні",
+ "current-password": "Цяперашні пароль",
+ "custom-range": "Іншы дыяпазон",
+ "dashboard": "Інфармацыйная панэль",
+ "data": "Дадзеныя",
+ "date": "Дата",
+ "date-range": "Дыяпазон дат",
+ "day": "Дзень",
+ "default-date-range": "Дыяпазон дат па змаўчанню",
+ "delete": "Выдаліць",
+ "delete-report": "Выдаліць справаздачу",
+ "delete-team": "Выдаліць каманду",
+ "delete-user": "Выдаліць карыстальніка",
+ "delete-website": "Выдаліць сайт",
+ "description": "Апісанне",
+ "desktop": "Настольны ПК",
+ "destination-url": "URL прызначэння",
+ "details": "Дэталі",
+ "device": "Прылада",
+ "devices": "Прылады",
+ "direct": "Прама",
+ "dismiss": "Адхіліць",
+ "distinct-id": "Унікальны ID",
+ "documentation": "Дакументацыя",
+ "does-not-contain": "Не ўключае",
+ "does-not-include": "Не ўключае",
+ "doest-not-exist": "Не існуе",
+ "domain": "Дамен",
+ "download": "Спампаваць",
+ "dropoff": "Адмовы",
+ "duration": "Працягласць",
+ "edit": "Змяніць",
+ "edit-member": "Рэдагаваць удзельніка",
+ "email": "Электронная пошта",
+ "enable-share-url": "Дазволіць дзяліцца спасылкай",
+ "end-step": "Канчатковы крок",
+ "entry": "URL уваходу",
+ "environment": "Асяроддзе",
+ "event": "Падзея",
+ "event-data": "Дадзеныя падзеі",
+ "event-name": "Назва падзеі",
+ "events": "Падзеі",
+ "exclude-bounce": "Выключыць адмовы",
+ "exists": "Існуе",
+ "exit": "URL выхаду",
+ "false": "Ложна",
+ "fcp": "FCP",
+ "field": "Поле",
+ "fields": "Палі",
+ "filter": "Фільтр",
+ "filter-combined": "Камбініраваны",
+ "filter-raw": "Сырыя",
+ "filters": "Фільтры",
+ "first-click": "Першы клік",
+ "first-seen": "Першы раз убачана",
+ "funnel": "Варонка",
+ "funnel-description": "Разумець паказчыкі канверсіі і адмоваў.",
+ "funnels": "Варонкі",
+ "goal": "Мэта",
+ "goals": "Мэты",
+ "goals-description": "Сачыць за мэтамі па праглядах старонак і падзеях.",
+ "good": "Добра",
+ "greater-than": "Больш чым",
+ "greater-than-equals": "Больш чым або роўна",
+ "grouped": "Групаваны",
+ "growth": "Рост",
+ "hostname": "Імя хаста",
+ "hour": "Гадзіна",
+ "includes": "Уключае",
+ "inp": "INP",
+ "insight": "Інсайт",
+ "insights": "Інсайты",
+ "insights-description": "Даследваць дадзеныя з дапамогай сегментаў і фільтраў.",
+ "invalid-url": "Нядзейсны URL",
+ "is": "З'яўляецца",
+ "is-false": "Ложна",
+ "is-not": "Не з'яўляецца",
+ "is-not-set": "Не ўстаноўлена",
+ "is-set": "Устаноўлена",
+ "is-true": "Праўда",
+ "join": "Далучыцца",
+ "join-team": "Далучыцца да каманды",
+ "journey": "Маршрут карыстальніка",
+ "journey-description": "Разумець як карыстальнікі навігуюць па сайце.",
+ "journeys": "Маршруты",
+ "language": "Мова",
+ "languages": "Мовы",
+ "laptop": "Ноўтбук",
+ "last-click": "Апошні клік",
+ "last-days": "Апошнія {x} дзён",
+ "last-hours": "Апошнія {x} гадзіны",
+ "last-months": "Апошнія {x} месяцаў",
+ "last-seen": "Апошні візіт",
+ "lcp": "LCP",
+ "leave": "Пакінуць",
+ "leave-team": "Пакінуць каманду",
+ "less-than": "Менш чым",
+ "less-than-equals": "Менш чым або роўна",
+ "link": "Спасылка",
+ "links": "Спасылкі",
+ "location": "Месцазнаходжанне",
+ "login": "Увайсці",
+ "logout": "Выйсці",
+ "manage": "Кіраваць",
+ "manager": "Кіраўнік",
+ "mask-level": "Узровень маскіравання",
+ "match": "Адпаведнасць",
+ "match-all": "Усе",
+ "match-any": "Любы",
+ "max": "Максімум",
+ "max-duration": "Максімальная працягласць",
+ "maximize": "Разгарнуць",
+ "medium": "Сярэдні",
+ "member": "Удзельнік",
+ "members": "Удзельнікі",
+ "min": "Мінімум",
+ "minute": "Хвіліна",
+ "mobile": "Мабільны",
+ "model": "Мадэль",
+ "month": "Месяц",
+ "more": "Болей",
+ "my-account": "Мой уліковы запіс",
+ "my-websites": "Мае сайты",
+ "name": "Імя",
+ "needs-improvement": "Патрэбна паляпшэнне",
+ "new-password": "Новы пароль",
+ "none": "Няма",
+ "number-of-records": "{x} {x, plural, one {запіс} other {запісаў}}",
+ "ok": "ОК",
+ "online": "Анлайн",
+ "organic-search": "Арганічны пошук",
+ "organic-shopping": "Арганічныя пакупкі",
+ "organic-social": "Арганічныя сацыяльныя сеткі",
+ "organic-video": "Арганічнае відэа",
+ "os": "Аперацыйная сістэма",
+ "other": "Іншае",
+ "overview": "Агляд",
+ "owner": "Уласнік",
+ "page": "Старонка",
+ "page-of": "Старонка {current} з {total}",
+ "page-views": "Прагляды старонкі",
+ "pages": "Старонкі",
+ "pageTitle": "Загаловак старонкі",
+ "paid-ads": "Платная рэклама",
+ "paid-search": "Платаны пошук",
+ "paid-shopping": "Платныя пакупкі",
+ "paid-social": "Платныя сацыяльныя сеткі",
+ "paid-video": "Платнае відэа",
+ "password": "Пароль",
+ "path": "Шлях",
+ "paths": "Шляхи",
+ "performance": "Прадукцыйнасць",
+ "pixel": "Піксель",
+ "pixels": "Пікселі",
+ "play": "Прайграць",
+ "poor": "Дрэнна",
+ "powered-by": "Зроблена {name}",
+ "preferences": "Налады",
+ "previous": "Папярэдні",
+ "previous-period": "Папярэдні перыяд",
+ "previous-year": "Папярэдні год",
+ "profile": "Профіль",
+ "profiles": "Профілі",
+ "properties": "Уласцівасці",
+ "property": "Уласцівасць",
+ "queries": "Запыты",
+ "query": "Запыт",
+ "query-parameters": "Параметры запыту",
+ "realtime": "У рэяльным часе",
+ "recorded": "Запісана ў",
+ "referral": "Рэферал",
+ "referrer": "Рэферэр",
+ "referrers": "Рэферэры",
+ "refresh": "Аднавіць",
+ "regenerate": "Рэгенераваць",
+ "regex-match": "Адпавядае рэгулярнаму выразу",
+ "regex-not-match": "Не адпавядае рэгулярнаму выразу",
+ "region": "Рэгіён",
+ "regions": "Рэгіёны",
+ "remaining": "Засталося",
+ "remove": "Выдаліць",
+ "remove-member": "Выдаліць удзельніка",
+ "replay": "Паўтор",
+ "replay-enabled": "Паўтор уключаны",
+ "replay-id": "Replay ID",
+ "replays": "Паўторы",
+ "reports": "Справаздачы",
+ "required": "Абавязкова",
+ "reset": "Скінуць",
+ "reset-website": "Скінуць статыстыку",
+ "retention": "Утрыманне",
+ "retention-days": "Дні захоўвання",
+ "retention-description": "Ацаніць прыцягальнасць сайта, адсочваючы павяртанні карыстальнікаў.",
+ "revenue": "Даход",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "Роля",
+ "run-query": "Запусціць запыт",
+ "sample-rate": "Частата выбаркі",
+ "sample-size": "Аб'ём выбаркі",
+ "save": "Захаваць",
+ "save-cohort": "Захаваць кагорту",
+ "save-segment": "Захаваць сегмент",
+ "screen": "Экран",
+ "screens": "Экраны",
+ "search": "Пошук",
+ "segment": "Сегмент",
+ "segments": "Сегменты",
+ "select": "Выбраць",
+ "select-component": "Выберыце кампанент",
+ "select-date": "Выбраць дату",
+ "select-filter": "Выбраць фільтр",
+ "select-role": "Выбраць ролю",
+ "select-website": "Выбраць сайт",
+ "session": "Сесія",
+ "session-data": "Дадзеныя сесіі",
+ "sessions": "Сесіі",
+ "settings": "Налады",
+ "share": "Падзяліцца",
+ "share-url": "Падзяліцца спасылкай",
+ "single-day": "Адзін дзень",
+ "slug": "Slug",
+ "sms": "СМС",
+ "source": "Крыніца",
+ "sources": "Крыніцы",
+ "start-step": "Першы кроку",
+ "steps": "Крокі",
+ "sum": "Сума",
+ "support": "Падтрымка",
+ "switch-account": "Змяніць акаўнт",
+ "table": "Табліца",
+ "tablet": "Планшэт",
+ "tag": "Тэг",
+ "tags": "Тэгі",
+ "team": "Каманда",
+ "team-id": "Ідэнтыфікатар каманды",
+ "team-manager": "Кіраўнік каманды",
+ "team-member": "Удзельнік каманды",
+ "team-name": "Назва каманды",
+ "team-owner": "Уласнік каманды",
+ "team-settings": "Налады каманды",
+ "team-view-only": "Толькі для каманднага прагляду",
+ "team-websites": "Сайты каманды",
+ "teams": "Каманды",
+ "term": "Пошукавы запыт",
+ "terms": "Тэрміны",
+ "theme": "Тэма",
+ "this-month": "Гэты месяц",
+ "this-week": "Гэты тыдзень",
+ "this-year": "Гэты год",
+ "timezone": "Часавы пояс",
+ "title": "Загаловак",
+ "today": "Сёння",
+ "toggle-charts": "Пераключыць графікі",
+ "total": "Агульная колькасць",
+ "total-records": "Агульная колькасць запісаў",
+ "tracking-code": "Код адсочвання",
+ "traffic": "Трафік",
+ "transactions": "Транзакцыі",
+ "transfer": "Перадаць",
+ "transfer-website": "Перадаць сайт",
+ "true": "Ісціна",
+ "ttfb": "TTFB",
+ "type": "Тып",
+ "unique": "Унікальны",
+ "unique-events": "Унікальныя падзеі",
+ "unique-visitors": "Унікальныя наведвальнікі",
+ "uniqueCustomers": "Унікальныя кліенты",
+ "unknown": "Невядома",
+ "untitled": "Без назвы",
+ "update": "Абнавіць",
+ "url": "URL",
+ "user": "Карыстальнік",
+ "username": "Імя карыстальніка",
+ "users": "Карыстальнікі",
+ "utm": "UTM",
+ "utm-campaign": "UTM-кампанія",
+ "utm-content": "UTM-кантэнт",
+ "utm-description": "Сачыць за кампаніямі з дапамогай UTM-метак.",
+ "utm-medium": "UTM-канал",
+ "utm-source": "UTM-крыніца",
+ "utm-term": "UTM-запыт",
+ "value": "Значэнне",
+ "version": "Версія",
+ "view": "Паглядзець",
+ "view-details": "Паглядзець дэталі",
+ "view-only": "Толькі прагляд",
+ "views": "Прагляды",
+ "views-per-visit": "Прагляды за наведванне",
+ "visit-duration": "Сярэдняя даўжыня наведвання",
+ "visitors": "Наведвальнікі",
+ "visits": "Наведванні",
+ "website": "Сайт",
+ "website-id": "Ідэнтыфікатар сайта",
+ "websites": "Сайты",
+ "window": "Вакно",
+ "yesterday": "Учора"
+ },
+ "message": {
+ "action-confirmation": "Увядзіце {confirmation} у поле ніжэй, каб пацвердзіць.",
+ "active-users": "{x} цякучых {x, plural, one {наведвальнік} other {наведвальнікаў}}",
+ "bad-request": "Няправільны запыт",
+ "collected-data": "Сабраныя дадзеныя",
+ "confirm-delete": "Вы дакладна хочаце выдаліць {target}?",
+ "confirm-leave": "Вы дакладна хочаце пакінуць {target} ?",
+ "confirm-remove": "Вы дакладна хочаце выдаліць {target} ?",
+ "confirm-reset": "Вы дакладна хочаце скінуць {target} статыстыку?",
+ "delete-team-warning": "Выдаленне каманды таксама выдаліць усе сайты каманды.",
+ "delete-website-warning": "Усе асацыяваныя дадзеныя будуць таксама выдалены.",
+ "empty-dashboard": "Ваша панэль кіравання пустая. Націсніце Рэдагаваць, каб дадаць першы кампанент.",
+ "error": "Нешта пайшло не так.",
+ "event-log": "{event} на {url} ",
+ "forbidden": "Доступ забаронены",
+ "go-to-settings": "Да налад",
+ "incorrect-username-password": "Некарэктнае імя карыстальніка/пароль.",
+ "invalid-domain": "Некарэктны дамен",
+ "min-password-length": "Мінімальная даўжыня {n} знакаў",
+ "new-version-available": "Даступная новая версія Umami {version}!",
+ "no-data-available": "Няма дадзеных.",
+ "no-event-data": "Дадзеныя падзеі недаступныя.",
+ "no-match-password": "Паролі не супадаюць",
+ "no-results-found": "Вынікаў не знойдзена.",
+ "no-team-websites": "Гэтая каманда не мае ніводнага сайта.",
+ "no-teams": "Вы не стварылі ніводнай каманды.",
+ "no-users": "Няма карыстальнікаў.",
+ "no-websites-configured": "Вы не наладзілі ніводнага сайта.",
+ "not-found": "Не знойдзена",
+ "nothing-selected": "Нічога не абрана.",
+ "page-not-found": "Старонка не знойдзена.",
+ "reset-website": "Каб скінуць гэты сайт, увядзіце {confirmation} у поле ніжэй для пацверджання.",
+ "reset-website-warning": "Уся статыстыка для гэтага сайта будзе выдалена, але код адсочвання будзе працягваць працаваць.",
+ "saved": "Захавана паспяхова.",
+ "select-component-preview": "Выберыце кампанент для прагляду",
+ "select-website-first": "Спачатку выберыце сайт",
+ "sever-error": "Памылка сервера",
+ "share-url": "Гэта публічная спасылка для {target}.",
+ "team-already-member": "Вы ўжо ўдзельнік каманды.",
+ "team-not-found": "Каманда не знойдзена.",
+ "team-websites-info": "Сайты могуць быць праглядацца любым удзельнікам каманды.",
+ "tracking-code": "Код адсочвання",
+ "transfer-team-website-to-user": "Перадаць гэты сайт на ваш уліковы запіс?",
+ "transfer-user-website-to-team": "Выберыце каманду для перадачы гэтага сайта.",
+ "transfer-website": "Перадача сайта на ваш уліковы запіс або іншай камандзе.",
+ "triggered-event": "Падзея якая спрацавала",
+ "unauthorized": "Не аўтарызаваны",
+ "user-deleted": "Карыстальнік выдалены.",
+ "viewed-page": "Праглядзеў старонку",
+ "visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device} "
+ }
}
diff --git a/public/intl/messages/bg-BG.json b/public/intl/messages/bg-BG.json
index d81c4c69f..fa58a6878 100644
--- a/public/intl/messages/bg-BG.json
+++ b/public/intl/messages/bg-BG.json
@@ -1,1874 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Код за достъп"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Действия"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Активностти"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Добави"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Добави описание"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Добави член"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Добави стъпка"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Добави уебсайт"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Администратор"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "След"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Всички"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "За всички времена"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Анализи"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Средно"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Назад"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Преди"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Kоефициент на отказ"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Разбивка"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Браузър"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Браузъри"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Отмени"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Смени парола"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Градове"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Град"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Изчисти всички"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Потвърди"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Потвърди парола"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Съдържа"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Продължи"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Държави"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Държава"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Създай"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Създай отчет"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Създай екип"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Създай потребител"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Създадено"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Създадено от"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Текуща парола"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Обхват"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Табло"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Данни"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Дата"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Диапазон от дати"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Ден"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Диапазон от дати по подразбиране"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Изтрий"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Изтрий отчет"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Изтрий екип"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Изтрий потребител"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Изтрий уебсайт"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Описание"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Десктоп"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Детайли"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Устройство"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Устройства"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Отхвърли"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Не съдържа"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Домейн"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Отпадане"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Редактирай"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Редактирай табло"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Редактирай член"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Активирай Линк за споделяне"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Събитие"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Данни за събитие"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Събития"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Грешно"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Поле"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Полета"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Филтър"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Комбиниран"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Суров"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Филтри"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Фуния"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Разберете процента на конверсия и отпадане на потребителите."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "По-голямо от"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "По-голямо или равно на"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Изводи"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Навлезте по-дълбоко в данните си, като използвате сегменти и филтри."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Е"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Не е"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Не е зададено"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Зададено е"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Присъедини се"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Присъедини се към екип"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Език"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Езици"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Лаптоп"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Последните "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " дни"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Последните "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " часа"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Последните "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " месеца"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Напусни"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Напусни екип"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "По-малко от"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "По-малко или равно на"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Вход"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Изход"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Управлявай"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Максимум"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Член"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Членове"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Минимум"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Мобилен"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Още"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Моят акаунт"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Моите уебсайтове"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Име"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Нова парола"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Няма"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "един"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "други"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "Добре"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "ОС"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Общ преглед"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Собственик"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Страница "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " от "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Прегледи на страницата"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Заглавие на страница"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Страници"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Парола"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Поддържано от "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Профил"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Запитвания"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Запитване"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Параметри на търсене"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "В реално време"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Референт"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Референти"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Обнови"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Регенерирай"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Регион"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Региони"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Премахни"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Премахни член"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Отчети"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Задължително"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Нулирай"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Нулирай уебсайт"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Привързване"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Измерете привързаността към вашия уебсайт, като проследявате колко често потребителите се връщат."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Роля"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Изпълни запитване"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Запази"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Екрани"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Търсене"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Избери"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Избери дата"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Избери роля"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Избери уебсайт"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Сесии"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Настройки"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Сподели Линк"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Един ден"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Стъпки"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Сума"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Таблет"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Екип"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID на екип"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Член на екипа"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Име на екипа"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Собственик на екипа"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Видимо само за членове на екипа"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Уебсайтове на екипа"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Екипи"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Тема"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Този месец"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Тази седмица"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Тази година"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Часова зона"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Заглавие"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Днес"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Виж диаграми"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Общо"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Общо записи"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Код за проследяване"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Прехвърли"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Прехвърляне на уебсайт"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Вярно"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Вид"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Уникален"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Уникални посетители"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Неизвестен"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Без заглавие"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Актуализирай"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL адрес"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL адреси"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Потребител"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Потребителско име"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Потребители"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Следете кампаниите си чрез UTM параметри."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Стойност"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Преглед"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Преглед на детайлите"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Само за преглед"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Прегледи"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Прегледи на посещение"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Посетители"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Посещения"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Уебсайт"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Идентификатор на уебсайт"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Уебсайтове"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Прозорец"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Вчера"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Въведете "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " в полето по-долу, за да потвърдите."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "активен един"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "активни други"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Сигурни ли сте, че искате да изтриете "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Сигурни ли сте, че искате да напуснете "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Сигурни ли сте, че искате да премахнете "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Сигурни ли сте, че искате да нулирате "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Изтриването на екип ще изтрие и всички уебсайтове създадени от екипа."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Всички данни за уебсайта ще бъдат изтрити."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Възникна грешка."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Отидете в настройките"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Неправилно потребителско име и/или парола."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Невалиден домейн. Не включвайте http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Минимална дължина от "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " символа"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Има нова версия на Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Няма налични данни."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Няма налични данни за събитие."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Паролите не съвпадат."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Няма намерени резултати."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Този екип няма никакви уебсайтове."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Няма създадени екипи."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Няма потребители."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Нямате конфигурирани уебсайтове."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Страницата не е намерена"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "За да нулирате този уебсайт, въведете "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " в полето по-долу, за да потвърдите."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Всички статистически данни за този уебсайт ще бъдат изтрити, но вашите настройки ще останат непроменени."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Запазено."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Статистиката за вашия уебсайт е публично достъпна на следния URL адрес:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Вече сте член на екипа."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Екипът не е намерен."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Уебсайтовете могат да бъдат преглеждани от всеки член на екипа."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "За активирате проследяването на статистиката във вашият уебсайт, поставете следния код в секцията "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " намираща се в вашия HTML."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Искате да прехвърлите този уебсайт към вашия акаунт?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Изберете екипът на който да бъде прехвърлен уебсайта."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Прехвърли собствеността на уебсайта към вашия акаунт или към друг екип."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Активирано събитие"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Потребителят е изтрит."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Страницата е видяна"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Посетител от "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": ", използващ "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Спад на посетителите"
- }
- ]
+ "label": {
+ "access-code": "Код за достъп",
+ "account": "Акаунт",
+ "action": "Действие",
+ "actions": "Действия",
+ "activity": "Активностти",
+ "add": "Добави",
+ "add-board": "Добави дъска",
+ "add-description": "Добави описание",
+ "add-link": "Добави линк",
+ "add-member": "Добави член",
+ "add-pixel": "Добави пиксел",
+ "add-step": "Добави стъпка",
+ "add-website": "Добави уебсайт",
+ "admin": "Администратор",
+ "affiliate": "Партньор",
+ "after": "След",
+ "all": "Всички",
+ "all-time": "За всички времена",
+ "analysis": "Анализ",
+ "analytics": "Анализи",
+ "aov": "AOV",
+ "application": "Приложение",
+ "apply": "Приложи",
+ "arpu": "ARPU",
+ "attribution": "Атрибуция",
+ "attribution-description": "Вижте как потребителите взаимодействат с вашия маркетинг и какво води до конверсии.",
+ "audience": "Аудитория",
+ "average": "Средно",
+ "back": "Назад",
+ "before": "Преди",
+ "behavior": "Поведение",
+ "block-selector": "Избор на блок",
+ "boards": "Дъски",
+ "bounce-rate": "Kоефициент на отказ",
+ "breakdown": "Разбивка",
+ "browser": "Браузър",
+ "browsers": "Браузъри",
+ "campaign": "Кампания",
+ "campaigns": "Кампании",
+ "cancel": "Отмени",
+ "change-password": "Смени парола",
+ "channel": "Канал",
+ "channels": "Канали",
+ "chart": "Диаграма",
+ "cities": "Градове",
+ "city": "Град",
+ "clear-all": "Изчисти всички",
+ "cls": "CLS",
+ "cohort": "Кохорта",
+ "cohorts": "Кохорти",
+ "compare": "Сравни",
+ "compare-dates": "Сравни дати",
+ "confirm": "Потвърди",
+ "confirm-password": "Потвърди парола",
+ "contains": "Съдържа",
+ "content": "Съдържание",
+ "continue": "Продължи",
+ "conversion": "Конверсия",
+ "conversion-rate": "Процент на конверсия",
+ "conversion-step": "Стъпка на конверсия",
+ "count": "Брой",
+ "countries": "Държави",
+ "country": "Държава",
+ "create": "Създай",
+ "create-report": "Създай отчет",
+ "create-team": "Създай екип",
+ "create-user": "Създай потребител",
+ "created": "Създадено",
+ "created-by": "Създадено от",
+ "criteria": "Критерии",
+ "currency": "Валута",
+ "current": "Текущ",
+ "current-password": "Текуща парола",
+ "custom-range": "Обхват",
+ "dashboard": "Табло",
+ "data": "Данни",
+ "date": "Дата",
+ "date-range": "Диапазон от дати",
+ "day": "Ден",
+ "default-date-range": "Диапазон от дати по подразбиране",
+ "delete": "Изтрий",
+ "delete-report": "Изтрий отчет",
+ "delete-team": "Изтрий екип",
+ "delete-user": "Изтрий потребител",
+ "delete-website": "Изтрий уебсайт",
+ "description": "Описание",
+ "desktop": "Десктоп",
+ "destination-url": "URL на местоназначение",
+ "details": "Детайли",
+ "device": "Устройство",
+ "devices": "Устройства",
+ "direct": "Директно",
+ "dismiss": "Отхвърли",
+ "distinct-id": "Уникален ID",
+ "documentation": "Документация",
+ "does-not-contain": "Не съдържа",
+ "does-not-include": "Не включва",
+ "doest-not-exist": "Не съществува",
+ "domain": "Домейн",
+ "download": "Изтегляне",
+ "dropoff": "Отпадане",
+ "duration": "Продължителност",
+ "edit": "Редактирай",
+ "edit-member": "Редактирай член",
+ "email": "Имейл",
+ "enable-share-url": "Активирай Линк за споделяне",
+ "end-step": "Крайна стъпка",
+ "entry": "URL на вход",
+ "environment": "Среда",
+ "event": "Събитие",
+ "event-data": "Данни за събитие",
+ "event-name": "Име на събитие",
+ "events": "Събития",
+ "exclude-bounce": "Изключи отпадане",
+ "exists": "Съществува",
+ "exit": "URL за изход",
+ "false": "Грешно",
+ "fcp": "FCP",
+ "field": "Поле",
+ "fields": "Полета",
+ "filter": "Филтър",
+ "filter-combined": "Комбиниран",
+ "filter-raw": "Суров",
+ "filters": "Филтри",
+ "first-click": "Първо кликване",
+ "first-seen": "Първо видяно",
+ "funnel": "Фуния",
+ "funnel-description": "Разберете процента на конверсия и отпадане на потребителите.",
+ "funnels": "Фунии",
+ "goal": "Цел",
+ "goals": "Цели",
+ "goals-description": "Следете целите си за прегледи на страници и събития.",
+ "good": "Добро",
+ "greater-than": "По-голямо от",
+ "greater-than-equals": "По-голямо или равно на",
+ "grouped": "Групирано",
+ "growth": "Растеж",
+ "hostname": "Име на хост",
+ "hour": "Час",
+ "includes": "Включва",
+ "inp": "INP",
+ "insight": "Прозрение",
+ "insights": "Изводи",
+ "insights-description": "Навлезте по-дълбоко в данните си, като използвате сегменти и филтри.",
+ "invalid-url": "Невалиден URL",
+ "is": "Е",
+ "is-false": "Грешно",
+ "is-not": "Не е",
+ "is-not-set": "Не е зададено",
+ "is-set": "Зададено е",
+ "is-true": "Вярно",
+ "join": "Присъедини се",
+ "join-team": "Присъедини се към екип",
+ "journey": "Пътешествие",
+ "journey-description": "Разберете как потребителите навигират във вашия уебсайт.",
+ "journeys": "Пътешествия",
+ "language": "Език",
+ "languages": "Езици",
+ "laptop": "Лаптоп",
+ "last-click": "Последно кликване",
+ "last-days": "Последните {x} дни",
+ "last-hours": "Последните {x} часа",
+ "last-months": "Последните {x} месеца",
+ "last-seen": "Последно видяно",
+ "lcp": "LCP",
+ "leave": "Напусни",
+ "leave-team": "Напусни екип",
+ "less-than": "По-малко от",
+ "less-than-equals": "По-малко или равно на",
+ "link": "Линк",
+ "links": "Връзки",
+ "location": "Местоположение",
+ "login": "Вход",
+ "logout": "Изход",
+ "manage": "Управлявай",
+ "manager": "Мениджър",
+ "mask-level": "Ниво на маскиране",
+ "match": "Съвпадение",
+ "match-all": "Всички",
+ "match-any": "Някои",
+ "max": "Максимум",
+ "max-duration": "Максимална продължителност",
+ "maximize": "Разшири",
+ "medium": "Среден",
+ "member": "Член",
+ "members": "Членове",
+ "min": "Минимум",
+ "minute": "Минута",
+ "mobile": "Мобилен",
+ "model": "Модел",
+ "month": "Месец",
+ "more": "Още",
+ "my-account": "Моят акаунт",
+ "my-websites": "Моите уебсайтове",
+ "name": "Име",
+ "needs-improvement": "Нуждае се от подобрение",
+ "new-password": "Нова парола",
+ "none": "Няма",
+ "number-of-records": "{x} {x, plural, one {един} other {други}}",
+ "ok": "Добре",
+ "online": "Онлайн",
+ "organic-search": "Органично търсене",
+ "organic-shopping": "Органично пазаруване",
+ "organic-social": "Органични социални мрежи",
+ "organic-video": "Органично видео",
+ "os": "ОС",
+ "other": "Друго",
+ "overview": "Общ преглед",
+ "owner": "Собственик",
+ "page": "Страница",
+ "page-of": "Страница {current} от {total}",
+ "page-views": "Прегледи на страницата",
+ "pages": "Страници",
+ "pageTitle": "Заглавие на страница",
+ "paid-ads": "Платени реклами",
+ "paid-search": "Платено търсене",
+ "paid-shopping": "Платено пазаруване",
+ "paid-social": "Платени социални мрежи",
+ "paid-video": "Платено видео",
+ "password": "Парола",
+ "path": "Път",
+ "paths": "Пътища",
+ "performance": "Производителност",
+ "pixel": "Пиксел",
+ "pixels": "Пиксели",
+ "play": "Пусни",
+ "poor": "Слабо",
+ "powered-by": "Поддържано от {name}",
+ "preferences": "Предпочитания",
+ "previous": "Предишен",
+ "previous-period": "Предишен период",
+ "previous-year": "Предишна година",
+ "profile": "Профил",
+ "profiles": "Профили",
+ "properties": "Свойства",
+ "property": "Свойство",
+ "queries": "Запитвания",
+ "query": "Запитване",
+ "query-parameters": "Параметри на търсене",
+ "realtime": "В реално време",
+ "recorded": "Записано на",
+ "referral": "Реферал",
+ "referrer": "Референт",
+ "referrers": "Референти",
+ "refresh": "Обнови",
+ "regenerate": "Регенерирай",
+ "regex-match": "Съвпада с регулярен израз",
+ "regex-not-match": "Не съвпада с регулярен израз",
+ "region": "Регион",
+ "regions": "Региони",
+ "remaining": "Оставащи",
+ "remove": "Премахни",
+ "remove-member": "Премахни член",
+ "replay": "Повторение",
+ "replay-enabled": "Повторението е активирано",
+ "replay-id": "Replay ID",
+ "replays": "Повторения",
+ "reports": "Отчети",
+ "required": "Задължително",
+ "reset": "Нулирай",
+ "reset-website": "Нулирай уебсайт",
+ "retention": "Привързване",
+ "retention-days": "Дни на съхранение",
+ "retention-description": "Измерете привързаността към вашия уебсайт, като проследявате колко често потребителите се връщат.",
+ "revenue": "Приходи",
+ "revenue-description": "Прегледайте приходите си във времето.",
+ "role": "Роля",
+ "run-query": "Изпълни запитване",
+ "sample-rate": "Честота на извадката",
+ "sample-size": "Размер на извадката",
+ "save": "Запази",
+ "save-cohort": "Запази кохорта",
+ "save-segment": "Запази сегмент",
+ "screen": "Екран",
+ "screens": "Екрани",
+ "search": "Търсене",
+ "segment": "Сегмент",
+ "segments": "Сегменти",
+ "select": "Избери",
+ "select-component": "Изберете компонент",
+ "select-date": "Избери дата",
+ "select-filter": "Избери филтър",
+ "select-role": "Избери роля",
+ "select-website": "Избери уебсайт",
+ "session": "Сесия",
+ "session-data": "Данни за сесия",
+ "sessions": "Сесии",
+ "settings": "Настройки",
+ "share": "Сподели",
+ "share-url": "Сподели Линк",
+ "single-day": "Един ден",
+ "slug": "Slug",
+ "sms": "СМС",
+ "source": "Източник",
+ "sources": "Източници",
+ "start-step": "Начална стъпка",
+ "steps": "Стъпки",
+ "sum": "Сума",
+ "support": "Поддръжка",
+ "switch-account": "Смяна на акаунт",
+ "table": "Таблица",
+ "tablet": "Таблет",
+ "tag": "Етикет",
+ "tags": "Етикети",
+ "team": "Екип",
+ "team-id": "ID на екип",
+ "team-manager": "Мениджър на екип",
+ "team-member": "Член на екипа",
+ "team-name": "Име на екипа",
+ "team-owner": "Собственик на екипа",
+ "team-settings": "Настройки на екипа",
+ "team-view-only": "Видимо само за членове на екипа",
+ "team-websites": "Уебсайтове на екипа",
+ "teams": "Екипи",
+ "term": "Търсене",
+ "terms": "Термини",
+ "theme": "Тема",
+ "this-month": "Този месец",
+ "this-week": "Тази седмица",
+ "this-year": "Тази година",
+ "timezone": "Часова зона",
+ "title": "Заглавие",
+ "today": "Днес",
+ "toggle-charts": "Виж диаграми",
+ "total": "Общо",
+ "total-records": "Общо записи",
+ "tracking-code": "Код за проследяване",
+ "traffic": "Трафик",
+ "transactions": "Транзакции",
+ "transfer": "Прехвърли",
+ "transfer-website": "Прехвърляне на уебсайт",
+ "true": "Вярно",
+ "ttfb": "TTFB",
+ "type": "Вид",
+ "unique": "Уникален",
+ "unique-events": "Уникални събития",
+ "unique-visitors": "Уникални посетители",
+ "uniqueCustomers": "Уникални клиенти",
+ "unknown": "Неизвестен",
+ "untitled": "Без заглавие",
+ "update": "Актуализирай",
+ "url": "URL",
+ "user": "Потребител",
+ "username": "Потребителско име",
+ "users": "Потребители",
+ "utm": "UTM",
+ "utm-campaign": "UTM кампания",
+ "utm-content": "UTM съдържание",
+ "utm-description": "Следете кампаниите си чрез UTM параметри.",
+ "utm-medium": "UTM канал",
+ "utm-source": "UTM източник",
+ "utm-term": "UTM търсене",
+ "value": "Стойност",
+ "version": "Версия",
+ "view": "Преглед",
+ "view-details": "Преглед на детайлите",
+ "view-only": "Само за преглед",
+ "views": "Прегледи",
+ "views-per-visit": "Прегледи на посещение",
+ "visit-duration": "Продължителност на посещение",
+ "visitors": "Посетители",
+ "visits": "Посещения",
+ "website": "Уебсайт",
+ "website-id": "Идентификатор на уебсайт",
+ "websites": "Уебсайтове",
+ "window": "Прозорец",
+ "yesterday": "Вчера"
+ },
+ "message": {
+ "action-confirmation": "Въведете {confirmation} в полето по-долу, за да потвърдите.",
+ "active-users": "{x} {x, plural, one {активен един} other {активни други}}",
+ "bad-request": "Невалидна заявка",
+ "collected-data": "Събрани данни",
+ "confirm-delete": "Сигурни ли сте, че искате да изтриете {target}?",
+ "confirm-leave": "Сигурни ли сте, че искате да напуснете {target} ?",
+ "confirm-remove": "Сигурни ли сте, че искате да премахнете {target} ?",
+ "confirm-reset": "Сигурни ли сте, че искате да нулирате {target}?",
+ "delete-team-warning": "Изтриването на екип ще изтрие и всички уебсайтове създадени от екипа.",
+ "delete-website-warning": "Всички данни за уебсайта ще бъдат изтрити.",
+ "empty-dashboard": "Вашето табло е празно. Щракнете Редактиране, за да добавите първия си компонент.",
+ "error": "Възникна грешка.",
+ "event-log": "{event} на {url} ",
+ "forbidden": "Забранено",
+ "go-to-settings": "Отидете в настройките",
+ "incorrect-username-password": "Неправилно потребителско име и/или парола.",
+ "invalid-domain": "Невалиден домейн. Не включвайте http/https.",
+ "min-password-length": "Минимална дължина от {n} символа",
+ "new-version-available": "Има нова версия на Umami {version}!",
+ "no-data-available": "Няма налични данни.",
+ "no-event-data": "Няма налични данни за събитие.",
+ "no-match-password": "Паролите не съвпадат.",
+ "no-results-found": "Няма намерени резултати.",
+ "no-team-websites": "Този екип няма никакви уебсайтове.",
+ "no-teams": "Няма създадени екипи.",
+ "no-users": "Няма потребители.",
+ "no-websites-configured": "Нямате конфигурирани уебсайтове.",
+ "not-found": "Не е намерено",
+ "nothing-selected": "Няма избрано.",
+ "page-not-found": "Страницата не е намерена",
+ "reset-website": "За да нулирате този уебсайт, въведете {confirmation} в полето по-долу, за да потвърдите.",
+ "reset-website-warning": "Всички статистически данни за този уебсайт ще бъдат изтрити, но вашите настройки ще останат непроменени.",
+ "saved": "Запазено.",
+ "select-component-preview": "Изберете компонент за преглед",
+ "select-website-first": "Първо изберете уебсайт",
+ "sever-error": "Сървърна грешка",
+ "share-url": "Статистиката за вашия уебсайт е публично достъпна на следния URL адрес:",
+ "team-already-member": "Вече сте член на екипа.",
+ "team-not-found": "Екипът не е намерен.",
+ "team-websites-info": "Уебсайтовете могат да бъдат преглеждани от всеки член на екипа.",
+ "tracking-code": "За активирате проследяването на статистиката във вашият уебсайт, поставете следния код в секцията ... намираща се в вашия HTML.",
+ "transfer-team-website-to-user": "Искате да прехвърлите този уебсайт към вашия акаунт?",
+ "transfer-user-website-to-team": "Изберете екипът на който да бъде прехвърлен уебсайта.",
+ "transfer-website": "Прехвърли собствеността на уебсайта към вашия акаунт или към друг екип.",
+ "triggered-event": "Активирано събитие",
+ "unauthorized": "Неоторизиран достъп",
+ "user-deleted": "Потребителят е изтрит.",
+ "viewed-page": "Страницата е видяна",
+ "visitor-log": "Посетител от {country} , използващ {browser} на {os} {device} "
+ }
}
diff --git a/public/intl/messages/bn-BD.json b/public/intl/messages/bn-BD.json
index a50db6226..85c33ea21 100644
--- a/public/intl/messages/bn-BD.json
+++ b/public/intl/messages/bn-BD.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "এক্সেস কোড"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "অ্যাকশনস"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "একটিভিটি দেখুন"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "যুক্ত করুন"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "বর্ননা যোগ করুন"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "সদস্য যোগ করুন"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "পদ যোগ করুন"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "ওয়েবসাইট যুক্ত করুন"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "অ্যাডমিন"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "পরে"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "সবগুলো"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "সব সময়"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "পেছনে"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "পূর্বে"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "উপরে উঠার হার"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "ভাঙ্গন"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "ব্রাউজার"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "ব্রাউজার সমূহ"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "বাতিল"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "পাসওয়ার্ড পরিবর্তন করুন"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "শহরসমূহ"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "শহর"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "সব মুছে ফেলুন"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "নিশ্চিত করুন"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "পাসওয়ার্ড নিশ্চিত করুন"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "রয়েছে"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "পরবর্তিতে"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "দেশসমূহ"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "দেশ"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "তৈরি করুন"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "রিপোর্ট তৈরি করুন"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "দল তৈরি করুন"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "ব্যবহারকারী তৈরি করুন"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "তৈরি করা হয়েছে"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "বর্তমান পাসওয়ার্ড"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "কাস্টম রেঞ্জ"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "ড্যাশবোর্ড"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "তারিখের পরিসীমা"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "ডিফল্ট তারিখের পরিসীমা"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "মুছে ফেলুন"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "ওয়েবসাইট মুছুন"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "ডেস্কটপ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "ডিভাইস গুলো"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "বাতিল"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "ডোমেইন"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "সম্পাদনা করুন"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "শেয়ার ইউআরএল শেয়ার করুন"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "ঘটনা"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "সম্মিলিত"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "অপরিশোধিত"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "ভাষা"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "ভাষা"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "ল্যাপটপ"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "শেষ "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " দিন"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "শেষ "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ঘন্টা"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "লগিন"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "লগ আউট"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "মুঠোফোন"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "আরও"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "নাম"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "নতুন পাসওয়ার্ড"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "কিছুই না"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "মালিক"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "পৃষ্ঠা পরিদর্শন গুলো"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "পৃষ্ঠাগুলি"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "পাসওয়ার্ড"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " দ্বারা চালিত"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "প্রোফাইল"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "সরাসরি"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "রেফারার্স"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "রিফ্রেশ"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "প্রয়োজনীয়"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "রিসেট"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "ওয়েবসাইট রিসেট করুন"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "সংরক্ষণ"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "স্ক্রিনগুলি"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "সেটিংস"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "ইউআরএল শেয়ার করুন"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "একদিন"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "ট্যাবলেট"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "থিম"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "এই মাস"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "এই সপ্তাহ"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "এই বছর"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "সময়স্থান"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "আজ"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "চার্ট পরিবর্তন করুন"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "ট্র্যাকিং কোড"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "অনন্য ভিজিটর"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "অজানা"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "ব্যবহারকারীর নাম"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "বিস্তারিত দেখুন"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "ভিউস"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "গড় পরিদর্শনের সময়"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "পরিদর্শনার্থী"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "সবগুলো ওয়েবসাইট"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " বর্তমান "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitor"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitors"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "আপনি কি নিশ্চিত যে আপনি "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " মুছতে চান?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "আপনি কি নিশ্চিত যে আপনি "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " এর পরিসংখ্যান পুনরায় সেট করতে চান?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "সমস্ত সম্পর্কিত ডেটা পাশাপাশি মুছে ফেলা হবে।"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "কিছু ভুল হয়েছে।"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "সেটিংস এ যান"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "ভুল ডোমেন"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "কোন তথ্য নেই।"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "পাসওয়ার্ড মেলে না"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "কোনও ওয়েবসাইট কনফিগার করা নেই।"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "পৃষ্ঠা খুঁজে পাওয়া যায়নি।"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "এই ওয়েবসাইটের সমস্ত পরিসংখ্যান মুছে ফেলা হবে, তবে আপনার ট্র্যাকিং কোডটি অক্ষত থাকবে।"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "সংরক্ষিত হয়েছে।"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "এটি "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " এর জন্য প্রকাশ্যে শেয়ার করার ইউআরএল।"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "ট্র্যাকিং কোড"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " থেকে একজন ভিসিটর "
- },
- {
- "type": 1,
- "value": "ব্রাউজার"
- },
- {
- "type": 0,
- "value": ", ব্যবহার করছেন "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " এর মধ্যে।"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "এক্সেস কোড",
+ "account": "অ্যাকাউন্ট",
+ "action": "কার্যক্রম",
+ "actions": "অ্যাকশনস",
+ "activity": "একটিভিটি দেখুন",
+ "add": "যুক্ত করুন",
+ "add-board": "বোর্ড যুক্ত করুন",
+ "add-description": "বর্ননা যোগ করুন",
+ "add-link": "লিংক যোগ করুন",
+ "add-member": "সদস্য যোগ করুন",
+ "add-pixel": "পিক্সেল যোগ করুন",
+ "add-step": "পদ যোগ করুন",
+ "add-website": "ওয়েবসাইট যুক্ত করুন",
+ "admin": "অ্যাডমিন",
+ "affiliate": "সহযোগী",
+ "after": "পরে",
+ "all": "সবগুলো",
+ "all-time": "সব সময়",
+ "analysis": "বিশ্লেষণ",
+ "analytics": "বিশ্লেষণ",
+ "aov": "AOV",
+ "application": "অ্যাপ্লিকেশন",
+ "apply": "প্রয়োগ করুন",
+ "arpu": "ARPU",
+ "attribution": "অ্যাট্রিবিউশন",
+ "attribution-description": "দেখুন ব্যবহারকারীরা কীভাবে আপনার মার্কেটিংয়ের সাথে যুক্ত হয় এবং কীভাবে রূপান্তর ঘটে।",
+ "audience": "দর্শক",
+ "average": "গড়",
+ "back": "পেছনে",
+ "before": "পূর্বে",
+ "behavior": "আচরণ",
+ "block-selector": "ব্লক নির্বাচক",
+ "boards": "বোর্ডসমূহ",
+ "bounce-rate": "উপরে উঠার হার",
+ "breakdown": "ভাঙ্গন",
+ "browser": "ব্রাউজার",
+ "browsers": "ব্রাউজার সমূহ",
+ "campaign": "প্রচারণা",
+ "campaigns": "প্রচারণা",
+ "cancel": "বাতিল",
+ "change-password": "পাসওয়ার্ড পরিবর্তন করুন",
+ "channel": "চ্যানেল",
+ "channels": "চ্যানেলসমূহ",
+ "chart": "চার্ট",
+ "cities": "শহরসমূহ",
+ "city": "শহর",
+ "clear-all": "সব মুছে ফেলুন",
+ "cls": "CLS",
+ "cohort": "কোহর্ট",
+ "cohorts": "কোহর্ট",
+ "compare": "তুলনা করুন",
+ "compare-dates": "তারিখ তুলনা করুন",
+ "confirm": "নিশ্চিত করুন",
+ "confirm-password": "পাসওয়ার্ড নিশ্চিত করুন",
+ "contains": "রয়েছে",
+ "content": "বিষয়বস্তু",
+ "continue": "পরবর্তিতে",
+ "conversion": "রূপান্তর",
+ "conversion-rate": "রূপান্তর হার",
+ "conversion-step": "রূপান্তর ধাপ",
+ "count": "গণনা",
+ "countries": "দেশসমূহ",
+ "country": "দেশ",
+ "create": "তৈরি করুন",
+ "create-report": "রিপোর্ট তৈরি করুন",
+ "create-team": "দল তৈরি করুন",
+ "create-user": "ব্যবহারকারী তৈরি করুন",
+ "created": "তৈরি করা হয়েছে",
+ "created-by": "তৈরি করেছেন",
+ "criteria": "মানদণ্ড",
+ "currency": "মুদ্রা",
+ "current": "বর্তমান",
+ "current-password": "বর্তমান পাসওয়ার্ড",
+ "custom-range": "কাস্টম রেঞ্জ",
+ "dashboard": "ড্যাশবোর্ড",
+ "data": "ডেটা",
+ "date": "তারিখ",
+ "date-range": "তারিখের পরিসীমা",
+ "day": "দিন",
+ "default-date-range": "ডিফল্ট তারিখের পরিসীমা",
+ "delete": "মুছে ফেলুন",
+ "delete-report": "রিপোর্ট মুছুন",
+ "delete-team": "দল মুছুন",
+ "delete-user": "ব্যবহারকারী মুছুন",
+ "delete-website": "ওয়েবসাইট মুছুন",
+ "description": "বর্ণনা",
+ "desktop": "ডেস্কটপ",
+ "destination-url": "গন্তব্য URL",
+ "details": "বিস্তারিত",
+ "device": "ডিভাইস",
+ "devices": "ডিভাইস গুলো",
+ "direct": "সরাসরি",
+ "dismiss": "বাতিল",
+ "distinct-id": "স্বতন্ত্র আইডি",
+ "documentation": "ডকুমেন্টেশন",
+ "does-not-contain": "ধারণ করে না",
+ "does-not-include": "অন্তর্ভুক্ত নয়",
+ "doest-not-exist": "অস্তিত্ব নেই",
+ "domain": "ডোমেইন",
+ "download": "ডাউনলোড",
+ "dropoff": "ছেড়ে যাওয়া",
+ "duration": "সময়কাল",
+ "edit": "সম্পাদনা করুন",
+ "edit-member": "সদস্য সম্পাদনা করুন",
+ "email": "ইমেইল",
+ "enable-share-url": "শেয়ার ইউআরএল শেয়ার করুন",
+ "end-step": "শেষ ধাপ",
+ "entry": "প্রবেশ URL",
+ "environment": "পরিবেশ",
+ "event": "ইভেন্ট",
+ "event-data": "ইভেন্ট ডেটা",
+ "event-name": "ইভেন্টের নাম",
+ "events": "ঘটনা",
+ "exclude-bounce": "বাউন্স বাদ দিন",
+ "exists": "অস্তিত্ব আছে",
+ "exit": "প্রস্থান URL",
+ "false": "মিথ্যা",
+ "fcp": "FCP",
+ "field": "ক্ষেত্র",
+ "fields": "ক্ষেত্রসমূহ",
+ "filter": "ফিল্টার",
+ "filter-combined": "সম্মিলিত",
+ "filter-raw": "অপরিশোধিত",
+ "filters": "ফিল্টারসমূহ",
+ "first-click": "প্রথম ক্লিক",
+ "first-seen": "প্রথম দেখা",
+ "funnel": "ফানেল",
+ "funnel-description": "ব্যবহারকারীদের রূপান্তর ও ছেড়ে যাওয়ার হার বুঝুন।",
+ "funnels": "ফানেলসমূহ",
+ "goal": "লক্ষ্য",
+ "goals": "লক্ষ্যসমূহ",
+ "goals-description": "পৃষ্ঠাদর্শন ও ইভেন্টের লক্ষ্য ট্র্যাক করুন।",
+ "good": "ভালো",
+ "greater-than": "এর চেয়ে বেশি",
+ "greater-than-equals": "এর চেয়ে বেশি বা সমান",
+ "grouped": "গ্রুপ করা",
+ "growth": "বৃদ্ধি",
+ "hostname": "হোস্টনেম",
+ "hour": "ঘণ্টা",
+ "includes": "অন্তর্ভুক্ত",
+ "inp": "INP",
+ "insight": "অন্তর্দৃষ্টি",
+ "insights": "অন্তর্দৃষ্টি",
+ "insights-description": "সেগমেন্ট এবং ফিল্টার ব্যবহার করে আপনার ডেটায় আরও গভীরে যান।",
+ "invalid-url": "অবৈধ URL",
+ "is": "হয়",
+ "is-false": "মিথ্যা",
+ "is-not": "নয়",
+ "is-not-set": "নির্ধারিত নয়",
+ "is-set": "নির্ধারিত",
+ "is-true": "সত্য",
+ "join": "যোগ দিন",
+ "join-team": "দলে যোগ দিন",
+ "journey": "যাত্রা",
+ "journey-description": "ব্যবহারকারীরা কীভাবে আপনার ওয়েবসাইটে নেভিগেট করে তা বুঝুন।",
+ "journeys": "যাত্রাসমূহ",
+ "language": "ভাষা",
+ "languages": "ভাষা",
+ "laptop": "ল্যাপটপ",
+ "last-click": "শেষ ক্লিক",
+ "last-days": "শেষ {x} দিন",
+ "last-hours": "শেষ {x} ঘন্টা",
+ "last-months": "শেষ {x} মাস",
+ "last-seen": "শেষ দেখা",
+ "lcp": "LCP",
+ "leave": "ত্যাগ করুন",
+ "leave-team": "দল ত্যাগ করুন",
+ "less-than": "এর চেয়ে কম",
+ "less-than-equals": "এর চেয়ে কম বা সমান",
+ "link": "লিংক",
+ "links": "লিঙ্কসমূহ",
+ "location": "অবস্থান",
+ "login": "লগিন",
+ "logout": "লগ আউট",
+ "manage": "পরিচালনা করুন",
+ "manager": "পরিচালক",
+ "mask-level": "মাস্ক স্তর",
+ "match": "মিলান",
+ "match-all": "সব",
+ "match-any": "যেকোনো",
+ "max": "সর্বাধিক",
+ "max-duration": "সর্বোচ্চ সময়কাল",
+ "maximize": "বিস্তৃত করুন",
+ "medium": "মাঝারি",
+ "member": "সদস্য",
+ "members": "সদস্যগণ",
+ "min": "সর্বনিম্ন",
+ "minute": "মিনিট",
+ "mobile": "মুঠোফোন",
+ "model": "মডেল",
+ "month": "মাস",
+ "more": "আরও",
+ "my-account": "আমার অ্যাকাউন্ট",
+ "my-websites": "আমার ওয়েবসাইটসমূহ",
+ "name": "নাম",
+ "needs-improvement": "উন্নতি প্রয়োজন",
+ "new-password": "নতুন পাসওয়ার্ড",
+ "none": "কিছুই না",
+ "number-of-records": "{x} {x, plural, one {রেকর্ড} other {রেকর্ড}}",
+ "ok": "ঠিক আছে",
+ "online": "অনলাইন",
+ "organic-search": "অর্গানিক সার্চ",
+ "organic-shopping": "অর্গানিক শপিং",
+ "organic-social": "অর্গানিক সোশ্যাল",
+ "organic-video": "অর্গানিক ভিডিও",
+ "os": "ওএস",
+ "other": "অন্যান্য",
+ "overview": "সংক্ষিপ্ত বিবরণ",
+ "owner": "মালিক",
+ "page": "পৃষ্ঠা",
+ "page-of": "পৃষ্ঠা {current} / {total}",
+ "page-views": "পৃষ্ঠা পরিদর্শন গুলো",
+ "pages": "পৃষ্ঠাগুলি",
+ "pageTitle": "পৃষ্ঠার শিরোনাম",
+ "paid-ads": "পেইড বিজ্ঞাপন",
+ "paid-search": "পেইড সার্চ",
+ "paid-shopping": "পেইড শপিং",
+ "paid-social": "পেইড সোশ্যাল",
+ "paid-video": "পেইড ভিডিও",
+ "password": "পাসওয়ার্ড",
+ "path": "পথ",
+ "paths": "পথসমূহ",
+ "performance": "পারফরম্যান্স",
+ "pixel": "পিক্সেল",
+ "pixels": "পিক্সেল",
+ "play": "চালান",
+ "poor": "খারাপ",
+ "powered-by": "{name} দ্বারা চালিত",
+ "preferences": "পছন্দসমূহ",
+ "previous": "পূর্ববর্তী",
+ "previous-period": "পূর্ববর্তী সময়কাল",
+ "previous-year": "গত বছর",
+ "profile": "প্রোফাইল",
+ "profiles": "প্রোফাইল",
+ "properties": "বৈশিষ্ট্যসমূহ",
+ "property": "বৈশিষ্ট্য",
+ "queries": "কোয়েরি",
+ "query": "কোয়েরি",
+ "query-parameters": "কোয়েরি প্যারামিটার",
+ "realtime": "সরাসরি",
+ "recorded": "রেকর্ড করা হয়েছে",
+ "referral": "রেফারেল",
+ "referrer": "রেফারার",
+ "referrers": "রেফারার্স",
+ "refresh": "রিফ্রেশ",
+ "regenerate": "পুনরায় তৈরি",
+ "regex-match": "রেজেক্সের সাথে মেলে",
+ "regex-not-match": "রেজেক্সের সাথে মেলে না",
+ "region": "অঞ্চল",
+ "regions": "অঞ্চলসমূহ",
+ "remaining": "বাকি আছে",
+ "remove": "সরান",
+ "remove-member": "সদস্য সরান",
+ "replay": "রিপ্লে",
+ "replay-enabled": "রিপ্লে সক্রিয়",
+ "replay-id": "Replay ID",
+ "replays": "রিপ্লেসমূহ",
+ "reports": "রিপোর্ট",
+ "required": "প্রয়োজনীয়",
+ "reset": "রিসেট",
+ "reset-website": "ওয়েবসাইট রিসেট করুন",
+ "retention": "ধরে রাখা",
+ "retention-days": "ধারণ দিন",
+ "retention-description": "ব্যবহারকারীরা কতবার ফিরে আসে তা ট্র্যাক করে আপনার ওয়েবসাইটের আঠালোতা পরিমাপ করুন।",
+ "revenue": "আয়",
+ "revenue-description": "সময়ের সাথে সাথে আপনার আয় দেখুন।",
+ "role": "ভূমিকা",
+ "run-query": "কোয়েরি চালান",
+ "sample-rate": "নমুনার হার",
+ "sample-size": "নমুনার আকার",
+ "save": "সংরক্ষণ",
+ "save-cohort": "কোহর্ট সংরক্ষণ করুন",
+ "save-segment": "সেগমেন্ট সংরক্ষণ করুন",
+ "screen": "স্ক্রিন",
+ "screens": "স্ক্রিনগুলি",
+ "search": "অনুসন্ধান",
+ "segment": "সেগমেন্ট",
+ "segments": "সেগমেন্ট",
+ "select": "নির্বাচন করুন",
+ "select-component": "উপাদান নির্বাচন করুন",
+ "select-date": "তারিখ নির্বাচন করুন",
+ "select-filter": "ফিল্টার নির্বাচন করুন",
+ "select-role": "ভূমিকা নির্বাচন করুন",
+ "select-website": "ওয়েবসাইট নির্বাচন করুন",
+ "session": "সেশন",
+ "session-data": "সেশন ডেটা",
+ "sessions": "সেশন",
+ "settings": "সেটিংস",
+ "share": "শেয়ার করুন",
+ "share-url": "এটি {target} এর জন্য প্রকাশ্যে শেয়ার করার ইউআরএল।",
+ "single-day": "একদিন",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "উৎস",
+ "sources": "উৎসসমূহ",
+ "start-step": "প্রারম্ভিক ধাপ",
+ "steps": "ধাপসমূহ",
+ "sum": "যোগফল",
+ "support": "সহায়তা",
+ "switch-account": "অ্যাকাউন্ট পরিবর্তন",
+ "table": "টেবিল",
+ "tablet": "ট্যাবলেট",
+ "tag": "ট্যাগ",
+ "tags": "ট্যাগসমূহ",
+ "team": "দল",
+ "team-id": "দল আইডি",
+ "team-manager": "দল ব্যবস্থাপক",
+ "team-member": "দলের সদস্য",
+ "team-name": "দলের নাম",
+ "team-owner": "দলের মালিক",
+ "team-settings": "দলের সেটিংস",
+ "team-view-only": "শুধু টিম দেখুন",
+ "team-websites": "টিম ওয়েবসাইট",
+ "teams": "টিম",
+ "term": "অনুসন্ধান শব্দ",
+ "terms": "শর্তাবলী",
+ "theme": "থিম",
+ "this-month": "এই মাস",
+ "this-week": "এই সপ্তাহ",
+ "this-year": "এই বছর",
+ "timezone": "সময়স্থান",
+ "title": "শিরোনাম",
+ "today": "আজ",
+ "toggle-charts": "চার্ট পরিবর্তন করুন",
+ "total": "মোট",
+ "total-records": "মোট রেকর্ড",
+ "tracking-code": "ট্র্যাকিং কোড",
+ "traffic": "ট্রাফিক",
+ "transactions": "লেনদেন",
+ "transfer": "স্থানান্তর",
+ "transfer-website": "ওয়েবসাইট স্থানান্তর",
+ "true": "সত্য",
+ "ttfb": "TTFB",
+ "type": "ধরন",
+ "unique": "অনন্য",
+ "unique-events": "অনন্য ইভেন্ট",
+ "unique-visitors": "অনন্য ভিজিটর",
+ "uniqueCustomers": "অনন্য গ্রাহক",
+ "unknown": "অজানা",
+ "untitled": "শিরোনামহীন",
+ "update": "আপডেট",
+ "url": "URL",
+ "user": "ব্যবহারকারী",
+ "username": "ব্যবহারকারীর নাম",
+ "users": "ব্যবহারকারীগণ",
+ "utm": "UTM",
+ "utm-campaign": "UTM প্রচারণা",
+ "utm-content": "UTM বিষয়বস্তু",
+ "utm-description": "UTM প্যারামিটারের মাধ্যমে আপনার প্রচারণা ট্র্যাক করুন।",
+ "utm-medium": "UTM মাধ্যম",
+ "utm-source": "UTM উৎস",
+ "utm-term": "UTM শব্দ",
+ "value": "মান",
+ "version": "সংস্করণ",
+ "view": "দেখুন",
+ "view-details": "বিস্তারিত দেখুন",
+ "view-only": "শুধু দেখুন",
+ "views": "ভিউস",
+ "views-per-visit": "প্রতি ভিজিটে দেখা",
+ "visit-duration": "গড় পরিদর্শনের সময়",
+ "visitors": "পরিদর্শনার্থী",
+ "visits": "ভিজিট",
+ "website": "ওয়েবসাইট",
+ "website-id": "ওয়েবসাইট ID",
+ "websites": "সবগুলো ওয়েবসাইট",
+ "window": "উইন্ডো",
+ "yesterday": "গতকাল"
+ },
+ "message": {
+ "action-confirmation": "নিশ্চিত করতে নিচের বক্সে {confirmation} টাইপ করুন।",
+ "active-users": "{x} বর্তমান {x, plural, one {visitor} other {visitors}}",
+ "bad-request": "অবৈধ অনুরোধ",
+ "collected-data": "সংগৃহীত ডেটা",
+ "confirm-delete": "আপনি কি নিশ্চিত যে আপনি {target} মুছতে চান?",
+ "confirm-leave": "আপনি কি নিশ্চিত যে আপনি {target} ত্যাগ করতে চান?",
+ "confirm-remove": "আপনি কি নিশ্চিত যে আপনি {target} সরাতে চান?",
+ "confirm-reset": "আপনি কি নিশ্চিত যে আপনি {target} এর পরিসংখ্যান পুনরায় সেট করতে চান?",
+ "delete-team-warning": "একটি টিম মুছে ফেললে টিমের সব ওয়েবসাইটও মুছে যাবে।",
+ "delete-website-warning": "সমস্ত সম্পর্কিত ডেটা পাশাপাশি মুছে ফেলা হবে।",
+ "empty-dashboard": "আপনার ড্যাশবোর্ড খালি। প্রথম উপাদান যোগ করতে সম্পাদনা ক্লিক করুন।",
+ "error": "কিছু ভুল হয়েছে।",
+ "event-log": "{url} -এ {event} ",
+ "forbidden": "নিষিদ্ধ",
+ "go-to-settings": "সেটিংস এ যান",
+ "incorrect-username-password": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।",
+ "invalid-domain": "ভুল ডোমেন",
+ "min-password-length": "সর্বনিম্ন {n} অক্ষর",
+ "new-version-available": "Umami {version}-এর নতুন সংস্করণ পাওয়া যাচ্ছে!",
+ "no-data-available": "কোন তথ্য নেই।",
+ "no-event-data": "কোনো ইভেন্ট ডেটা পাওয়া যায়নি।",
+ "no-match-password": "পাসওয়ার্ড মেলে না",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "এই টিমের কোনো ওয়েবসাইট নেই।",
+ "no-teams": "আপনি কোনো টিম তৈরি করেননি।",
+ "no-users": "কোনো ব্যবহারকারী নেই।",
+ "no-websites-configured": "কোনও ওয়েবসাইট কনফিগার করা নেই।",
+ "not-found": "পাওয়া যায়নি",
+ "nothing-selected": "কিছু নির্বাচন করা হয়নি।",
+ "page-not-found": "পৃষ্ঠা খুঁজে পাওয়া যায়নি।",
+ "reset-website": "এই ওয়েবসাইট রিসেট করতে, নিচের বক্সে {confirmation} টাইপ করুন।",
+ "reset-website-warning": "এই ওয়েবসাইটের সমস্ত পরিসংখ্যান মুছে ফেলা হবে, তবে আপনার ট্র্যাকিং কোডটি অক্ষত থাকবে।",
+ "saved": "সংরক্ষিত হয়েছে।",
+ "select-component-preview": "প্রিভিউয়ের জন্য একটি উপাদান নির্বাচন করুন",
+ "select-website-first": "প্রথমে একটি ওয়েবসাইট নির্বাচন করুন",
+ "sever-error": "সার্ভার ত্রুটি",
+ "share-url": "এটি {target} এর জন্য প্রকাশ্যে শেয়ার করার ইউআরএল।",
+ "team-already-member": "আপনি ইতিমধ্যে টিমের সদস্য।",
+ "team-not-found": "টিম পাওয়া যায়নি।",
+ "team-websites-info": "ওয়েবসাইটগুলি টিমের যে কেউ দেখতে পারেন।",
+ "tracking-code": "ট্র্যাকিং কোড",
+ "transfer-team-website-to-user": "এই ওয়েবসাইটটি আপনার অ্যাকাউন্টে স্থানান্তর করবেন?",
+ "transfer-user-website-to-team": "এই ওয়েবসাইটটি স্থানান্তর করার জন্য টিম নির্বাচন করুন।",
+ "transfer-website": "ওয়েবসাইটের মালিকানা আপনার অ্যাকাউন্টে বা অন্য টিমে স্থানান্তর করুন।",
+ "triggered-event": "ট্রিগার করা ইভেন্ট",
+ "unauthorized": "অননুমোদিত",
+ "user-deleted": "ব্যবহারকারী মুছে ফেলা হয়েছে।",
+ "viewed-page": "দেখা পৃষ্ঠা",
+ "visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।"
+ }
}
diff --git a/public/intl/messages/bs-BA.json b/public/intl/messages/bs-BA.json
index 71d870e25..7a42b4e08 100644
--- a/public/intl/messages/bs-BA.json
+++ b/public/intl/messages/bs-BA.json
@@ -1,1874 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Pristupni kod"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Akcije"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Log aktivnosti"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Dodaj"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Dodaj opis"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Dodaj člana"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Dodaj korak"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Dodaj web stranicu"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Nakon"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Sve"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Cijelo vrijeme"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analitike"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Prosjek"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Nazad"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Prije"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Pregled po kategorijama"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browseri"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Otkaži"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Promijeni šifru"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Gradovi"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Grad"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Očisti sve"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Potvrdi"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potvrdi šifru"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Sadrži"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Nastavi"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Zemlje"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Zemlja"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Kreiraj"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Kreiraj izvještaj"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Kreiraj tim"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Kreiraj korisnika"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Kreiraj"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Kreirao"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Trenutna šifra"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Proizvoljni raspon"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dashboard"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Podaci"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datumski raspon"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dan"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Defaultni datumski raspon"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Izbriši"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Izbriši report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Izbriši tim"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Izbriši korisnika"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Izbriši web stranicu"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Opis"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalji"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Uređaj"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Uređaji"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Odbaci"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Ne sadrži"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domena"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Uredi"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Uredi dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Uredi člana"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Omogući URL za dijeljenje"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Događaj"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Podaci o događaju"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Događaji"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Ne"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Polje"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Polja"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinovano"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Sirovo"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtri"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Lijevak"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Razumite koverziju i drop-off učestalost korisnika."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Veće od"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Veće od ili jednako"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Uvidi"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Zaronite dublje u vaše podatke korištenjem segmenata i filtera"
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Jeste"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Nije"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Nije setano"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Jeste setano"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Učlani se"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Učlani se u tim"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Jezik"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Jezici"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dana"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " sati"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " mjeseci"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Napusti"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Napusti tim"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Manje od"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Manje od ili jednako"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Login"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logout"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Član"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Članovi"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Više"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Moj račun"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Moje web stranice"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Ime"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nova šifra"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Pregled"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Vlasnik"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Strana "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " od "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Pregleda stranica"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Naslov stranice"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Stranice"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Šifra"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Omogućeno s "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queryji"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parametri"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realno vrijeme"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresh"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regeneriši"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regioni"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Ukloni"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Ukloni člana"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Izvještaji"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Required"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Resetuj"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Resetuj web stranicu"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Izmjeri 'ljepljivost' svoje web stranice praćenjem koliko često set korisnici vraćaju."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rola"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Pokreni query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Sačuvaj"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Ekrani"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Traži"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Odaberi"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Odaberi datum"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Odaberi rolu"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Odaberi web stranicu"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesije"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Postavke"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Share URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Jedan dan"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Koraci"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Tim"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Tim ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Član tima"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Naziv tima"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Vlasnik tima"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Samo tim može vidjeti"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Timske web stranice"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Timovi"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Teme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Ovaj mjesec"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Ova sedmica"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Ova godina"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Vremenska zona"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Naslov"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Danas"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Uklj/isklj grafikone"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Ukupno"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Ukupno redova"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Kod za praćenje"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer web stranice"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Da"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tip"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Jedinstveno"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Jedinstvenih posjetitelja"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Nepoznato"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Bezimeno"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Korisnik"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Korisničko ime"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Korisnici"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Pratite vaše kampanje kroz UTM parametre."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Vrijednost"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Pregled"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Pogledaj detalje"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Samo gledanje"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Pregledi"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Pregledi po posjeti"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Prosječno vrijeme posjete"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Posjetitelji"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Posjete"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Web stranica"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID web stranice"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Web stranice"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Prozor"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Jučer"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Unesite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " ispod da potvrdite."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " trenutno "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "posjetitelj"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "posjetitelja"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite obrisati "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite napustiti "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite ukloniti "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite resetovati "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Brisanje tima će također obrisati sve web stranice tima."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Svi podaci web stranice biće obrisani."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Nešto je pošlo po zlu."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Idi na postavke"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Pogrešno korisničko ime i/ili šifra."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Nevalidna domena. Ne uključujte http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimalna dužina od "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " karaktera"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Nova verzija Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " je dostupna!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nema dostupnih podataka."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Nema dostupnih podataka o događajima."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Šifre se ne poklapaju."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Nema rezultata."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Ovaj tim nema nikakvih web stranica."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Niste kreirali nijedan tim."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Nema nikakvih korisnika."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nemate iskonfigurisanu nijednu web stranicu."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Stranica nije pronađena"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Da resetujete ovu web stranicu, upišite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " dole da potvrdite."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Sve statistike o ovoj web stranici će biti obrisane, ali vaše postavke neće biti dirane."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Sačuvano."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Statistike vaše web stranice su javno dostupne na sljedećem URLu:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Već ste član tima."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Tim nije pronađen."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Web stranice može vidjeti bilo ko iz tima."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Da pratite statistike ove web stranice, stavite sljedeći kod u "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " sekciju vašeg HTMLa."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Prebacite ovu web stranicu na vaš račun?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Odaberite tim u koji želite prebaciti ovu web stranicu."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Prebacite vlasništvo web stranice na vaš račun ili drugi tim."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Trigerovani događaj"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Korisnik obrisan."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Pogledana stranica"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Posjetitelj iz "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " koristi "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Posjetitelji koji su napustili stranicu"
- }
- ]
+ "label": {
+ "access-code": "Pristupni kod",
+ "account": "Račun",
+ "action": "Radnja",
+ "actions": "Akcije",
+ "activity": "Log aktivnosti",
+ "add": "Dodaj",
+ "add-board": "Dodaj ploču",
+ "add-description": "Dodaj opis",
+ "add-link": "Dodaj link",
+ "add-member": "Dodaj člana",
+ "add-pixel": "Dodaj piksel",
+ "add-step": "Dodaj korak",
+ "add-website": "Dodaj web stranicu",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Nakon",
+ "all": "Sve",
+ "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",
+ "average": "Prosjek",
+ "back": "Nazad",
+ "before": "Prije",
+ "behavior": "Ponašanje",
+ "block-selector": "Odabir bloka",
+ "boards": "Ploče",
+ "bounce-rate": "Stopa napuštanja",
+ "breakdown": "Pregled po kategorijama",
+ "browser": "Preglednik",
+ "browsers": "Browseri",
+ "campaign": "Kampanja",
+ "campaigns": "Kampanje",
+ "cancel": "Otkaži",
+ "change-password": "Promijeni šifru",
+ "channel": "Kanal",
+ "channels": "Kanali",
+ "chart": "Grafikon",
+ "cities": "Gradovi",
+ "city": "Grad",
+ "clear-all": "Očisti sve",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorte",
+ "compare": "Uporedi",
+ "compare-dates": "Uporedi datume",
+ "confirm": "Potvrdi",
+ "confirm-password": "Potvrdi šifru",
+ "contains": "Sadrži",
+ "content": "Sadržaj",
+ "continue": "Nastavi",
+ "conversion": "Konverzija",
+ "conversion-rate": "Stopa konverzije",
+ "conversion-step": "Korak konverzije",
+ "count": "Broj",
+ "countries": "Zemlje",
+ "country": "Zemlja",
+ "create": "Kreiraj",
+ "create-report": "Kreiraj izvještaj",
+ "create-team": "Kreiraj tim",
+ "create-user": "Kreiraj korisnika",
+ "created": "Kreiraj",
+ "created-by": "Kreirao",
+ "criteria": "Kriteriji",
+ "currency": "Valuta",
+ "current": "Trenutno",
+ "current-password": "Trenutna šifra",
+ "custom-range": "Proizvoljni raspon",
+ "dashboard": "Nadzorna ploča",
+ "data": "Podaci",
+ "date": "Datum",
+ "date-range": "Datumski raspon",
+ "day": "Dan",
+ "default-date-range": "Defaultni datumski raspon",
+ "delete": "Izbriši",
+ "delete-report": "Izbriši report",
+ "delete-team": "Izbriši tim",
+ "delete-user": "Izbriši korisnika",
+ "delete-website": "Izbriši web stranicu",
+ "description": "Opis",
+ "desktop": "Desktop",
+ "destination-url": "Odredišni URL",
+ "details": "Detalji",
+ "device": "Uređaj",
+ "devices": "Uređaji",
+ "direct": "Direktno",
+ "dismiss": "Odbaci",
+ "distinct-id": "Jedinstveni ID",
+ "documentation": "Dokumentacija",
+ "does-not-contain": "Ne sadrži",
+ "does-not-include": "Ne uključuje",
+ "doest-not-exist": "Ne postoji",
+ "domain": "Domena",
+ "download": "Preuzmi",
+ "dropoff": "Odlazak",
+ "duration": "Trajanje",
+ "edit": "Uredi",
+ "edit-member": "Uredi člana",
+ "email": "E-mail",
+ "enable-share-url": "Omogući URL za dijeljenje",
+ "end-step": "Završni korak",
+ "entry": "URL ulaza",
+ "environment": "Okruženje",
+ "event": "Događaj",
+ "event-data": "Podaci o događaju",
+ "event-name": "Naziv događaja",
+ "events": "Događaji",
+ "exclude-bounce": "Isključi odbijanja",
+ "exists": "Postoji",
+ "exit": "Exit URL",
+ "false": "Ne",
+ "fcp": "FCP",
+ "field": "Polje",
+ "fields": "Polja",
+ "filter": "Filter",
+ "filter-combined": "Kombinovano",
+ "filter-raw": "Sirovo",
+ "filters": "Filtri",
+ "first-click": "Prvi klik",
+ "first-seen": "Prvi put viđeno",
+ "funnel": "Lijevak",
+ "funnel-description": "Razumite koverziju i drop-off učestalost korisnika.",
+ "funnels": "Lijevci",
+ "goal": "Cilj",
+ "goals": "Ciljevi",
+ "goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
+ "good": "Dobro",
+ "greater-than": "Veće od",
+ "greater-than-equals": "Veće od ili jednako",
+ "grouped": "Grupisano",
+ "growth": "Rast",
+ "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",
+ "invalid-url": "Nevažeći URL",
+ "is": "Jeste",
+ "is-false": "Nije tačno",
+ "is-not": "Nije",
+ "is-not-set": "Nije setano",
+ "is-set": "Jeste setano",
+ "is-true": "Tačno",
+ "join": "Učlani se",
+ "join-team": "Učlani se u tim",
+ "journey": "Putovanje",
+ "journey-description": "Saznajte kako korisnici navigiraju vašom web stranicom.",
+ "journeys": "Putovanja",
+ "language": "Jezik",
+ "languages": "Jezici",
+ "laptop": "Laptop",
+ "last-click": "Zadnji klik",
+ "last-days": "Zadnjih {x} dana",
+ "last-hours": "Zadnjih {x} sati",
+ "last-months": "Zadnjih {x} mjeseci",
+ "last-seen": "Zadnji put viđen",
+ "lcp": "LCP",
+ "leave": "Napusti",
+ "leave-team": "Napusti tim",
+ "less-than": "Manje od",
+ "less-than-equals": "Manje od ili jednako",
+ "link": "Link",
+ "links": "Linkovi",
+ "location": "Lokacija",
+ "login": "Prijava",
+ "logout": "Odjava",
+ "manage": "Upravljaj",
+ "manager": "Menadžer",
+ "mask-level": "Nivo maske",
+ "match": "Podudaranje",
+ "match-all": "Sve",
+ "match-any": "Bilo koje",
+ "max": "Maks",
+ "max-duration": "Maksimalno trajanje",
+ "maximize": "Proširi",
+ "medium": "Srednje",
+ "member": "Član",
+ "members": "Članovi",
+ "min": "Min",
+ "minute": "Minuta",
+ "mobile": "Mobilni",
+ "model": "Model",
+ "month": "Mjesec",
+ "more": "Više",
+ "my-account": "Moj račun",
+ "my-websites": "Moje web stranice",
+ "name": "Ime",
+ "needs-improvement": "Treba poboljšanje",
+ "new-password": "Nova šifra",
+ "none": "Nijedno",
+ "number-of-records": "{x} {x, plural, one {zapis} other {zapisa}}",
+ "ok": "U redu",
+ "online": "Na mreži",
+ "organic-search": "Organska pretraga",
+ "organic-shopping": "Organska kupovina",
+ "organic-social": "Organske društvene mreže",
+ "organic-video": "Organski video",
+ "os": "OS",
+ "other": "Drugo",
+ "overview": "Pregled",
+ "owner": "Vlasnik",
+ "page": "Stranica",
+ "page-of": "Strana {current} od {total}",
+ "page-views": "Pregleda stranica",
+ "pages": "Stranice",
+ "pageTitle": "Naslov stranice",
+ "paid-ads": "Plaćeni oglasi",
+ "paid-search": "Plaćena pretraga",
+ "paid-shopping": "Plaćena kupovina",
+ "paid-social": "Plaćene društvene mreže",
+ "paid-video": "Plaćeni video",
+ "password": "Šifra",
+ "path": "Putanja",
+ "paths": "Putanje",
+ "performance": "Performanse",
+ "pixel": "Piksel",
+ "pixels": "Pikseli",
+ "play": "Reprodukuj",
+ "poor": "Loše",
+ "powered-by": "Omogućeno s {name}",
+ "preferences": "Postavke",
+ "previous": "Prethodno",
+ "previous-period": "Prethodni period",
+ "previous-year": "Prethodna godina",
+ "profile": "Profil",
+ "profiles": "Profili",
+ "properties": "Svojstva",
+ "property": "Svojstvo",
+ "queries": "Upiti",
+ "query": "Upit",
+ "query-parameters": "Parametri upita",
+ "realtime": "Realno vrijeme",
+ "recorded": "Snimljeno u",
+ "referral": "Preporuka",
+ "referrer": "Preporučilac",
+ "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",
+ "replay": "Ponovna reprodukcija",
+ "replay-enabled": "Ponovna reprodukcija omogućena",
+ "replay-id": "Replay ID",
+ "replays": "Ponovne reprodukcije",
+ "reports": "Izvještaji",
+ "required": "Obavezno",
+ "reset": "Resetuj",
+ "reset-website": "Resetuj web stranicu",
+ "retention": "Zadržavanje",
+ "retention-days": "Dani zadržavanja",
+ "retention-description": "Izmjeri 'ljepljivost' svoje web stranice praćenjem koliko često set korisnici vraćaju.",
+ "revenue": "Prihod",
+ "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-segment": "Spremi segment",
+ "screen": "Ekran",
+ "screens": "Ekrani",
+ "search": "Traži",
+ "segment": "Segment",
+ "segments": "Segmenti",
+ "select": "Odaberi",
+ "select-component": "Odaberite komponentu",
+ "select-date": "Odaberi datum",
+ "select-filter": "Odaberi filter",
+ "select-role": "Odaberi rolu",
+ "select-website": "Odaberi web stranicu",
+ "session": "Sesija",
+ "session-data": "Podaci o sesiji",
+ "sessions": "Sesije",
+ "settings": "Postavke",
+ "share": "Podijeli",
+ "share-url": "URL za dijeljenje",
+ "single-day": "Jedan dan",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Izvor",
+ "sources": "Izvori",
+ "start-step": "Početni korak",
+ "steps": "Koraci",
+ "sum": "Suma",
+ "support": "Podrška",
+ "switch-account": "Promijeni račun",
+ "table": "Tabela",
+ "tablet": "Tablet",
+ "tag": "Oznaka",
+ "tags": "Oznake",
+ "team": "Tim",
+ "team-id": "Tim ID",
+ "team-manager": "Menadžer tima",
+ "team-member": "Član tima",
+ "team-name": "Naziv tima",
+ "team-owner": "Vlasnik tima",
+ "team-settings": "Postavke tima",
+ "team-view-only": "Samo tim može vidjeti",
+ "team-websites": "Timske web stranice",
+ "teams": "Timovi",
+ "term": "Pojam pretrage",
+ "terms": "Pojmovi",
+ "theme": "Teme",
+ "this-month": "Ovaj mjesec",
+ "this-week": "Ova sedmica",
+ "this-year": "Ova godina",
+ "timezone": "Vremenska zona",
+ "title": "Naslov",
+ "today": "Danas",
+ "toggle-charts": "Uklj/isklj grafikone",
+ "total": "Ukupno",
+ "total-records": "Ukupno redova",
+ "tracking-code": "Kod za praćenje",
+ "traffic": "Promet",
+ "transactions": "Transakcije",
+ "transfer": "Prenesi",
+ "transfer-website": "Transfer web stranice",
+ "true": "Da",
+ "ttfb": "TTFB",
+ "type": "Tip",
+ "unique": "Jedinstveno",
+ "unique-events": "Jedinstveni događaji",
+ "unique-visitors": "Jedinstvenih posjetitelja",
+ "uniqueCustomers": "Jedinstveni kupci",
+ "unknown": "Nepoznato",
+ "untitled": "Bezimeno",
+ "update": "Ažuriraj",
+ "url": "URL",
+ "user": "Korisnik",
+ "username": "Korisničko ime",
+ "users": "Korisnici",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampanja",
+ "utm-content": "UTM sadržaj",
+ "utm-description": "Pratite vaše kampanje kroz UTM parametre.",
+ "utm-medium": "UTM medij",
+ "utm-source": "UTM izvor",
+ "utm-term": "UTM pojam",
+ "value": "Vrijednost",
+ "version": "Verzija",
+ "view": "Pregled",
+ "view-details": "Pogledaj detalje",
+ "view-only": "Samo gledanje",
+ "views": "Pregledi",
+ "views-per-visit": "Pregledi po posjeti",
+ "visit-duration": "Prosječno vrijeme posjete",
+ "visitors": "Posjetitelji",
+ "visits": "Posjete",
+ "website": "Web stranica",
+ "website-id": "ID web stranice",
+ "websites": "Web stranice",
+ "window": "Prozor",
+ "yesterday": "Jučer"
+ },
+ "message": {
+ "action-confirmation": "Unesite {confirmation} ispod da potvrdite.",
+ "active-users": "{x} trenutno {x, plural, one {posjetitelj} other {posjetitelja}}",
+ "bad-request": "Neispravan zahtjev",
+ "collected-data": "Prikupljeni podaci",
+ "confirm-delete": "Jeste li sigurni da želite obrisati {target}?",
+ "confirm-leave": "Jeste li sigurni da želite napustiti {target} ?",
+ "confirm-remove": "Jeste li sigurni da želite ukloniti {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Zabranjeno",
+ "go-to-settings": "Idi na postavke",
+ "incorrect-username-password": "Pogrešno korisničko ime i/ili šifra.",
+ "invalid-domain": "Nevalidna domena. Ne uključujte http/https.",
+ "min-password-length": "Minimalna dužina od {n} karaktera",
+ "new-version-available": "Nova verzija Umami {version} je dostupna!",
+ "no-data-available": "Nema dostupnih podataka.",
+ "no-event-data": "Nema dostupnih podataka o događajima.",
+ "no-match-password": "Šifre se ne poklapaju.",
+ "no-results-found": "Nema rezultata.",
+ "no-team-websites": "Ovaj tim nema nikakvih web stranica.",
+ "no-teams": "Niste kreirali nijedan tim.",
+ "no-users": "Nema nikakvih korisnika.",
+ "no-websites-configured": "Nemate iskonfigurisanu nijednu web stranicu.",
+ "not-found": "Nije pronađeno",
+ "nothing-selected": "Ništa nije odabrano.",
+ "page-not-found": "Stranica nije pronađena",
+ "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-component-preview": "Odaberite komponentu za pregled",
+ "select-website-first": "Prvo odaberite web stranicu",
+ "sever-error": "Greška servera",
+ "share-url": "Statistike vaše web stranice su javno dostupne na sljedećem URLu:",
+ "team-already-member": "Već ste član tima.",
+ "team-not-found": "Tim nije pronađen.",
+ "team-websites-info": "Web stranice može vidjeti bilo ko iz tima.",
+ "tracking-code": "Da pratite statistike ove web stranice, stavite sljedeći kod u ... sekciju vašeg HTMLa.",
+ "transfer-team-website-to-user": "Prebacite ovu web stranicu na vaš račun?",
+ "transfer-user-website-to-team": "Odaberite tim u koji želite prebaciti ovu web stranicu.",
+ "transfer-website": "Prebacite vlasništvo web stranice na vaš račun ili drugi tim.",
+ "triggered-event": "Trigerovani događaj",
+ "unauthorized": "Neautorizirano",
+ "user-deleted": "Korisnik obrisan.",
+ "viewed-page": "Pogledana stranica",
+ "visitor-log": "Posjetitelj iz {country} koristi {browser} na {os} {device} "
+ }
}
diff --git a/public/intl/messages/ca-ES.json b/public/intl/messages/ca-ES.json
index 69b69e435..1adc4743b 100644
--- a/public/intl/messages/ca-ES.json
+++ b/public/intl/messages/ca-ES.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Codi d'accés"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Accions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Registre d'activitat"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Afegir"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Afegir descripció"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Afegir membre"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Afegir pas"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Afegir lloc web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Després"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Tots"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Sempre"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analítiques"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Mitjana"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Enrere"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Abans"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Percentatge de rebot"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Desglossament"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Navegador"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadors"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancel·la"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Canvia la contrasenya"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Ciutats"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Ciutat"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Netejar tot"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Comparar"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmar"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirma la contrasenya"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Conté"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuar"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Recompte"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Països"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "País"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Crear"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Crear informe"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Crear equip"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Crear usuari"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Creat"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Creat Per"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Actual"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Contrasenya actual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Rang personalitzat"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Panell"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Dades"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Interval de dates"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dia"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Interval de dates per defecte"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Esborra"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Eliminar informe"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Eliminar equip"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Eliminar usuari"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Esborra el lloc web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Descripció"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Escriptori"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalls"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Dispositiu"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositius"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Descarta"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "No conté"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domini"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Abandonament"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edita"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edita panell"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edita membre"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Activa l'enllaç per compartir"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Pas Final"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL d'entrada"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Esdeveniment"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Dades de l'esdeveniment"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Esdeveniments"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL de sortida"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Fals"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Camp"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Camps"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtre"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinat"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "En cru"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtres"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Vist per primer cop"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Embut"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Entengui la taxa de conversió i abandonament dels usuaris."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Meta"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Metes"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Més gran que"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Més gran que o igual a"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Amfitrió"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Amfitrions"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Aprofundeixi en les seves dades mitjançant l'ús de segments i filtres."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "És igual a"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "No és igual a"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "No està establert"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Està establert"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Unir"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Unir-se al equip"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Trajecte"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Entengui com naveguen els usuaris pel seu lloc web."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Idioma"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Idiomes"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portàtil"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últims "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dies"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimes "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hores"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Últims "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " mesos"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Vist per últim cop"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Abandonar"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Abandonar equip"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Menor que"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Menor que o igual a"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Connecta't"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Desconnecta't"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Administrar"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Màx"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Membre"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Membres"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Mín"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mòbil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Més"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "El meu compte"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Els meus llocs web"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nom"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Contrasenya nova"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Cap"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "registre"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "registres"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "SO"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Resum"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Propietari"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Pàgina "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " de "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Pàgines vistes"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Títol de la pàgina"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pàgines"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Contrasenya"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Camí"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Camins"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Funciona amb "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Anterior"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Període anterior"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Any anterior"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Propietats"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Propietat"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Consultes"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Consulta"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Paràmetres de consulta"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Temps real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referent"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referents"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresca"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerar"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Regió"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Treure"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Eliminar membre"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Informes"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obligatori"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Restableix"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Restableix estadístiques"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retenció"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mesuri la retenció del seu lloc web fent un seguiment de la freqüència amb què tornen els usuaris."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Ingressos"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Observi els seus ingressos al llarg del temps."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Propietat d'Ingressos"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Executar consulta"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Desa"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Pantalles"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Buscar"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Seleccionar"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Seleccionar data"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Seleccionar rol"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Seleccionar lloc web"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sessió"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Configuració"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Enllaç per compartir"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Un sol dia"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Pas inicial"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Pasos"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tauleta"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Equip"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID del equip"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Responsable d'equip"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Membre de l'equip"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nom de l'equip"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Propietari de l'equip"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Vista només de l'equip"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Llocs web de l'equip"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Equips"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Aquest mes"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Aquesta setmana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Aquest any"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zona horària"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Títol"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Avui"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Mostra/amaga gràfics"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total de registres"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Codi de seguiment"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaccions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transferir"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transferir lloc web"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Cert"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tipus"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Únic"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitants únics"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Clients Únics"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Desconegut"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Sense títol"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Actualitzar"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Usuari"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Propietat d'Usuari"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nom d'usuari"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Usuaris"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Rastreji les seves campanyes a través de paràmetres UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valor"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Visualitzar"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Veure els detalls"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Només veure"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Vistes"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Vistes per visita"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Temps mitjà de visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitants"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visites"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Lloc web"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID del lloc web"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Llocs web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Finestra"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ahir"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Escrigui "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " al cuadre inferior per confirmar."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitant actual"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitants actuals"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Dades recol·lectades"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Segur que vol esborrar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Segur que vol abandonar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Segur que vol eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Segur que vol restablir les estadístiques de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Al eliminar un equip també s'eliminaran tots els llocs web de l'equip."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "També s'esborraran totes les dades relacionades."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "S'ha produït un error."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " a "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Vés a la configuració"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nom d'usuari o contrasenya incorrectes."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domini invàlid"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Longitud mínima de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caràcters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Una nova versió d'Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " està disponible!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No hi ha dades disponibles."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No hi ha dades d'esdeveniments disponibles."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Les contrasenyes no coincideixen"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No s'han trobat resultats."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Aquest equip no té cap lloc web."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "No ha creat cap equip."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "No hi ha cap usuari."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "No hi ha cap lloc web configurat."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "No s'ha trobat la pàgina."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Per restablir aquest lloc web, escrigui "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " al cuadre inferior per confirmar."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "S'esborraran totes les estadístiques per aquest lloc web, però el codi de seguiment es mantindrà."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "S'ha desat amb èxit."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Aquest és l'enllaç públic per compartir de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Ja és membre d'aquest equip."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Equip no trobat."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Els llocs web poden ser visualitzats per qualsevol membre de l'equip."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Codi de seguiment"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transferir aquest lloc web al seu compte?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Seleccioni l'equip al qui transferir aquest lloc web."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transferir la propietat del lloc web al seu compte o a un altre equip."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Esdeveniment desencadenat"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Usuari eliminat."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Pàgina vista"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitant de "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " usant "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " a "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitants han sortit"
- }
- ]
+ "label": {
+ "access-code": "Codi d'accés",
+ "account": "Compte",
+ "action": "Acció",
+ "actions": "Accions",
+ "activity": "Registre d'activitat",
+ "add": "Afegir",
+ "add-board": "Afegir tauler",
+ "add-description": "Afegir descripció",
+ "add-link": "Afegir enllaç",
+ "add-member": "Afegir membre",
+ "add-pixel": "Afegir píxel",
+ "add-step": "Afegir pas",
+ "add-website": "Afegir lloc web",
+ "admin": "Administrador",
+ "affiliate": "Afiliat",
+ "after": "Després",
+ "all": "Tots",
+ "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",
+ "average": "Mitjana",
+ "back": "Enrere",
+ "before": "Abans",
+ "behavior": "Comportament",
+ "block-selector": "Selector de bloc",
+ "boards": "Taulers",
+ "bounce-rate": "Percentatge de rebot",
+ "breakdown": "Desglossament",
+ "browser": "Navegador",
+ "browsers": "Navegadors",
+ "campaign": "Campanya",
+ "campaigns": "Campanyes",
+ "cancel": "Cancel·la",
+ "change-password": "Canvia la contrasenya",
+ "channel": "Canal",
+ "channels": "Canals",
+ "chart": "Gràfic",
+ "cities": "Ciutats",
+ "city": "Ciutat",
+ "clear-all": "Netejar tot",
+ "cls": "CLS",
+ "cohort": "Cohort",
+ "cohorts": "Cohorts",
+ "compare": "Comparar",
+ "compare-dates": "Comparar dates",
+ "confirm": "Confirmar",
+ "confirm-password": "Confirma la contrasenya",
+ "contains": "Conté",
+ "content": "Contingut",
+ "continue": "Continuar",
+ "conversion": "Conversió",
+ "conversion-rate": "Taxa de conversió",
+ "conversion-step": "Pas de conversió",
+ "count": "Recompte",
+ "countries": "Països",
+ "country": "País",
+ "create": "Crear",
+ "create-report": "Crear informe",
+ "create-team": "Crear equip",
+ "create-user": "Crear usuari",
+ "created": "Creat",
+ "created-by": "Creat Per",
+ "criteria": "Criteris",
+ "currency": "Moneda",
+ "current": "Actual",
+ "current-password": "Contrasenya actual",
+ "custom-range": "Rang personalitzat",
+ "dashboard": "Panell",
+ "data": "Dades",
+ "date": "Data",
+ "date-range": "Interval de dates",
+ "day": "Dia",
+ "default-date-range": "Interval de dates per defecte",
+ "delete": "Esborra",
+ "delete-report": "Eliminar informe",
+ "delete-team": "Eliminar equip",
+ "delete-user": "Eliminar usuari",
+ "delete-website": "Esborra el lloc web",
+ "description": "Descripció",
+ "desktop": "Escriptori",
+ "destination-url": "URL de destinació",
+ "details": "Detalls",
+ "device": "Dispositiu",
+ "devices": "Dispositius",
+ "direct": "Directe",
+ "dismiss": "Descarta",
+ "distinct-id": "ID distintiu",
+ "documentation": "Documentació",
+ "does-not-contain": "No conté",
+ "does-not-include": "No inclou",
+ "doest-not-exist": "No existeix",
+ "domain": "Domini",
+ "download": "Descarregar",
+ "dropoff": "Abandonament",
+ "duration": "Durada",
+ "edit": "Edita",
+ "edit-member": "Edita membre",
+ "email": "Correu electrònic",
+ "enable-share-url": "Activa l'enllaç per compartir",
+ "end-step": "Pas Final",
+ "entry": "URL d'entrada",
+ "environment": "Entorn",
+ "event": "Esdeveniment",
+ "event-data": "Dades de l'esdeveniment",
+ "event-name": "Nom de l'esdeveniment",
+ "events": "Esdeveniments",
+ "exclude-bounce": "Excloure rebot",
+ "exists": "Existeix",
+ "exit": "URL de sortida",
+ "false": "Fals",
+ "fcp": "FCP",
+ "field": "Camp",
+ "fields": "Camps",
+ "filter": "Filtre",
+ "filter-combined": "Combinat",
+ "filter-raw": "En cru",
+ "filters": "Filtres",
+ "first-click": "Primer clic",
+ "first-seen": "Vist per primer cop",
+ "funnel": "Embut",
+ "funnel-description": "Entengui la taxa de conversió i abandonament dels usuaris.",
+ "funnels": "Embuts",
+ "goal": "Meta",
+ "goals": "Metes",
+ "goals-description": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments.",
+ "good": "Bo",
+ "greater-than": "Més gran que",
+ "greater-than-equals": "Més gran que o igual a",
+ "grouped": "Agrupat",
+ "growth": "Creixement",
+ "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.",
+ "invalid-url": "URL no vàlida",
+ "is": "És igual a",
+ "is-false": "És fals",
+ "is-not": "No és igual a",
+ "is-not-set": "No està establert",
+ "is-set": "Està establert",
+ "is-true": "És cert",
+ "join": "Unir",
+ "join-team": "Unir-se al equip",
+ "journey": "Trajecte",
+ "journey-description": "Entengui com naveguen els usuaris pel seu lloc web.",
+ "journeys": "Trajectes",
+ "language": "Idioma",
+ "languages": "Idiomes",
+ "laptop": "Portàtil",
+ "last-click": "Últim clic",
+ "last-days": "Últims {x} dies",
+ "last-hours": "Últimes {x} hores",
+ "last-months": "Últims {x} mesos",
+ "last-seen": "Vist per últim cop",
+ "lcp": "LCP",
+ "leave": "Abandonar",
+ "leave-team": "Abandonar equip",
+ "less-than": "Menor que",
+ "less-than-equals": "Menor que o igual a",
+ "link": "Enllaç",
+ "links": "Enllaços",
+ "location": "Ubicació",
+ "login": "Connecta't",
+ "logout": "Desconnecta't",
+ "manage": "Administrar",
+ "manager": "Responsable",
+ "mask-level": "Nivell de màscara",
+ "match": "Coincidència",
+ "match-all": "Tots",
+ "match-any": "Qualsevol",
+ "max": "Màx",
+ "max-duration": "Durada màxima",
+ "maximize": "Expandeix",
+ "medium": "Mitjà",
+ "member": "Membre",
+ "members": "Membres",
+ "min": "Mín",
+ "minute": "Minut",
+ "mobile": "Mòbil",
+ "model": "Model",
+ "month": "Mes",
+ "more": "Més",
+ "my-account": "El meu compte",
+ "my-websites": "Els meus llocs web",
+ "name": "Nom",
+ "needs-improvement": "Necessita millora",
+ "new-password": "Contrasenya nova",
+ "none": "Cap",
+ "number-of-records": "{x} {x, plural, one {registre} other {registres}}",
+ "ok": "D'acord",
+ "online": "En línia",
+ "organic-search": "Cerca orgànica",
+ "organic-shopping": "Compra orgànica",
+ "organic-social": "Social orgànic",
+ "organic-video": "Vídeo orgànic",
+ "os": "SO",
+ "other": "Altres",
+ "overview": "Resum",
+ "owner": "Propietari",
+ "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",
+ "paid-ads": "Anuncis de pagament",
+ "paid-search": "Cerca de pagament",
+ "paid-shopping": "Compra de pagament",
+ "paid-social": "Social de pagament",
+ "paid-video": "Vídeo de pagament",
+ "password": "Contrasenya",
+ "path": "Camí",
+ "paths": "Camins",
+ "performance": "Rendiment",
+ "pixel": "Píxel",
+ "pixels": "Píxels",
+ "play": "Reprodueix",
+ "poor": "Deficient",
+ "powered-by": "Funciona amb {name}",
+ "preferences": "Preferències",
+ "previous": "Anterior",
+ "previous-period": "Període anterior",
+ "previous-year": "Any anterior",
+ "profile": "Perfil",
+ "profiles": "Perfils",
+ "properties": "Propietats",
+ "property": "Propietat",
+ "queries": "Consultes",
+ "query": "Consulta",
+ "query-parameters": "Paràmetres de consulta",
+ "realtime": "Temps real",
+ "recorded": "Registrat a",
+ "referral": "Referència",
+ "referrer": "Referent",
+ "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",
+ "replay": "Repetició",
+ "replay-enabled": "Repetició activada",
+ "replay-id": "Replay ID",
+ "replays": "Repeticions",
+ "reports": "Informes",
+ "required": "Obligatori",
+ "reset": "Restableix",
+ "reset-website": "Restableix estadístiques",
+ "retention": "Retenció",
+ "retention-days": "Dies de retenció",
+ "retention-description": "Mesuri la retenció del seu lloc web fent un seguiment de la freqüència amb què tornen els usuaris.",
+ "revenue": "Ingressos",
+ "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-segment": "Desar segment",
+ "screen": "Pantalla",
+ "screens": "Pantalles",
+ "search": "Buscar",
+ "segment": "Segment",
+ "segments": "Segments",
+ "select": "Seleccionar",
+ "select-component": "Selecciona un component",
+ "select-date": "Seleccionar data",
+ "select-filter": "Seleccionar filtre",
+ "select-role": "Seleccionar rol",
+ "select-website": "Seleccionar lloc web",
+ "session": "Sessió",
+ "session-data": "Dades de sessió",
+ "sessions": "Sessions",
+ "settings": "Configuració",
+ "share": "Comparteix",
+ "share-url": "Enllaç per compartir",
+ "single-day": "Un sol dia",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Font",
+ "sources": "Fonts",
+ "start-step": "Pas inicial",
+ "steps": "Pasos",
+ "sum": "Suma",
+ "support": "Suport",
+ "switch-account": "Canviar de compte",
+ "table": "Taula",
+ "tablet": "Tauleta",
+ "tag": "Etiqueta",
+ "tags": "Etiquetes",
+ "team": "Equip",
+ "team-id": "ID del equip",
+ "team-manager": "Responsable d'equip",
+ "team-member": "Membre de l'equip",
+ "team-name": "Nom de l'equip",
+ "team-owner": "Propietari de l'equip",
+ "team-settings": "Configuració de l'equip",
+ "team-view-only": "Vista només de l'equip",
+ "team-websites": "Llocs web de l'equip",
+ "teams": "Equips",
+ "term": "Terme",
+ "terms": "Termes",
+ "theme": "Tema",
+ "this-month": "Aquest mes",
+ "this-week": "Aquesta setmana",
+ "this-year": "Aquest any",
+ "timezone": "Zona horària",
+ "title": "Títol",
+ "today": "Avui",
+ "toggle-charts": "Mostra/amaga gràfics",
+ "total": "Total",
+ "total-records": "Total de registres",
+ "tracking-code": "Codi de seguiment",
+ "traffic": "Trànsit",
+ "transactions": "Transaccions",
+ "transfer": "Transferir",
+ "transfer-website": "Transferir lloc web",
+ "true": "Cert",
+ "ttfb": "TTFB",
+ "type": "Tipus",
+ "unique": "Únic",
+ "unique-events": "Esdeveniments únics",
+ "unique-visitors": "Visitants únics",
+ "uniqueCustomers": "Clients Únics",
+ "unknown": "Desconegut",
+ "untitled": "Sense títol",
+ "update": "Actualitzar",
+ "url": "URL",
+ "user": "Usuari",
+ "username": "Nom d'usuari",
+ "users": "Usuaris",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campanya",
+ "utm-content": "UTM Contingut",
+ "utm-description": "Rastreji les seves campanyes a través de paràmetres UTM.",
+ "utm-medium": "UTM Mitjà",
+ "utm-source": "UTM Font",
+ "utm-term": "UTM Terme",
+ "value": "Valor",
+ "version": "Versió",
+ "view": "Visualitzar",
+ "view-details": "Veure els detalls",
+ "view-only": "Només veure",
+ "views": "Vistes",
+ "views-per-visit": "Vistes per visita",
+ "visit-duration": "Temps mitjà de visita",
+ "visitors": "Visitants",
+ "visits": "Visites",
+ "website": "Lloc web",
+ "website-id": "ID del lloc web",
+ "websites": "Llocs web",
+ "window": "Finestra",
+ "yesterday": "Ahir"
+ },
+ "message": {
+ "action-confirmation": "Escrigui {confirmation} al cuadre inferior per confirmar.",
+ "active-users": "{x} {x, plural, one {visitant actual} other {visitants actuals}}",
+ "bad-request": "Sol·licitud incorrecta",
+ "collected-data": "Dades recol·lectades",
+ "confirm-delete": "Segur que vol esborrar {target}?",
+ "confirm-leave": "Segur que vol abandonar {target} ?",
+ "confirm-remove": "Segur que vol eliminar {target} ?",
+ "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.",
+ "event-log": "{event} a {url} ",
+ "forbidden": "Prohibit",
+ "go-to-settings": "Vés a la configuració",
+ "incorrect-username-password": "Nom d'usuari o contrasenya incorrectes.",
+ "invalid-domain": "Domini invàlid",
+ "min-password-length": "Longitud mínima de {n} caràcters",
+ "new-version-available": "Una nova versió d'Umami {version} està disponible!",
+ "no-data-available": "No hi ha dades disponibles.",
+ "no-event-data": "No hi ha dades d'esdeveniments disponibles.",
+ "no-match-password": "Les contrasenyes no coincideixen",
+ "no-results-found": "No s'han trobat resultats.",
+ "no-team-websites": "Aquest equip no té cap lloc web.",
+ "no-teams": "No ha creat cap equip.",
+ "no-users": "No hi ha cap usuari.",
+ "no-websites-configured": "No hi ha cap lloc web configurat.",
+ "not-found": "No trobat",
+ "nothing-selected": "Res seleccionat.",
+ "page-not-found": "No s'ha trobat la pàgina.",
+ "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-component-preview": "Selecciona un component per previsualitzar",
+ "select-website-first": "Primer selecciona un lloc web",
+ "sever-error": "Error del servidor",
+ "share-url": "Aquest és l'enllaç públic per compartir de {target}.",
+ "team-already-member": "Ja és membre d'aquest equip.",
+ "team-not-found": "Equip no trobat.",
+ "team-websites-info": "Els llocs web poden ser visualitzats per qualsevol membre de l'equip.",
+ "tracking-code": "Codi de seguiment",
+ "transfer-team-website-to-user": "Transferir aquest lloc web al seu compte?",
+ "transfer-user-website-to-team": "Seleccioni l'equip al qui transferir aquest lloc web.",
+ "transfer-website": "Transferir la propietat del lloc web al seu compte o a un altre equip.",
+ "triggered-event": "Esdeveniment desencadenat",
+ "unauthorized": "No autoritzat",
+ "user-deleted": "Usuari eliminat.",
+ "viewed-page": "Pàgina vista",
+ "visitor-log": "Visitant de {country} usant {browser} a {os} {device} "
+ }
}
diff --git a/public/intl/messages/cs-CZ.json b/public/intl/messages/cs-CZ.json
index aa08174e1..3b64dd8fc 100644
--- a/public/intl/messages/cs-CZ.json
+++ b/public/intl/messages/cs-CZ.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Přístupový kód"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Akce"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Log aktivity"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Přidat"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Přidat popis"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Přidat člena"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Přidat krok"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Přidat web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrátor"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Po"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Vše"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Celá doba"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Průměr"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Zpět"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Před"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Okamžité opuštění"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Prohlížeč"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Prohlížeče"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Zrušit"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Změnit heslo"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Města"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Město"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Vyčistit vše"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Porovnat"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Potvrdit"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potvrdit heslo"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Obsahuje"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Pokračovat"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Počet"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Státy"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Stát"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Vytvořit"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Vytvořit hlášení"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Vytvořit tým"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Vytvořit uživatele"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Vytvořeno"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Aktuální"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Aktuální heslo"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Vlastní rozsah"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Přehled"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Období"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Den"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Výchozí období"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Smazat"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Smazat hlášení"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Smazat tým"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Smazat uživatele"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Smazat web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Popis"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Stolní počítač"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detaily"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Zařízení"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Zařízení"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Odejít"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Neobsahuje"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Doména"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Upravit"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Upravit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Upravit člena"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Povolit sdílení URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Vstupní URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Událost"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Události"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Pole"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtr"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinace"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Nezpracované"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtry"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Cíl"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Cíle"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Jazyk"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Jazyky"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Přenosný počítač"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Posledních "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dnů"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Posledních "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hodin"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Posledních "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " měsíců"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Opustit"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Opustit tým"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Přihlásit"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Odhlásit"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Spravovat"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Správce"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Člen"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Členové"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobilní telefon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Více"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Můj účet"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mé weby"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Jméno"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nové heslo"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Přehled"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Vlastník"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Zobrazení stránek"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Název stránky"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Stránky"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Heslo"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Cesta"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Cesty"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Běží na "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Aktuálně"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Odkazy"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Obnovit"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Vyžadováno"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Uložit"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Nastavení"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Sdílet URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Jeden den"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Tento měsíc"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Tento týden"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Tento rok"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Časová zóna"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Dnes"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Sledovací kód"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Jedinečné návštěvy"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Neznámý"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Uživatelské jméno"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Zobrazit detaily"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Zobrazení"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Průměrný čas návštěvy"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Návštěvníci"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Návštěvy"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Weby"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Okno"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Včera"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " aktuálně "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "návštěvník"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "návštěvníci"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Opravdu smazat "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Všechna související data budou také smazána."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Něco se pokazilo."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Jít do nastavení"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nesprávné jméno/heslo."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Neplatná doména"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Žádná data."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Hesla se neschodují"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nemáte nastavený žádný web."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Stránka nenalezena."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Úspěšně uloženo."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Toto je sdílené URL pro "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Sledovací kód"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Návštěvník z "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " s prohlížečem "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Přístupový kód",
+ "account": "Účet",
+ "action": "Akce",
+ "actions": "Akce",
+ "activity": "Log aktivity",
+ "add": "Přidat",
+ "add-board": "Přidat nástěnku",
+ "add-description": "Přidat popis",
+ "add-link": "Přidat odkaz",
+ "add-member": "Přidat člena",
+ "add-pixel": "Přidat pixel",
+ "add-step": "Přidat krok",
+ "add-website": "Přidat web",
+ "admin": "Administrátor",
+ "affiliate": "Partner",
+ "after": "Po",
+ "all": "Vše",
+ "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",
+ "average": "Průměr",
+ "back": "Zpět",
+ "before": "Před",
+ "behavior": "Chování",
+ "block-selector": "Výběr bloku",
+ "boards": "Nástěnky",
+ "bounce-rate": "Okamžité opuštění",
+ "breakdown": "Rozpis",
+ "browser": "Prohlížeč",
+ "browsers": "Prohlížeče",
+ "campaign": "Kampaň",
+ "campaigns": "Kampaně",
+ "cancel": "Zrušit",
+ "change-password": "Změnit heslo",
+ "channel": "Kanál",
+ "channels": "Kanály",
+ "chart": "Graf",
+ "cities": "Města",
+ "city": "Město",
+ "clear-all": "Vyčistit vše",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorty",
+ "compare": "Porovnat",
+ "compare-dates": "Porovnat data",
+ "confirm": "Potvrdit",
+ "confirm-password": "Potvrdit heslo",
+ "contains": "Obsahuje",
+ "content": "Obsah",
+ "continue": "Pokračovat",
+ "conversion": "Konverze",
+ "conversion-rate": "Míra konverze",
+ "conversion-step": "Krok konverze",
+ "count": "Počet",
+ "countries": "Státy",
+ "country": "Stát",
+ "create": "Vytvořit",
+ "create-report": "Vytvořit hlášení",
+ "create-team": "Vytvořit tým",
+ "create-user": "Vytvořit uživatele",
+ "created": "Vytvořeno",
+ "created-by": "Vytvořil",
+ "criteria": "Kritéria",
+ "currency": "Měna",
+ "current": "Aktuální",
+ "current-password": "Aktuální heslo",
+ "custom-range": "Vlastní rozsah",
+ "dashboard": "Přehled",
+ "data": "Data",
+ "date": "Datum",
+ "date-range": "Období",
+ "day": "Den",
+ "default-date-range": "Výchozí období",
+ "delete": "Smazat",
+ "delete-report": "Smazat hlášení",
+ "delete-team": "Smazat tým",
+ "delete-user": "Smazat uživatele",
+ "delete-website": "Smazat web",
+ "description": "Popis",
+ "desktop": "Stolní počítač",
+ "destination-url": "Cílová URL",
+ "details": "Detaily",
+ "device": "Zařízení",
+ "devices": "Zařízení",
+ "direct": "Přímý",
+ "dismiss": "Odejít",
+ "distinct-id": "Jedinečné ID",
+ "documentation": "Dokumentace",
+ "does-not-contain": "Neobsahuje",
+ "does-not-include": "Nezahrnuje",
+ "doest-not-exist": "Neexistuje",
+ "domain": "Doména",
+ "download": "Stáhnout",
+ "dropoff": "Opuštění",
+ "duration": "Trvání",
+ "edit": "Upravit",
+ "edit-member": "Upravit člena",
+ "email": "E-mail",
+ "enable-share-url": "Povolit sdílení URL",
+ "end-step": "Konečný krok",
+ "entry": "Vstupní URL",
+ "environment": "Prostředí",
+ "event": "Událost",
+ "event-data": "Data události",
+ "event-name": "Název události",
+ "events": "Události",
+ "exclude-bounce": "Vyloučit odmítnutí",
+ "exists": "Existuje",
+ "exit": "Exit URL",
+ "false": "Nepravda",
+ "fcp": "FCP",
+ "field": "Pole",
+ "fields": "Pole",
+ "filter": "Filtr",
+ "filter-combined": "Kombinace",
+ "filter-raw": "Nezpracované",
+ "filters": "Filtry",
+ "first-click": "První kliknutí",
+ "first-seen": "Poprvé viděno",
+ "funnel": "Trychtýř",
+ "funnel-description": "Pochopte konverzní poměr a míru opuštění uživatelů.",
+ "funnels": "Trychtýře",
+ "goal": "Cíl",
+ "goals": "Cíle",
+ "goals-description": "Sledujte své cíle pro zobrazení stránek a události.",
+ "good": "Dobré",
+ "greater-than": "Větší než",
+ "greater-than-equals": "Větší nebo rovno",
+ "grouped": "Seskupeno",
+ "growth": "Růst",
+ "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ů.",
+ "invalid-url": "Neplatná URL",
+ "is": "Je",
+ "is-false": "Nepravda",
+ "is-not": "Není",
+ "is-not-set": "Není nastaveno",
+ "is-set": "Nastaveno",
+ "is-true": "Pravda",
+ "join": "Připojit se",
+ "join-team": "Připojit se k týmu",
+ "journey": "Cesta",
+ "journey-description": "Zjistěte, jak uživatelé procházejí vaším webem.",
+ "journeys": "Cesty",
+ "language": "Jazyk",
+ "languages": "Jazyky",
+ "laptop": "Přenosný počítač",
+ "last-click": "Poslední kliknutí",
+ "last-days": "Posledních {x} dnů",
+ "last-hours": "Posledních {x} hodin",
+ "last-months": "Posledních {x} měsíců",
+ "last-seen": "Naposledy viděn",
+ "lcp": "LCP",
+ "leave": "Opustit",
+ "leave-team": "Opustit tým",
+ "less-than": "Méně než",
+ "less-than-equals": "Méně nebo rovno",
+ "link": "Odkaz",
+ "links": "Odkazy",
+ "location": "Umístění",
+ "login": "Přihlásit",
+ "logout": "Odhlásit",
+ "manage": "Spravovat",
+ "manager": "Správce",
+ "mask-level": "Úroveň masky",
+ "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",
+ "members": "Členové",
+ "min": "Min",
+ "minute": "Minuta",
+ "mobile": "Mobilní telefon",
+ "model": "Model",
+ "month": "Měsíc",
+ "more": "Více",
+ "my-account": "Můj účet",
+ "my-websites": "Mé weby",
+ "name": "Jméno",
+ "needs-improvement": "Potřebuje zlepšení",
+ "new-password": "Nové heslo",
+ "none": "Žádný",
+ "number-of-records": "{x} {x, plural, one {záznam} other {záznamů}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organické vyhledávání",
+ "organic-shopping": "Organický nákup",
+ "organic-social": "Organická sociální síť",
+ "organic-video": "Organické video",
+ "os": "OS",
+ "other": "Jiné",
+ "overview": "Přehled",
+ "owner": "Vlastník",
+ "page": "Stránka",
+ "page-of": "Stránka {current} z {total}",
+ "page-views": "Zobrazení stránek",
+ "pages": "Stránky",
+ "pageTitle": "Název stránky",
+ "paid-ads": "Placené reklamy",
+ "paid-search": "Placené vyhledávání",
+ "paid-shopping": "Placený nákup",
+ "paid-social": "Placená sociální síť",
+ "paid-video": "Placené video",
+ "password": "Heslo",
+ "path": "Cesta",
+ "paths": "Cesty",
+ "performance": "Výkon",
+ "pixel": "Pixel",
+ "pixels": "Pixely",
+ "play": "Přehrát",
+ "poor": "Špatné",
+ "powered-by": "Běží na {name}",
+ "preferences": "Předvolby",
+ "previous": "Předchozí",
+ "previous-period": "Předchozí období",
+ "previous-year": "Předchozí rok",
+ "profile": "Profil",
+ "profiles": "Profily",
+ "properties": "Vlastnosti",
+ "property": "Vlastnost",
+ "queries": "Dotazy",
+ "query": "Dotaz",
+ "query-parameters": "Parametry dotazu",
+ "realtime": "Aktuálně",
+ "recorded": "Zaznamenáno v",
+ "referral": "Doporučení",
+ "referrer": "Odkazující",
+ "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",
+ "replay": "Přehrávání",
+ "replay-enabled": "Přehrávání povoleno",
+ "replay-id": "Replay ID",
+ "replays": "Přehrávání",
+ "reports": "Hlášení",
+ "required": "Povinné",
+ "reset": "Resetovat",
+ "reset-website": "Resetovat statistiky",
+ "retention": "Udržení",
+ "retention-days": "Dny uchování",
+ "retention-description": "Měřte přilnavost svého webu sledováním, jak často se uživatelé vracejí.",
+ "revenue": "Příjem",
+ "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-segment": "Uložit segment",
+ "screen": "Obrazovka",
+ "screens": "Obrazovky",
+ "search": "Hledat",
+ "segment": "Segment",
+ "segments": "Segmenty",
+ "select": "Vybrat",
+ "select-component": "Vyberte komponentu",
+ "select-date": "Vybrat datum",
+ "select-filter": "Vybrat filtr",
+ "select-role": "Vybrat roli",
+ "select-website": "Vybrat web",
+ "session": "Relace",
+ "session-data": "Data relace",
+ "sessions": "Relace",
+ "settings": "Nastavení",
+ "share": "Sdílet",
+ "share-url": "URL pro sdílení",
+ "single-day": "Jeden den",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Zdroj",
+ "sources": "Zdroje",
+ "start-step": "Počáteční krok",
+ "steps": "Kroky",
+ "sum": "Součet",
+ "support": "Podpora",
+ "switch-account": "Přepnout účet",
+ "table": "Tabulka",
+ "tablet": "Tablet",
+ "tag": "Štítek",
+ "tags": "Štítky",
+ "team": "Tým",
+ "team-id": "ID týmu",
+ "team-manager": "Manažer týmu",
+ "team-member": "Člen týmu",
+ "team-name": "Název týmu",
+ "team-owner": "Vlastník týmu",
+ "team-settings": "Nastavení týmu",
+ "team-view-only": "Pouze pro zobrazení týmu",
+ "team-websites": "Weby týmu",
+ "teams": "Týmy",
+ "term": "Hledaný výraz",
+ "terms": "Termíny",
+ "theme": "Téma",
+ "this-month": "Tento měsíc",
+ "this-week": "Tento týden",
+ "this-year": "Tento rok",
+ "timezone": "Časová zóna",
+ "title": "Název",
+ "today": "Dnes",
+ "toggle-charts": "Přepnout grafy",
+ "total": "Celkem",
+ "total-records": "Celkem záznamů",
+ "tracking-code": "Sledovací kód",
+ "traffic": "Provoz",
+ "transactions": "Transakce",
+ "transfer": "Přenést",
+ "transfer-website": "Přenést web",
+ "true": "Pravda",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Unikátní",
+ "unique-events": "Unikátní události",
+ "unique-visitors": "Jedinečné návštěvy",
+ "uniqueCustomers": "Unikátní zákazníci",
+ "unknown": "Neznámý",
+ "untitled": "Bez názvu",
+ "update": "Aktualizovat",
+ "url": "URL",
+ "user": "Uživatel",
+ "username": "Uživatelské jméno",
+ "users": "Uživatelé",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampaň",
+ "utm-content": "UTM obsah",
+ "utm-description": "Sledujte své kampaně pomocí UTM parametrů.",
+ "utm-medium": "UTM médium",
+ "utm-source": "UTM zdroj",
+ "utm-term": "UTM výraz",
+ "value": "Hodnota",
+ "version": "Verze",
+ "view": "Zobrazit",
+ "view-details": "Zobrazit detaily",
+ "view-only": "Pouze zobrazení",
+ "views": "Zobrazení",
+ "views-per-visit": "Zobrazení na návštěvu",
+ "visit-duration": "Průměrný čas návštěvy",
+ "visitors": "Návštěvníci",
+ "visits": "Návštěvy",
+ "website": "Web",
+ "website-id": "ID webu",
+ "websites": "Weby",
+ "window": "Okno",
+ "yesterday": "Včera"
+ },
+ "message": {
+ "action-confirmation": "Zadejte {confirmation} do pole níže pro potvrzení.",
+ "active-users": "{x} aktuálně {x, plural, one {návštěvník} other {návštěvníci}}",
+ "bad-request": "Neplatný požadavek",
+ "collected-data": "Shromážděná data",
+ "confirm-delete": "Opravdu smazat {target}?",
+ "confirm-leave": "Opravdu chcete opustit {target} ?",
+ "confirm-remove": "Opravdu chcete odebrat {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Zakázáno",
+ "go-to-settings": "Jít do nastavení",
+ "incorrect-username-password": "Nesprávné jméno/heslo.",
+ "invalid-domain": "Neplatná doména",
+ "min-password-length": "Minimální délka {n} znaků",
+ "new-version-available": "Je k dispozici nová verze Umami {version}!",
+ "no-data-available": "Žádná data.",
+ "no-event-data": "Nejsou k dispozici žádná data o událostech.",
+ "no-match-password": "Hesla se neschodují",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Tento tým nemá žádné weby.",
+ "no-teams": "Nevytvořili jste žádné týmy.",
+ "no-users": "Nejsou žádní uživatelé.",
+ "no-websites-configured": "Nemáte nastavený žádný web.",
+ "not-found": "Nenalezeno",
+ "nothing-selected": "Nic není vybráno.",
+ "page-not-found": "Stránka nenalezena.",
+ "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-component-preview": "Vyberte komponentu pro náhled",
+ "select-website-first": "Nejprve vyberte web",
+ "sever-error": "Chyba serveru",
+ "share-url": "Toto je sdílené URL pro {target}.",
+ "team-already-member": "Již jste členem tohoto týmu.",
+ "team-not-found": "Tým nenalezen.",
+ "team-websites-info": "Weby si může prohlédnout kdokoli z týmu.",
+ "tracking-code": "Sledovací kód",
+ "transfer-team-website-to-user": "Přenést tento web na váš účet?",
+ "transfer-user-website-to-team": "Vyberte tým, na který chcete tento web přenést.",
+ "transfer-website": "Přeneste vlastnictví webu na svůj účet nebo jiný tým.",
+ "triggered-event": "Spuštěná událost",
+ "unauthorized": "Neautorizováno",
+ "user-deleted": "Uživatel smazán.",
+ "viewed-page": "Zobrazená stránka",
+ "visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device} "
+ }
}
diff --git a/public/intl/messages/da-DK.json b/public/intl/messages/da-DK.json
index 87e5f8a95..967d9a0cf 100644
--- a/public/intl/messages/da-DK.json
+++ b/public/intl/messages/da-DK.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Handlinger"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Tilføj hjemmeside"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alle"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Altid"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Tilbage"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Afvisningsprocent"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsere"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Afvis"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Skift adgangskode"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Godkendt adgangskode"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Lande"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Nuværende adgangskode"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Tilpasset interval"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Betjeningspanel"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datointerval"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Standard datointerval"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Slet"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Slet hjemmeside"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Enheder"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Afvis"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domæne"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Rediger"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Aktivér delings-URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Hændelser"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombineret"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Rå"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Sprog"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Sprog"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Sidste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dage"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Sidste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " timer"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Log ind"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Log ud"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mere"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Navn"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Ny adgangskode"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Ejer"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Sidevisninger"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Sider"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Adgangskode"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Drevet af "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtid"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Henvisninger"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Opdater"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Påkrævet"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Nulstil"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Nulstil statistikker"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Gem"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Indstillinger"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Del URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Enkelt dag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Denne måned"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Denne uge"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Dette år"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Tidszone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Idag"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Ændre graf"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Sporingskode"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unikke besøgende"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Ukendt"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Brugernavn"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Vis detajler"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visninger"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Gennemsnitlig besøgstid"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Besøgende"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Hjemmesider"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " nuværende "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "bruger"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "brugere"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Er du sikker på at du vil slette "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Er du sikker på at du ville nulstille "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistikker?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Alle tilknyttede data slettes også."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Noget gik galt."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Gå til betjeningspanel"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Ugyldigt brugernavn/adgangskode."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ugyldigt domæne"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Ingen data tilgængelig."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Adgangskoderne matcher ikke"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Du har ikke konfigureret nogen hjemmesider."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Side ikke fundet."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Alle statistikker for denne hjemmeside ville blive slettet, men sporingskode ville forblive intakt."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Gemt!"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Dette er den offentlige delings-URL til "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Sporingskode"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Besøgende fra "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " bruger "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " på "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Adgangskode",
+ "account": "Konto",
+ "action": "Handling",
+ "actions": "Handlinger",
+ "activity": "Aktivitetslog",
+ "add": "Tilføj",
+ "add-board": "Tilføj tavle",
+ "add-description": "Tilføj beskrivelse",
+ "add-link": "Tilføj link",
+ "add-member": "Tilføj medlem",
+ "add-pixel": "Tilføj pixel",
+ "add-step": "Tilføj trin",
+ "add-website": "Tilføj hjemmeside",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Efter",
+ "all": "Alle",
+ "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",
+ "average": "Gennemsnit",
+ "back": "Tilbage",
+ "before": "Før",
+ "behavior": "Adfærd",
+ "block-selector": "Blokvælger",
+ "boards": "Tavler",
+ "bounce-rate": "Afvisningsprocent",
+ "breakdown": "Opdeling",
+ "browser": "Browser",
+ "browsers": "Browsere",
+ "campaign": "Kampagne",
+ "campaigns": "Kampagner",
+ "cancel": "Afvis",
+ "change-password": "Skift adgangskode",
+ "channel": "Kanal",
+ "channels": "Kanaler",
+ "chart": "Diagram",
+ "cities": "Byer",
+ "city": "By",
+ "clear-all": "Ryd alt",
+ "cls": "CLS",
+ "cohort": "Kohorte",
+ "cohorts": "Kohorter",
+ "compare": "Sammenlign",
+ "compare-dates": "Sammenlign datoer",
+ "confirm": "Bekræft",
+ "confirm-password": "Godkendt adgangskode",
+ "contains": "Indeholder",
+ "content": "Indhold",
+ "continue": "Fortsæt",
+ "conversion": "Konvertering",
+ "conversion-rate": "Konverteringsrate",
+ "conversion-step": "Konverteringstrin",
+ "count": "Antal",
+ "countries": "Lande",
+ "country": "Land",
+ "create": "Opret",
+ "create-report": "Opret rapport",
+ "create-team": "Opret team",
+ "create-user": "Opret bruger",
+ "created": "Oprettet",
+ "created-by": "Oprettet af",
+ "criteria": "Kriterier",
+ "currency": "Valuta",
+ "current": "Nuværende",
+ "current-password": "Nuværende adgangskode",
+ "custom-range": "Tilpasset interval",
+ "dashboard": "Betjeningspanel",
+ "data": "Data",
+ "date": "Dato",
+ "date-range": "Datointerval",
+ "day": "Dag",
+ "default-date-range": "Standard datointerval",
+ "delete": "Slet",
+ "delete-report": "Slet rapport",
+ "delete-team": "Slet team",
+ "delete-user": "Slet bruger",
+ "delete-website": "Slet hjemmeside",
+ "description": "Beskrivelse",
+ "desktop": "Skrivebord",
+ "destination-url": "Destinations-URL",
+ "details": "Detaljer",
+ "device": "Enhed",
+ "devices": "Enheder",
+ "direct": "Direkte",
+ "dismiss": "Afvis",
+ "distinct-id": "Unikt ID",
+ "documentation": "Dokumentation",
+ "does-not-contain": "Indeholder ikke",
+ "does-not-include": "Inkluderer ikke",
+ "doest-not-exist": "Findes ikke",
+ "domain": "Domæne",
+ "download": "Download",
+ "dropoff": "Frafald",
+ "duration": "Varighed",
+ "edit": "Rediger",
+ "edit-member": "Rediger medlem",
+ "email": "E-mail",
+ "enable-share-url": "Aktivér delings-URL",
+ "end-step": "Sluttrin",
+ "entry": "Indgangs-URL",
+ "environment": "Miljø",
+ "event": "Hændelse",
+ "event-data": "Hændelsesdata",
+ "event-name": "Hændelsesnavn",
+ "events": "Hændelser",
+ "exclude-bounce": "Ekskluder afvisning",
+ "exists": "Findes",
+ "exit": "Udgangs-URL",
+ "false": "Falsk",
+ "fcp": "FCP",
+ "field": "Felt",
+ "fields": "Felter",
+ "filter": "Filter",
+ "filter-combined": "Kombineret",
+ "filter-raw": "Rå",
+ "filters": "Filtre",
+ "first-click": "Første klik",
+ "first-seen": "Først set",
+ "funnel": "Tragt",
+ "funnel-description": "Forstå brugernes konverterings- og frafaldsrate.",
+ "funnels": "Tragte",
+ "goal": "Mål",
+ "goals": "Mål",
+ "goals-description": "Følg dine mål for sidevisninger og hændelser.",
+ "good": "God",
+ "greater-than": "Større end",
+ "greater-than-equals": "Større end eller lig med",
+ "grouped": "Gruperet",
+ "growth": "Vækst",
+ "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.",
+ "invalid-url": "Ugyldig URL",
+ "is": "Er",
+ "is-false": "Er falsk",
+ "is-not": "Er ikke",
+ "is-not-set": "Er ikke sat",
+ "is-set": "Er sat",
+ "is-true": "Er sandt",
+ "join": "Deltag",
+ "join-team": "Deltag i team",
+ "journey": "Rejse",
+ "journey-description": "Forstå hvordan brugere navigerer på din hjemmeside.",
+ "journeys": "Rejser",
+ "language": "Sprog",
+ "languages": "Sprog",
+ "laptop": "Laptop",
+ "last-click": "Sidste klik",
+ "last-days": "Sidste {x} dage",
+ "last-hours": "Sidste {x} timer",
+ "last-months": "Sidste {x} måneder",
+ "last-seen": "Sidst set",
+ "lcp": "LCP",
+ "leave": "Forlad",
+ "leave-team": "Forlad team",
+ "less-than": "Mindre end",
+ "less-than-equals": "Mindre end eller lig med",
+ "link": "Link",
+ "links": "Links",
+ "location": "Placering",
+ "login": "Log ind",
+ "logout": "Log ud",
+ "manage": "Administrer",
+ "manager": "Leder",
+ "mask-level": "Maskeniveau",
+ "match": "Match",
+ "match-all": "Alle",
+ "match-any": "Enhver",
+ "max": "Maks",
+ "max-duration": "Maksimal varighed",
+ "maximize": "Udvid",
+ "medium": "Medie",
+ "member": "Medlem",
+ "members": "Medlemmer",
+ "min": "Min",
+ "minute": "Minut",
+ "mobile": "Mobil",
+ "model": "Model",
+ "month": "Måned",
+ "more": "Mere",
+ "my-account": "Min konto",
+ "my-websites": "Mine hjemmesider",
+ "name": "Navn",
+ "needs-improvement": "Behøver forbedring",
+ "new-password": "Ny adgangskode",
+ "none": "Ingen",
+ "number-of-records": "{x} {x, plural, one {post} other {poster}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organisk søgning",
+ "organic-shopping": "Organisk shopping",
+ "organic-social": "Organisk social",
+ "organic-video": "Organisk video",
+ "os": "OS",
+ "other": "Andet",
+ "overview": "Oversigt",
+ "owner": "Ejer",
+ "page": "Side",
+ "page-of": "Side {current} af {total}",
+ "page-views": "Sidevisninger",
+ "pages": "Sider",
+ "pageTitle": "Sidetitel",
+ "paid-ads": "Betalte annoncer",
+ "paid-search": "Betalt søgning",
+ "paid-shopping": "Betalt shopping",
+ "paid-social": "Betalt social",
+ "paid-video": "Betalt video",
+ "password": "Adgangskode",
+ "path": "Sti",
+ "paths": "Stier",
+ "performance": "Ydeevne",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Afspil",
+ "poor": "Dårlig",
+ "powered-by": "Drevet af {name}",
+ "preferences": "Præferencer",
+ "previous": "Forrige",
+ "previous-period": "Forrige periode",
+ "previous-year": "Forrige år",
+ "profile": "Profil",
+ "profiles": "Profiler",
+ "properties": "Egenskaber",
+ "property": "Egenskab",
+ "queries": "Forespørgsler",
+ "query": "Forespørgsel",
+ "query-parameters": "Forespørgselsparametre",
+ "realtime": "Realtid",
+ "recorded": "Optaget den",
+ "referral": "Henvisning",
+ "referrer": "Henviser",
+ "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",
+ "replay": "Afspilning",
+ "replay-enabled": "Afspilning aktiveret",
+ "replay-id": "Replay ID",
+ "replays": "Afspilninger",
+ "reports": "Rapporter",
+ "required": "Påkrævet",
+ "reset": "Nulstil",
+ "reset-website": "Nulstil statistik",
+ "retention": "Fastholdelse",
+ "retention-days": "Opbevaringsdage",
+ "retention-description": "Mål hvor ofte brugere vender tilbage til din hjemmeside.",
+ "revenue": "Indtægt",
+ "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-segment": "Gem segment",
+ "screen": "Skærm",
+ "screens": "Skærme",
+ "search": "Søg",
+ "segment": "Segment",
+ "segments": "Segmenter",
+ "select": "Vælg",
+ "select-component": "Vælg komponent",
+ "select-date": "Vælg dato",
+ "select-filter": "Vælg filter",
+ "select-role": "Vælg rolle",
+ "select-website": "Vælg hjemmeside",
+ "session": "Session",
+ "session-data": "Sessionsdata",
+ "sessions": "Sessioner",
+ "settings": "Indstillinger",
+ "share": "Del",
+ "share-url": "Del URL",
+ "single-day": "Enkelt dag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Kilde",
+ "sources": "Kilder",
+ "start-step": "Starttrin",
+ "steps": "Trin",
+ "sum": "Sum",
+ "support": "Support",
+ "switch-account": "Skift konto",
+ "table": "Tabel",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tags",
+ "team": "Hold",
+ "team-id": "Hold-ID",
+ "team-manager": "Teamleder",
+ "team-member": "Teammedlem",
+ "team-name": "Teamnavn",
+ "team-owner": "Teamejer",
+ "team-settings": "Teamindstillinger",
+ "team-view-only": "Kun visning af team",
+ "team-websites": "Teamets hjemmesider",
+ "teams": "Hold",
+ "term": "Søgeord",
+ "terms": "Vilkår",
+ "theme": "Tema",
+ "this-month": "Denne måned",
+ "this-week": "Denne uge",
+ "this-year": "Dette år",
+ "timezone": "Tidszone",
+ "title": "Titel",
+ "today": "Idag",
+ "toggle-charts": "Ændre graf",
+ "total": "Total",
+ "total-records": "Samlede poster",
+ "tracking-code": "Sporingskode",
+ "traffic": "Trafik",
+ "transactions": "Transaktioner",
+ "transfer": "Overfør",
+ "transfer-website": "Overfør website",
+ "true": "Sand",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "unique": "Unik",
+ "unique-events": "Unikke begivenheder",
+ "unique-visitors": "Unikke besøgende",
+ "uniqueCustomers": "Unikke kunder",
+ "unknown": "Ukendt",
+ "untitled": "Uden titel",
+ "update": "Opdater",
+ "url": "URL",
+ "user": "Bruger",
+ "username": "Brugernavn",
+ "users": "Brugere",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampagne",
+ "utm-content": "UTM-indhold",
+ "utm-description": "Spor dine kampagner via UTM-parametre.",
+ "utm-medium": "UTM-medie",
+ "utm-source": "UTM-kilde",
+ "utm-term": "UTM-søgeord",
+ "value": "Værdi",
+ "version": "Version",
+ "view": "Vis",
+ "view-details": "Vis detajler",
+ "view-only": "Kun visning",
+ "views": "Visninger",
+ "views-per-visit": "Visninger per besøg",
+ "visit-duration": "Gennemsnitlig besøgstid",
+ "visitors": "Besøgende",
+ "visits": "Besøg",
+ "website": "Website",
+ "website-id": "Website-ID",
+ "websites": "Hjemmesider",
+ "window": "Vindue",
+ "yesterday": "I går"
+ },
+ "message": {
+ "action-confirmation": "Skriv {confirmation} i feltet herunder for at bekræfte.",
+ "active-users": "{x} nuværende {x, plural, one {bruger} other {brugere}}",
+ "bad-request": "Ugyldig forespørgsel",
+ "collected-data": "Indsamlede data",
+ "confirm-delete": "Er du sikker på at du vil slette {target}?",
+ "confirm-leave": "Er du sikker på, at du vil forlade {target} ?",
+ "confirm-remove": "Er du sikker på, at du vil fjerne {target} ?",
+ "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.",
+ "event-log": "{event} på {url} ",
+ "forbidden": "Forbudt",
+ "go-to-settings": "Gå til betjeningspanel",
+ "incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
+ "invalid-domain": "Ugyldigt domæne",
+ "min-password-length": "Minimumlængde på {n} tegn",
+ "new-version-available": "En ny version af Umami {version} er tilgængelig!",
+ "no-data-available": "Ingen data tilgængelig.",
+ "no-event-data": "Ingen begivenhedsdata tilgængelig.",
+ "no-match-password": "Adgangskoderne matcher ikke",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Dette hold har ingen websites.",
+ "no-teams": "Du har ikke oprettet nogen hold.",
+ "no-users": "Der er ingen brugere.",
+ "no-websites-configured": "Du har ikke konfigureret nogen hjemmesider.",
+ "not-found": "Ikke fundet",
+ "nothing-selected": "Intet valgt.",
+ "page-not-found": "Side ikke fundet.",
+ "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-component-preview": "Vælg en komponent for at se forhåndsvisning",
+ "select-website-first": "Vælg et websted først",
+ "sever-error": "Serverfejl",
+ "share-url": "Dette er den offentlige delings-URL til {target}.",
+ "team-already-member": "Du er allerede medlem af holdet.",
+ "team-not-found": "Hold ikke fundet.",
+ "team-websites-info": "Websites kan ses af alle på holdet.",
+ "tracking-code": "Sporingskode",
+ "transfer-team-website-to-user": "Overfør denne website til din konto?",
+ "transfer-user-website-to-team": "Vælg holdet, som denne website skal overføres til.",
+ "transfer-website": "Overfør websiteejerskab til din konto eller et andet hold.",
+ "triggered-event": "Udløst begivenhed",
+ "unauthorized": "Ikke autoriseret",
+ "user-deleted": "Bruger slettet.",
+ "viewed-page": "Vist side",
+ "visitor-log": "Besøgende fra {country} bruger {browser} på {os} {device} "
+ }
}
diff --git a/public/intl/messages/de-CH.json b/public/intl/messages/de-CH.json
index 37f1b9de6..fecef5cc1 100644
--- a/public/intl/messages/de-CH.json
+++ b/public/intl/messages/de-CH.json
@@ -1,1860 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Zuegangscode"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Aktione"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Aktivitätsverlauf"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "hinzuefüege"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Beschriibig hinzuefüege"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Mitglied hinzuefüege"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Schritt hinzuefüege"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Websiite hinzuefüege"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Nach"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alli"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Gsamte Zitruum"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Durchschnitt"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Zrugg"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Vor"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Absprungsrate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Uufschlüsselig"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Abbreche"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Passwort ändere"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Städt"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Stadt"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Alles lösche"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Vergliiche"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Bestätige"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Passwort widerhole"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Enthaltet"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Wiiter"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Azahl"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Länder"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Erstelle"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Bricht erstelle"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Team erstelle"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Benutzer erstelle"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Erstellt"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Aktuell"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Aktuells Passwort"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Benutzerdefinierte Bereich"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Übersicht"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Datä"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datumsbereich"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Tag"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Voriigstellte Datumsbereich"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Lösche"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Bricht lösche"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Team lösche"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Benutzer lösche"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Websiite lösche"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Beschriibig"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Grät"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Grät"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Verwärfe"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Enthaltet nid"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Absprung"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Bearbeite"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Dashboard bearbeite"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Mitglied bearbeite"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Freigab-URL aktiviere"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Schlussschritt"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Iigangs URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Ereigniss"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Ereigniss Date"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Ereigniss"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Uusgangs URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Falsch"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Fäld"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fälder"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombiniert"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Rohdate"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Erstmal gse"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Tunnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Verstönd Sie d Konversions- und Abspruungsrate vo Nutzer."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Ziel"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Ziele"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "verfolged Sie Ihri Ziel für Siitenufrüef und Ereigniss."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Grösser als"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Grösser oder gliich"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Iiblick"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Vertüfed Sie sich i Ihri Date, mit Hilf vo Segment und Filter."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Isch"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Isch nid"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Isch ned gsetzt"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Isch gsetzt"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Biträte"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Team biträte"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Reis"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Verstönd Sie, wie Nutzer dur Ihri Website navigiered."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Sprach"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Sprache"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Letzti "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Täg"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Letzti "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Stunde"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Letzti "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Mönet"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Zletzt gse"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Verlah"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Team verlah"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Kliiner als"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Kliiner oder gliich"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Aamälde"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Abmälde"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Verwalte"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Mitglied"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Mitglieder"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Händy"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Meh"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Min Account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mini Websiite"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Name"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Neus Passwort"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Keis"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Übersicht"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Bsitzer"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Siite "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " vo "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Siitenufrüef"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Siitetitel"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Siite"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Passwort"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Pfad"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Pfade"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Betriibe dur "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Vorherig"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Vorherigi Periode"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Vorherigs Jahr"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Abfrage"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Abfrag"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Abfragparameter"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Echtzit"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Verwiiser"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Verwiisendi"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Aktualisiere"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Erneuere"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regionä"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Entferne"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Mitglied entferne"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Brichte"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Erforderlich"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Zruggsetze"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Statistik zruggsetze"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mässed Sie d Verwiilduur vo Ihrere Website, indem Sie verfolged wie oft ihri Nutzer zruggkehred."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Umsatz"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Lueged Sie sich Ihre Umsatz im Lauf vor Ziit a."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Umsatzeigenschafte"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rollä"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Abfrag starte"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Speichere"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Bildschirmuflösige"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Sueche"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Auswähle"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Datä uuswähle"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Rollä uuswähle"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Websiite uuswähle"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sitzig"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sitzige"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Istellige"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Freigab-URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Ein Tag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Startschritt"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Schritt"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Summe"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team Manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team Mitglied"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team Name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team Bsitzer"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Nur für Teammitglieder sichtbar"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team Websiite"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Thema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Dä Monet"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Diä Wuuche"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Das Johr"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Ziitzone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titel"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hüt"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Charts umschalte"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Gsamti Datesätz"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Tracking Code"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaktione"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transferiere"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Websiite transferiere"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Wahr"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Typ"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Einzigartigi"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Einzigartigi Bsuecher"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Einzigartigi Kunde"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Unbekannt"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Unbennant"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Benutzer"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Benutzereigeschafte"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Benutzername"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Benutzer"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Tracked Sie Ihri Kampagnen mit UTM Parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Wärt"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Azeige"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Details azeige"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Nume aluege"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Ufrüef"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Ufrüef pro Bsuech"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Durchschn. Bsuechsziit"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Bsuecher"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Bsüech"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Websiite ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websiite"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Fenster"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Gester"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Typed Sie "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " is Feld underhalb um z bestätige."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "aktive Bsuecher"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "aktivi Bsuecher"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Gsammleti Date"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Sind Sie sich sicher, "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zlösche?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Sind Sie sich sicher, "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zverlah?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Sind Sie sich sicher, dass Sie "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " wänd entferne?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Sind Sie sicher, dass Sie d Statistike vo "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zruggsetze wänd?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Es Team lösche dued ebefalls alli team Websiite lösche."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Alli dezueghörige Date werded ebefalls glöscht."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Es isch en Fehler ufträte."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " uf "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Zu de Istellige"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Falsches Passwort oder Benutzername."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ungültigi Domain"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Miminamli längi vo "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " Zeiche"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Es isch en neue Version vo Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " verfügbar!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Kei Date vorhande."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Es sind kei Event Date verfügbar."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwörter stimmed ned überi"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Kei Ergäbnis gfunde."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Dem Team sind kei Websiite zuegordnet."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Bisher sind no kei Teams erstellt worde."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Da gits kei Benutzer"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Es isch kei Websiite vorhande."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Siite ned gfunde."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Um die Websiite zruggzsetze, typed Sie "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " is Feld unde dran."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Alli Date für die Websiite werdet glöscht, nur de Tracking Code blibt bestah."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Erfolgrich gspeichert."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Ihri Websiitestatistik isch under de folgende URL öffentlich zuegänglich:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Sie sind bereits es Mitglied vo däm Team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team nöd gfunde."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websiite chöi vo jedem im Team agluegt werde"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Tracking Code"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Websiite uf zu Ihrem Account transferiere?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Wähled Sie s Team zum däm Websiite transferiert werde söll."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Übertraged Sie d Websiite Eigetümerrecht uf Ihre Account oder uf es anders Team"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Usglösts Ereigniss"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Bnutzer glöscht."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Siite agluegt"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Bsuecher us "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " nutzt "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " uf "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Bsuercher verlore"
- }
- ]
+ "label": {
+ "access-code": "Zuegangscode",
+ "account": "Konto",
+ "action": "Aktion",
+ "actions": "Aktione",
+ "activity": "Aktivitätsverlauf",
+ "add": "hinzuefüege",
+ "add-board": "Board hinzuefüege",
+ "add-description": "Beschriibig hinzuefüege",
+ "add-link": "Link hinzufügen",
+ "add-member": "Mitglied hinzuefüege",
+ "add-pixel": "Pixel hinzufügen",
+ "add-step": "Schritt hinzuefüege",
+ "add-website": "Websiite hinzuefüege",
+ "admin": "Administrator",
+ "affiliate": "Partnerprogramm",
+ "after": "Nach",
+ "all": "Alli",
+ "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",
+ "average": "Durchschnitt",
+ "back": "Zrugg",
+ "before": "Vor",
+ "behavior": "Verhalte",
+ "block-selector": "Blockauswahl",
+ "boards": "Boards",
+ "bounce-rate": "Absprungsrate",
+ "breakdown": "Uufschlüsselig",
+ "browser": "Browser",
+ "browsers": "Browser",
+ "campaign": "Kampagne",
+ "campaigns": "Kampagne",
+ "cancel": "Abbreche",
+ "change-password": "Passwort ändere",
+ "channel": "Kanal",
+ "channels": "Kanäle",
+ "chart": "Diagramm",
+ "cities": "Städt",
+ "city": "Stadt",
+ "clear-all": "Alles lösche",
+ "cls": "CLS",
+ "cohort": "Gruppe",
+ "cohorts": "Kohorten",
+ "compare": "Vergliiche",
+ "compare-dates": "Datum vergleiche",
+ "confirm": "Bestätige",
+ "confirm-password": "Passwort widerhole",
+ "contains": "Enthaltet",
+ "content": "Inhalt",
+ "continue": "Wiiter",
+ "conversion": "Umwandlig",
+ "conversion-rate": "Umwandligsrate",
+ "conversion-step": "Umwandligsschritt",
+ "count": "Azahl",
+ "countries": "Länder",
+ "country": "Land",
+ "create": "Erstelle",
+ "create-report": "Bricht erstelle",
+ "create-team": "Team erstelle",
+ "create-user": "Benutzer erstelle",
+ "created": "Erstellt",
+ "created-by": "Erstellt vo",
+ "criteria": "Kriterien",
+ "currency": "Währung",
+ "current": "Aktuell",
+ "current-password": "Aktuells Passwort",
+ "custom-range": "Benutzerdefinierte Bereich",
+ "dashboard": "Übersicht",
+ "data": "Datä",
+ "date": "Datum",
+ "date-range": "Datumsbereich",
+ "day": "Tag",
+ "default-date-range": "Voriigstellte Datumsbereich",
+ "delete": "Lösche",
+ "delete-report": "Bricht lösche",
+ "delete-team": "Team lösche",
+ "delete-user": "Benutzer lösche",
+ "delete-website": "Websiite lösche",
+ "description": "Beschriibig",
+ "desktop": "Desktop",
+ "destination-url": "Ziel-URL",
+ "details": "Details",
+ "device": "Grät",
+ "devices": "Grät",
+ "direct": "Direkt",
+ "dismiss": "Verwärfe",
+ "distinct-id": "Eindeutigi ID",
+ "documentation": "Dokumentation",
+ "does-not-contain": "Enthaltet nid",
+ "does-not-include": "Isch nid debii",
+ "doest-not-exist": "Existiert nid",
+ "domain": "Domain",
+ "download": "Herunterladen",
+ "dropoff": "Absprung",
+ "duration": "Dauer",
+ "edit": "Bearbeite",
+ "edit-member": "Mitglied bearbeite",
+ "email": "E-Mail",
+ "enable-share-url": "Freigab-URL aktiviere",
+ "end-step": "Schlussschritt",
+ "entry": "Iigangs URL",
+ "environment": "Umgebung",
+ "event": "Ereigniss",
+ "event-data": "Ereigniss Date",
+ "event-name": "Ereignissname",
+ "events": "Ereigniss",
+ "exclude-bounce": "Absprung ausschliessen",
+ "exists": "Existiert",
+ "exit": "Uusgangs URL",
+ "false": "Falsch",
+ "fcp": "FCP",
+ "field": "Fäld",
+ "fields": "Fälder",
+ "filter": "Filter",
+ "filter-combined": "Kombiniert",
+ "filter-raw": "Rohdate",
+ "filters": "Filter",
+ "first-click": "Erste Klick",
+ "first-seen": "Erstmal gse",
+ "funnel": "Tunnel",
+ "funnel-description": "Verstönd Sie d Konversions- und Abspruungsrate vo Nutzer.",
+ "funnels": "Trichter",
+ "goal": "Ziel",
+ "goals": "Ziele",
+ "goals-description": "verfolged Sie Ihri Ziel für Siitenufrüef und Ereigniss.",
+ "good": "Gut",
+ "greater-than": "Grösser als",
+ "greater-than-equals": "Grösser oder gliich",
+ "grouped": "Gruppiert",
+ "growth": "Wachstum",
+ "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.",
+ "invalid-url": "Ungültige URL",
+ "is": "Isch",
+ "is-false": "Isch falsch",
+ "is-not": "Isch nid",
+ "is-not-set": "Isch ned gsetzt",
+ "is-set": "Isch gsetzt",
+ "is-true": "Isch wahr",
+ "join": "Biträte",
+ "join-team": "Team biträte",
+ "journey": "Reis",
+ "journey-description": "Verstönd Sie, wie Nutzer dur Ihri Website navigiered.",
+ "journeys": "Reise",
+ "language": "Sprach",
+ "languages": "Sprache",
+ "laptop": "Laptop",
+ "last-click": "Letzte Klick",
+ "last-days": "Letzti {x} Täg",
+ "last-hours": "Letzti {x} Stunde",
+ "last-months": "Letzti {x} Mönet",
+ "last-seen": "Zletzt gse",
+ "lcp": "LCP",
+ "leave": "Verlah",
+ "leave-team": "Team verlah",
+ "less-than": "Kliiner als",
+ "less-than-equals": "Kliiner oder gliich",
+ "link": "Link",
+ "links": "Links",
+ "location": "Standort",
+ "login": "Aamälde",
+ "logout": "Abmälde",
+ "manage": "Verwalte",
+ "manager": "Verwalter",
+ "mask-level": "Maskierungsstufe",
+ "match": "Übereinstimmung",
+ "match-all": "Alle",
+ "match-any": "Beliebige",
+ "max": "Max",
+ "max-duration": "Maximale Dauer",
+ "maximize": "Uusklappe",
+ "medium": "Medium",
+ "member": "Mitglied",
+ "members": "Mitglieder",
+ "min": "Min",
+ "minute": "Minute",
+ "mobile": "Händy",
+ "model": "Modell",
+ "month": "Monat",
+ "more": "Meh",
+ "my-account": "Min Account",
+ "my-websites": "Mini Websiite",
+ "name": "Name",
+ "needs-improvement": "Verbesserungsbedarf",
+ "new-password": "Neus Passwort",
+ "none": "Keis",
+ "number-of-records": "{x} {x, plural, one {Datensatz} other {Datensätze}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organischi Suechi",
+ "organic-shopping": "Organischi Iikauf",
+ "organic-social": "Organischi Social Media",
+ "organic-video": "Organischi Video",
+ "os": "OS",
+ "other": "Anderi",
+ "overview": "Übersicht",
+ "owner": "Bsitzer",
+ "page": "Siite",
+ "page-of": "Siite {current} vo {total}",
+ "page-views": "Siitenufrüef",
+ "pages": "Siite",
+ "pageTitle": "Siitetitel",
+ "paid-ads": "Bezahlti Werbung",
+ "paid-search": "Bezahlti Suechi",
+ "paid-shopping": "Bezahlti Iikauf",
+ "paid-social": "Bezahlti Social Media",
+ "paid-video": "Bezahlti Video",
+ "password": "Passwort",
+ "path": "Pfad",
+ "paths": "Pfade",
+ "performance": "Leistung",
+ "pixel": "Pixel",
+ "pixels": "Pixel",
+ "play": "Abspielen",
+ "poor": "Schlecht",
+ "powered-by": "Betriibe dur {name}",
+ "preferences": "Einstellungen",
+ "previous": "Vorherig",
+ "previous-period": "Vorherigi Periode",
+ "previous-year": "Vorherigs Jahr",
+ "profile": "Profil",
+ "profiles": "Profile",
+ "properties": "Eigeschafte",
+ "property": "Eigeschafte",
+ "queries": "Abfrage",
+ "query": "Abfrag",
+ "query-parameters": "Abfragparameter",
+ "realtime": "Echtzit",
+ "recorded": "Aufgezeichnet am",
+ "referral": "Empfehlig",
+ "referrer": "Verwiiser",
+ "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",
+ "replay": "Wiedergabe",
+ "replay-enabled": "Wiedergabe aktiviert",
+ "replay-id": "Replay ID",
+ "replays": "Wiedergaben",
+ "reports": "Brichte",
+ "required": "Erforderlich",
+ "reset": "Zruggsetze",
+ "reset-website": "Statistik zruggsetze",
+ "retention": "Retention",
+ "retention-days": "Aufbewahrungstage",
+ "retention-description": "Mässed Sie d Verwiilduur vo Ihrere Website, indem Sie verfolged wie oft ihri Nutzer zruggkehred.",
+ "revenue": "Umsatz",
+ "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-segment": "Segment speichern",
+ "screen": "Bildschirm",
+ "screens": "Bildschirmuflösige",
+ "search": "Sueche",
+ "segment": "Segment",
+ "segments": "Segmente",
+ "select": "Auswähle",
+ "select-component": "Komponente auswählen",
+ "select-date": "Datä uuswähle",
+ "select-filter": "Filter uuswähle",
+ "select-role": "Rollä uuswähle",
+ "select-website": "Websiite uuswähle",
+ "session": "Sitzig",
+ "session-data": "Sitzigsdate",
+ "sessions": "Sitzige",
+ "settings": "Istellige",
+ "share": "Teile",
+ "share-url": "Freigab-URL",
+ "single-day": "Ein Tag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Quelle",
+ "sources": "Quälle",
+ "start-step": "Startschritt",
+ "steps": "Schritt",
+ "sum": "Summe",
+ "support": "Support",
+ "switch-account": "Konto wechseln",
+ "table": "Tabelle",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Stichwort",
+ "team": "Team",
+ "team-id": "Team-ID",
+ "team-manager": "Team Manager",
+ "team-member": "Team Mitglied",
+ "team-name": "Team Name",
+ "team-owner": "Team Bsitzer",
+ "team-settings": "Team Istellige",
+ "team-view-only": "Nur für Teammitglieder sichtbar",
+ "team-websites": "Team Websiite",
+ "teams": "Teams",
+ "term": "Suchbegriff",
+ "terms": "Bedingige",
+ "theme": "Thema",
+ "this-month": "Dä Monet",
+ "this-week": "Diä Wuuche",
+ "this-year": "Das Johr",
+ "timezone": "Ziitzone",
+ "title": "Titel",
+ "today": "Hüt",
+ "toggle-charts": "Charts umschalte",
+ "total": "Total",
+ "total-records": "Gsamti Datesätz",
+ "tracking-code": "Tracking Code",
+ "traffic": "Traffic",
+ "transactions": "Transaktione",
+ "transfer": "Transferiere",
+ "transfer-website": "Websiite transferiere",
+ "true": "Wahr",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Einzigartigi",
+ "unique-events": "Einzigartige Ereignisse",
+ "unique-visitors": "Einzigartigi Bsuecher",
+ "uniqueCustomers": "Einzigartigi Kunde",
+ "unknown": "Unbekannt",
+ "untitled": "Unbennant",
+ "update": "Aktualisieren",
+ "url": "URL",
+ "user": "Benutzer",
+ "username": "Benutzername",
+ "users": "Benutzer",
+ "utm": "UTM",
+ "utm-campaign": "UTM-Kampagne",
+ "utm-content": "UTM-Inhalt",
+ "utm-description": "Tracked Sie Ihri Kampagnen mit UTM Parameters.",
+ "utm-medium": "UTM-Medium",
+ "utm-source": "UTM-Quelle",
+ "utm-term": "UTM-Begriff",
+ "value": "Wärt",
+ "version": "Version",
+ "view": "Azeige",
+ "view-details": "Details azeige",
+ "view-only": "Nume aluege",
+ "views": "Ufrüef",
+ "views-per-visit": "Ufrüef pro Bsuech",
+ "visit-duration": "Durchschn. Bsuechsziit",
+ "visitors": "Bsuecher",
+ "visits": "Bsüech",
+ "website": "Website",
+ "website-id": "Websiite ID",
+ "websites": "Websiite",
+ "window": "Fenster",
+ "yesterday": "Gester"
+ },
+ "message": {
+ "action-confirmation": "Typed Sie {confirmation} is Feld underhalb um z bestätige.",
+ "active-users": "{x} {x, plural, one {aktive Bsuecher} other {aktivi Bsuecher}}",
+ "bad-request": "Ungültige Anfrage",
+ "collected-data": "Gsammleti Date",
+ "confirm-delete": "Sind Sie sich sicher, {target} zlösche?",
+ "confirm-leave": "Sind Sie sich sicher, {target} zverlah?",
+ "confirm-remove": "Sind Sie sich sicher, dass Sie {target} wänd entferne?",
+ "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.",
+ "event-log": "{event} uf {url} ",
+ "forbidden": "Verboten",
+ "go-to-settings": "Zu de Istellige",
+ "incorrect-username-password": "Falsches Passwort oder Benutzername.",
+ "invalid-domain": "Ungültigi Domain",
+ "min-password-length": "Miminamli längi vo {n} Zeiche",
+ "new-version-available": "Es isch en neue Version vo Umami {version} verfügbar!",
+ "no-data-available": "Kei Date vorhande.",
+ "no-event-data": "Es sind kei Event Date verfügbar.",
+ "no-match-password": "Passwörter stimmed ned überi",
+ "no-results-found": "Kei Ergäbnis gfunde.",
+ "no-team-websites": "Dem Team sind kei Websiite zuegordnet.",
+ "no-teams": "Bisher sind no kei Teams erstellt worde.",
+ "no-users": "Da gits kei Benutzer",
+ "no-websites-configured": "Es isch kei Websiite vorhande.",
+ "not-found": "Nicht gefunden",
+ "nothing-selected": "Nichts ausgewählt.",
+ "page-not-found": "Siite ned gfunde.",
+ "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-component-preview": "Wählen Sie eine Komponente für die Vorschau",
+ "select-website-first": "Wählen Sie zuerst eine Website",
+ "sever-error": "Serverfehler",
+ "share-url": "Ihri Websiitestatistik isch under de folgende URL öffentlich zuegänglich:",
+ "team-already-member": "Sie sind bereits es Mitglied vo däm Team.",
+ "team-not-found": "Team nöd gfunde.",
+ "team-websites-info": "Websiite chöi vo jedem im Team agluegt werde",
+ "tracking-code": "Tracking Code",
+ "transfer-team-website-to-user": "Websiite uf zu Ihrem Account transferiere?",
+ "transfer-user-website-to-team": "Wähled Sie s Team zum däm Websiite transferiert werde söll.",
+ "transfer-website": "Übertraged Sie d Websiite Eigetümerrecht uf Ihre Account oder uf es anders Team",
+ "triggered-event": "Usglösts Ereigniss",
+ "unauthorized": "Nicht autorisiert",
+ "user-deleted": "Bnutzer glöscht.",
+ "viewed-page": "Siite agluegt",
+ "visitor-log": "Bsuecher us {country} nutzt {browser} uf {os} {device} "
+ }
}
diff --git a/public/intl/messages/de-DE.json b/public/intl/messages/de-DE.json
index b5ec87931..e5be06cb9 100644
--- a/public/intl/messages/de-DE.json
+++ b/public/intl/messages/de-DE.json
@@ -1,1856 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Zugangscode"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Aktionen"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Aktivitätsverlauf"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Hinzufügen"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Beschreibung hinzufügen"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Mitglied hinzufügen"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Schritt hinzufügen"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Website hinzufügen"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Nach"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alle"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Gesamter Zeitraum"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analysen"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Durchschnitt"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Zurück"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Vor"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Absprungrate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Aufschlüsselung"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Abbrechen"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Passwort ändern"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Städte"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Stadt"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Alles löschen"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Vergleichen"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Bestätigen"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Passwort wiederholen"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Enthält"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Weiter"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Anzahl"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Länder"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Erstellen"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Bericht erstellen"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Team erstellen"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Benutzer erstellen"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Erstellt"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Erstellt von"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Aktuell"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Derzeitiges Passwort"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Benutzerdefinierter Bereich"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Übersicht"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Daten"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datumsbereich"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Tag"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Voreingestellter Datumsbereich"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Löschen"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Bericht löschen"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Team löschen"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Benutzer löschen"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Website löschen"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Beschreibung"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Gerät"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Geräte"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Verwerfen"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Enthält nicht"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Absprung"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Bearbeiten"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Dashboard bearbeiten"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Mitglied bearbeiten"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Freigabe-URL aktivieren"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Schlussschritt"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Eingangs-URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Ereignis"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Ereignisdaten"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Ereignisse"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Ausgangs-URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Falsch"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Feld"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Felder"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombiniert"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Rohdaten"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Erstmalig gesehen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Trichter"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Verstehen Sie die Konversions- und Absprungrate Ihrer Nutzer."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Ziel"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Ziele"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Größer als"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Größer oder gleich"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Einblicke"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Vertiefen Sie sich mit Hilfe von Segmenten und Filtern in Ihre Daten."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Ist"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Ist nicht"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Ist nicht gesetzt"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Ist gesetzt"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Beitreten"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Team beitreten"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Reise"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Verstehen Sie, wie Nutzer auf Ihrer Website navigieren."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Sprache"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Sprachen"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Letzten "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Tage"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Letzten "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Stunden"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Letzten "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Monate"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Zuletzt gesehen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Verlassen"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Team verlassen"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Kleiner als"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Kleiner oder gleich"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Anmelden"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Abmelden"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Verwalten"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Verwaltung"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Mitglied"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Mitglieder"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Handy"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mehr"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Mein Account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Meine Websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Name"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Neues Passwort"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Keine"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Übersicht"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Besitzer"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Seite "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " von "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Seitenaufrufe"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Seitentitel"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Seiten"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Passwort"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Pfad"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Pfade"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Betrieben durch "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Vorherig"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Vorherige Periode"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Vorheriges Jahr"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Eigenschaften"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Eigentum"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Abfragen"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Abfrage"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Abfrageparameter"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Echtzeit"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Übermittler"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Übermittler"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Aktualisieren"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Erneuern"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regionen"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Entfernen"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Mitglied entfernen"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Berichte"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Erforderlich"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Zurücksetzen"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Statistik zurücksetzen"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Erhalt"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Messen Sie die Verweildauer auf Ihrer Website, indem Sie verfolgen, wie oft die Nutzer zurückkehren."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Umsatz"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Haben Sie einen Blick auf Ihre Umsätze im Laufe der Zeit."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Umsatzeigenschaften"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rolle"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Abfrage starten"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Speichern"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Bildschirmauflösungen"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Suche"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Auswählen"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Datum auswählen"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Rolle auswählen"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Website auswählen"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sitzung"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sitzungen"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Einstellungen"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Freigabe-URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Ein Tag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Startschritt"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Schritte"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Summe"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team-ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team-Manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team-Mitglied"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Name des Teams"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team-Eigentümer"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Nur für Team-Mitglieder sichtbar"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team-Websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Thema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Diesen Monat"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Diese Woche"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Dieses Jahr"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zeitzone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titel"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Heute"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Schaubilder umschalten"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Gesamt"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Datensätze insgesamt"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Tracking Code"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaktionen"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Übertragung"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Website übertragen"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Wahr"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Typ"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Einzigartig"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Einzigartige Besucher"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Einzigartige Kunden"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Unbekannt"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Unbenannt"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Benutzer"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Benutzereigenschaften"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Benutzername"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Benutzer"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Tracken Sie Ihre Kampagnen mit UTM Parametern."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Wert"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Anzeigen"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Details anzeigen"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Nur ansehen"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Aufrufe"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Aufrufe pro Besuch"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Durchschn. Besuchszeit"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Besucher"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Besuche"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website-ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Fenster"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Gestern"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Schreibe "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in die Box zur bestätigung."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "aktiver Besucher"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "aktive Besucher"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Gesammelte Daten"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Sind Sie sich sicher, "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zu löschen?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Sind Sie sicher, dass die "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " verlassen möchten?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Sind Sie sicher, "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zu entfernen?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Sind Sie sicher, dass Sie die Statistiken von "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " zurücksetzen wollen?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Ein Team zu löschen, wird auch alle Team-Websites löschen."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Alle zugehörigen Daten werden ebenfalls gelöscht."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Es ist ein Fehler aufgetreten."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " auf "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Zu den Einstellungen"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Falsches Passwort oder Benutzername."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ungültige Domain"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimale Länge von "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " Zeichen"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Eine neue Version von Umami ist verfügbar: "
- },
- {
- "type": 1,
- "value": "version"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Keine Daten vorhanden."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Es sind keine Ereignisdaten verfügbar."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwörter stimmen nicht überein"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Keine Ergebnisse gefunden."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Diesem Team sind keine Websites zugeordnet."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Bisher wurden keine Teams erstellt."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Hier gibt es keine Benutzer."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Es ist keine Website vorhanden."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Seite nicht gefunden."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Um diese Website zurückzusetzen, geben Sie zur Bestätigung "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in das Feld unten ein."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Alle Daten für diese Website werden gelöscht, jedoch bleibt der Tracking Code bestehen."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Erfolgreich gespeichert."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Die Statistiken Ihrer Website sind unter folgender URL öffentlich zugänglich:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Sie sind bereits Mitglied des Teams."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team nicht gefunden."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites können von jedem im Team eingesehen werden."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Tracking Code"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Diese Website zu Ihrem Account transferieren?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Wählen Sie ein Team aus, zu dem die Website transferiert werden soll."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Übertragen Sie die Eigentümerrechte zu Ihrem Account oder einem anderen Team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Ereignis ausgelöst"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Benutzer gelöscht."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Seite besucht"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Besucher aus "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " benutzt "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " auf "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Besucherverlust"
- }
- ]
+ "label": {
+ "access-code": "Zugangscode",
+ "account": "Konto",
+ "action": "Aktion",
+ "actions": "Aktionen",
+ "activity": "Aktivitätsverlauf",
+ "add": "Hinzufügen",
+ "add-board": "Board hinzufügen",
+ "add-description": "Beschreibung hinzufügen",
+ "add-link": "Link hinzufügen",
+ "add-member": "Mitglied hinzufügen",
+ "add-pixel": "Pixel hinzufügen",
+ "add-step": "Schritt hinzufügen",
+ "add-website": "Website hinzufügen",
+ "admin": "Administrator",
+ "affiliate": "Partnerprogramm",
+ "after": "Nach",
+ "all": "Alle",
+ "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",
+ "average": "Durchschnitt",
+ "back": "Zurück",
+ "before": "Vor",
+ "behavior": "Verhalten",
+ "block-selector": "Blockauswahl",
+ "boards": "Boards",
+ "bounce-rate": "Absprungrate",
+ "breakdown": "Aufschlüsselung",
+ "browser": "Browser",
+ "browsers": "Browser",
+ "campaign": "Kampagne",
+ "campaigns": "Kampagnen",
+ "cancel": "Abbrechen",
+ "change-password": "Passwort ändern",
+ "channel": "Kanal",
+ "channels": "Kanäle",
+ "chart": "Diagramm",
+ "cities": "Städte",
+ "city": "Stadt",
+ "clear-all": "Alles löschen",
+ "cls": "CLS",
+ "cohort": "Gruppe",
+ "cohorts": "Kohorten",
+ "compare": "Vergleichen",
+ "compare-dates": "Daten vergleichen",
+ "confirm": "Bestätigen",
+ "confirm-password": "Passwort wiederholen",
+ "contains": "Enthält",
+ "content": "Inhalt",
+ "continue": "Weiter",
+ "conversion": "Konversion",
+ "conversion-rate": "Konversionsrate",
+ "conversion-step": "Konversionsschritt",
+ "count": "Anzahl",
+ "countries": "Länder",
+ "country": "Land",
+ "create": "Erstellen",
+ "create-report": "Bericht erstellen",
+ "create-team": "Team erstellen",
+ "create-user": "Benutzer erstellen",
+ "created": "Erstellt",
+ "created-by": "Erstellt von",
+ "criteria": "Kriterien",
+ "currency": "Währung",
+ "current": "Aktuell",
+ "current-password": "Derzeitiges Passwort",
+ "custom-range": "Benutzerdefinierter Bereich",
+ "dashboard": "Übersicht",
+ "data": "Daten",
+ "date": "Datum",
+ "date-range": "Datumsbereich",
+ "day": "Tag",
+ "default-date-range": "Voreingestellter Datumsbereich",
+ "delete": "Löschen",
+ "delete-report": "Bericht löschen",
+ "delete-team": "Team löschen",
+ "delete-user": "Benutzer löschen",
+ "delete-website": "Website löschen",
+ "description": "Beschreibung",
+ "desktop": "Desktop",
+ "destination-url": "Ziel-URL",
+ "details": "Details",
+ "device": "Gerät",
+ "devices": "Geräte",
+ "direct": "Direkt",
+ "dismiss": "Verwerfen",
+ "distinct-id": "Eindeutige ID",
+ "documentation": "Dokumentation",
+ "does-not-contain": "Enthält nicht",
+ "does-not-include": "Nicht enthalten",
+ "doest-not-exist": "Existiert nicht",
+ "domain": "Domain",
+ "download": "Herunterladen",
+ "dropoff": "Absprung",
+ "duration": "Dauer",
+ "edit": "Bearbeiten",
+ "edit-member": "Mitglied bearbeiten",
+ "email": "E-Mail",
+ "enable-share-url": "Freigabe-URL aktivieren",
+ "end-step": "Schlussschritt",
+ "entry": "Eingangs-URL",
+ "environment": "Umgebung",
+ "event": "Ereignis",
+ "event-data": "Ereignisdaten",
+ "event-name": "Ereignisname",
+ "events": "Ereignisse",
+ "exclude-bounce": "Absprung ausschließen",
+ "exists": "Existiert",
+ "exit": "Ausgangs-URL",
+ "false": "Falsch",
+ "fcp": "FCP",
+ "field": "Feld",
+ "fields": "Felder",
+ "filter": "Filter",
+ "filter-combined": "Kombiniert",
+ "filter-raw": "Rohdaten",
+ "filters": "Filter",
+ "first-click": "Erster Klick",
+ "first-seen": "Erstmalig gesehen",
+ "funnel": "Trichter",
+ "funnel-description": "Verstehen Sie die Konversions- und Absprungrate Ihrer Nutzer.",
+ "funnels": "Trichter",
+ "goal": "Ziel",
+ "goals": "Ziele",
+ "goals-description": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse.",
+ "good": "Gut",
+ "greater-than": "Größer als",
+ "greater-than-equals": "Größer oder gleich",
+ "grouped": "Gruppiert",
+ "growth": "Wachstum",
+ "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.",
+ "invalid-url": "Ungültige URL",
+ "is": "Ist",
+ "is-false": "Ist falsch",
+ "is-not": "Ist nicht",
+ "is-not-set": "Ist nicht gesetzt",
+ "is-set": "Ist gesetzt",
+ "is-true": "Ist wahr",
+ "join": "Beitreten",
+ "join-team": "Team beitreten",
+ "journey": "Reise",
+ "journey-description": "Verstehen Sie, wie Nutzer auf Ihrer Website navigieren.",
+ "journeys": "Reisen",
+ "language": "Sprache",
+ "languages": "Sprachen",
+ "laptop": "Laptop",
+ "last-click": "Letzter Klick",
+ "last-days": "Letzten {x} Tage",
+ "last-hours": "Letzten {x} Stunden",
+ "last-months": "Letzten {x} Monate",
+ "last-seen": "Zuletzt gesehen",
+ "lcp": "LCP",
+ "leave": "Verlassen",
+ "leave-team": "Team verlassen",
+ "less-than": "Kleiner als",
+ "less-than-equals": "Kleiner oder gleich",
+ "link": "Link",
+ "links": "Links",
+ "location": "Standort",
+ "login": "Anmelden",
+ "logout": "Abmelden",
+ "manage": "Verwalten",
+ "manager": "Verwaltung",
+ "mask-level": "Maskierungsstufe",
+ "match": "Übereinstimmung",
+ "match-all": "Alle",
+ "match-any": "Beliebige",
+ "max": "Max",
+ "max-duration": "Maximale Dauer",
+ "maximize": "Erweitern",
+ "medium": "Medium",
+ "member": "Mitglied",
+ "members": "Mitglieder",
+ "min": "Min",
+ "minute": "Minute",
+ "mobile": "Handy",
+ "model": "Modell",
+ "month": "Monat",
+ "more": "Mehr",
+ "my-account": "Mein Account",
+ "my-websites": "Meine Websites",
+ "name": "Name",
+ "needs-improvement": "Verbesserungsbedarf",
+ "new-password": "Neues Passwort",
+ "none": "Keine",
+ "number-of-records": "{x} {x, plural, one {Datensatz} other {Datensätze}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organische Suche",
+ "organic-shopping": "Organisches Shopping",
+ "organic-social": "Organisches Social Media",
+ "organic-video": "Organisches Video",
+ "os": "OS",
+ "other": "Andere",
+ "overview": "Übersicht",
+ "owner": "Besitzer",
+ "page": "Seite",
+ "page-of": "Seite {current} von {total}",
+ "page-views": "Seitenaufrufe",
+ "pages": "Seiten",
+ "pageTitle": "Seitentitel",
+ "paid-ads": "Bezahlte Anzeigen",
+ "paid-search": "Bezahlte Suche",
+ "paid-shopping": "Bezahltes Shopping",
+ "paid-social": "Bezahltes Social Media",
+ "paid-video": "Bezahltes Video",
+ "password": "Passwort",
+ "path": "Pfad",
+ "paths": "Pfade",
+ "performance": "Leistung",
+ "pixel": "Pixel",
+ "pixels": "Pixel",
+ "play": "Abspielen",
+ "poor": "Schlecht",
+ "powered-by": "Betrieben durch {name}",
+ "preferences": "Einstellungen",
+ "previous": "Vorherig",
+ "previous-period": "Vorherige Periode",
+ "previous-year": "Vorheriges Jahr",
+ "profile": "Profil",
+ "profiles": "Profile",
+ "properties": "Eigenschaften",
+ "property": "Eigenschaft",
+ "queries": "Abfragen",
+ "query": "Abfrage",
+ "query-parameters": "Abfrageparameter",
+ "realtime": "Echtzeit",
+ "recorded": "Aufgezeichnet am",
+ "referral": "Empfehlung",
+ "referrer": "Übermittler",
+ "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",
+ "replay": "Wiedergabe",
+ "replay-enabled": "Wiedergabe aktiviert",
+ "replay-id": "Replay ID",
+ "replays": "Wiedergaben",
+ "reports": "Berichte",
+ "required": "Erforderlich",
+ "reset": "Zurücksetzen",
+ "reset-website": "Statistik zurücksetzen",
+ "retention": "Erhalt",
+ "retention-days": "Aufbewahrungstage",
+ "retention-description": "Messen Sie die Verweildauer auf Ihrer Website, indem Sie verfolgen, wie oft die Nutzer zurückkehren.",
+ "revenue": "Umsatz",
+ "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-segment": "Segment speichern",
+ "screen": "Bildschirm",
+ "screens": "Bildschirmauflösungen",
+ "search": "Suche",
+ "segment": "Segment",
+ "segments": "Segmente",
+ "select": "Auswählen",
+ "select-component": "Komponente auswählen",
+ "select-date": "Datum auswählen",
+ "select-filter": "Filter auswählen",
+ "select-role": "Rolle auswählen",
+ "select-website": "Website auswählen",
+ "session": "Sitzung",
+ "session-data": "Sitzungsdaten",
+ "sessions": "Sitzungen",
+ "settings": "Einstellungen",
+ "share": "Teilen",
+ "share-url": "Freigabe-URL",
+ "single-day": "Ein Tag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Quelle",
+ "sources": "Quellen",
+ "start-step": "Startschritt",
+ "steps": "Schritte",
+ "sum": "Summe",
+ "support": "Support",
+ "switch-account": "Konto wechseln",
+ "table": "Tabelle",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Stichworte",
+ "team": "Team",
+ "team-id": "Team-ID",
+ "team-manager": "Team-Manager",
+ "team-member": "Team-Mitglied",
+ "team-name": "Name des Teams",
+ "team-owner": "Team-Eigentümer",
+ "team-settings": "Team-Einstellungen",
+ "team-view-only": "Nur für Team-Mitglieder sichtbar",
+ "team-websites": "Team-Websites",
+ "teams": "Teams",
+ "term": "Suchbegriff",
+ "terms": "Bedingungen",
+ "theme": "Thema",
+ "this-month": "Diesen Monat",
+ "this-week": "Diese Woche",
+ "this-year": "Dieses Jahr",
+ "timezone": "Zeitzone",
+ "title": "Titel",
+ "today": "Heute",
+ "toggle-charts": "Schaubilder umschalten",
+ "total": "Gesamt",
+ "total-records": "Datensätze insgesamt",
+ "tracking-code": "Tracking Code",
+ "traffic": "Traffic",
+ "transactions": "Transaktionen",
+ "transfer": "Übertragung",
+ "transfer-website": "Website übertragen",
+ "true": "Wahr",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Einzigartig",
+ "unique-events": "Einzigartige Ereignisse",
+ "unique-visitors": "Einzigartige Besucher",
+ "uniqueCustomers": "Einzigartige Kunden",
+ "unknown": "Unbekannt",
+ "untitled": "Unbenannt",
+ "update": "Aktualisieren",
+ "url": "URL",
+ "user": "Benutzer",
+ "username": "Benutzername",
+ "users": "Benutzer",
+ "utm": "UTM",
+ "utm-campaign": "UTM-Kampagne",
+ "utm-content": "UTM-Inhalt",
+ "utm-description": "Tracken Sie Ihre Kampagnen mit UTM Parametern.",
+ "utm-medium": "UTM-Medium",
+ "utm-source": "UTM-Quelle",
+ "utm-term": "UTM-Begriff",
+ "value": "Wert",
+ "version": "Version",
+ "view": "Anzeigen",
+ "view-details": "Details anzeigen",
+ "view-only": "Nur ansehen",
+ "views": "Aufrufe",
+ "views-per-visit": "Aufrufe pro Besuch",
+ "visit-duration": "Durchschn. Besuchszeit",
+ "visitors": "Besucher",
+ "visits": "Besuche",
+ "website": "Website",
+ "website-id": "Website-ID",
+ "websites": "Websites",
+ "window": "Fenster",
+ "yesterday": "Gestern"
+ },
+ "message": {
+ "action-confirmation": "Schreibe {confirmation} in die Box zur bestätigung.",
+ "active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}",
+ "bad-request": "Ungültige Anfrage",
+ "collected-data": "Gesammelte Daten",
+ "confirm-delete": "Sind Sie sich sicher, {target} zu löschen?",
+ "confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?",
+ "confirm-remove": "Sind Sie sicher, {target} zu entfernen?",
+ "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.",
+ "event-log": "{event} auf {url} ",
+ "forbidden": "Verboten",
+ "go-to-settings": "Zu den Einstellungen",
+ "incorrect-username-password": "Falsches Passwort oder Benutzername.",
+ "invalid-domain": "Ungültige Domain",
+ "min-password-length": "Minimale Länge von {n} Zeichen",
+ "new-version-available": "Eine neue Version von Umami ist verfügbar: {version}",
+ "no-data-available": "Keine Daten vorhanden.",
+ "no-event-data": "Es sind keine Ereignisdaten verfügbar.",
+ "no-match-password": "Passwörter stimmen nicht überein",
+ "no-results-found": "Keine Ergebnisse gefunden.",
+ "no-team-websites": "Diesem Team sind keine Websites zugeordnet.",
+ "no-teams": "Bisher wurden keine Teams erstellt.",
+ "no-users": "Hier gibt es keine Benutzer.",
+ "no-websites-configured": "Es ist keine Website vorhanden.",
+ "not-found": "Nicht gefunden",
+ "nothing-selected": "Nichts ausgewählt.",
+ "page-not-found": "Seite nicht gefunden.",
+ "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-component-preview": "Wählen Sie eine Komponente für die Vorschau",
+ "select-website-first": "Wählen Sie zuerst eine Website",
+ "sever-error": "Serverfehler",
+ "share-url": "Die Statistiken Ihrer Website sind unter folgender URL öffentlich zugänglich:",
+ "team-already-member": "Sie sind bereits Mitglied des Teams.",
+ "team-not-found": "Team nicht gefunden.",
+ "team-websites-info": "Websites können von jedem im Team eingesehen werden.",
+ "tracking-code": "Tracking Code",
+ "transfer-team-website-to-user": "Diese Website zu Ihrem Account transferieren?",
+ "transfer-user-website-to-team": "Wählen Sie ein Team aus, zu dem die Website transferiert werden soll.",
+ "transfer-website": "Übertragen Sie die Eigentümerrechte zu Ihrem Account oder einem anderen Team.",
+ "triggered-event": "Ereignis ausgelöst",
+ "unauthorized": "Nicht autorisiert",
+ "user-deleted": "Benutzer gelöscht.",
+ "viewed-page": "Seite besucht",
+ "visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device} "
+ }
}
diff --git a/public/intl/messages/el-GR.json b/public/intl/messages/el-GR.json
index 29c3efba6..199becdc4 100644
--- a/public/intl/messages/el-GR.json
+++ b/public/intl/messages/el-GR.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Ενέργειες"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Προσθήκη ιστότοπου"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Διαχειριστής"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "All"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Πίσω"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Ποσοστό αναπήδησης"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Προγράμματα περιήγησης"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Ακύρωση"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Αλλαγή κωδικού"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Επιβεβαίωση κωδικού"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Χώρες"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Τωρινός κωδικός πρόσβασης"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Προσαρμοσμένο εύρος"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Πίνακας"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Εύρος ημερομηνιών"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Προεπιλεγμένο εύρος ημερομηνιών"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Διαγραφή"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Διαγραφή ιστότοπου"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Σταθερός υπολογιστής"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Συσκευές"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Dismiss"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Τομέας"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Επεξεργασία"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Ενεργοποίηση κοινής χρήσης URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Γεγονότα"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Σε συνδυασμό"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Ακατέργαστο"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Λάπτοπ"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Τελευταίες "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ημέρες"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Τελευταίες "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ώρες"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Είσοδος"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Αποσύνδεση"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Κινητό"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Περισσότερα"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Όνομα"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Νέος κωδικός"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Προβολές σελίδας"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Σελίδες"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Κωδικός"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Με την υποστήριξη του "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Προφίλ"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtime"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Παραπομπές"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Ανανέωση"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Απαιτείται"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Επαναφορά"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Αποθήκευση"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Ρυθμίσεις"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Κοινοποίηση διεύθυνσης URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Ημερήσια"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Τάμπλετ"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Αυτο το μήνα"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Αυτή την εβδομάδα"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Αυτή την χρονιά"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Ζώνη ώρας"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Σήμερα"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Κωδικός παρακολούθησης"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Μοναδικοί επισκέπτες"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Άγνωστο"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Όνομα χρήστη"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Λεπτομέρειες"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Προβολές"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Μέσος χρόνος επίσκεψης"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Επισκέπτες"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Ιστότοποι"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ενεργοί "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "επισκέπτης"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "επισκέπτες"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": ";"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Όλα τα σχετικά δεδομένα θα διαγραφούν επίσης."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Κάτι πήγε στραβά."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Μεταβείτε στις ρυθμίσεις"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Μη έγκυρος τομέας"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Δεν υπάρχουν διαθέσιμα δεδομένα."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Δεν έχετε ρυθμίσει κανένα ιστότοπο."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Η σελίδα δεν βρέθηκε."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Αποθηκεύτηκε επιτυχώς."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Αυτό είναι το κοινόχρηστο URL για το "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Κωδικός παρακολούθησης"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Κωδικός πρόσβασης",
+ "account": "Λογαριασμός",
+ "action": "Ενέργεια",
+ "actions": "Ενέργειες",
+ "activity": "Activity log",
+ "add": "Προσθήκη",
+ "add-board": "Προσθήκη πίνακα",
+ "add-description": "Προσθήκη περιγραφής",
+ "add-link": "Προσθήκη συνδέσμου",
+ "add-member": "Προσθήκη μέλους",
+ "add-pixel": "Προσθήκη pixel",
+ "add-step": "Προσθήκη βήματος",
+ "add-website": "Προσθήκη ιστότοπου",
+ "admin": "Διαχειριστής",
+ "affiliate": "Συνεργάτης",
+ "after": "Μετά",
+ "all": "Όλα",
+ "all-time": "Από πάντα",
+ "analysis": "Ανάλυση",
+ "analytics": "Αναλυτικά",
+ "aov": "AOV",
+ "application": "Εφαρμογή",
+ "apply": "Εφαρμογή",
+ "arpu": "ARPU",
+ "attribution": "Απόδοση",
+ "attribution-description": "Δείτε πώς αλληλεπιδρούν οι χρήστες με το μάρκετινγκ και τι οδηγεί σε μετατροπές.",
+ "audience": "Κοινό",
+ "average": "Μέσος όρος",
+ "back": "Πίσω",
+ "before": "Πριν",
+ "behavior": "Συμπεριφορά",
+ "block-selector": "Επιλογέας μπλοκ",
+ "boards": "Πίνακες",
+ "bounce-rate": "Ποσοστό αναπήδησης",
+ "breakdown": "Ανάλυση",
+ "browser": "Πρόγραμμα περιήγησης",
+ "browsers": "Προγράμματα περιήγησης",
+ "campaign": "Καμπάνια",
+ "campaigns": "Καμπάνιες",
+ "cancel": "Ακύρωση",
+ "change-password": "Αλλαγή κωδικού",
+ "channel": "Κανάλι",
+ "channels": "Κανάλια",
+ "chart": "Γράφημα",
+ "cities": "Πόλεις",
+ "city": "Πόλη",
+ "clear-all": "Εκκαθάριση όλων",
+ "cls": "CLS",
+ "cohort": "Κοόρτη",
+ "cohorts": "Κοόρτες",
+ "compare": "Σύγκριση",
+ "compare-dates": "Σύγκριση ημερομηνιών",
+ "confirm": "Επιβεβαίωση",
+ "confirm-password": "Επιβεβαίωση κωδικού",
+ "contains": "Περιέχει",
+ "content": "Περιεχόμενο",
+ "continue": "Συνέχεια",
+ "conversion": "Μετατροπή",
+ "conversion-rate": "Ποσοστό μετατροπής",
+ "conversion-step": "Βήμα μετατροπής",
+ "count": "Πλήθος",
+ "countries": "Χώρες",
+ "country": "Χώρα",
+ "create": "Δημιουργία",
+ "create-report": "Δημιουργία αναφοράς",
+ "create-team": "Δημιουργία ομάδας",
+ "create-user": "Δημιουργία χρήστη",
+ "created": "Δημιουργήθηκε",
+ "created-by": "Δημιουργήθηκε από",
+ "criteria": "Κριτήρια",
+ "currency": "Νόμισμα",
+ "current": "Τρέχων",
+ "current-password": "Τωρινός κωδικός πρόσβασης",
+ "custom-range": "Προσαρμοσμένο εύρος",
+ "dashboard": "Πίνακας",
+ "data": "Δεδομένα",
+ "date": "Ημερομηνία",
+ "date-range": "Εύρος ημερομηνιών",
+ "day": "Ημέρα",
+ "default-date-range": "Προεπιλεγμένο εύρος ημερομηνιών",
+ "delete": "Διαγραφή",
+ "delete-report": "Διαγραφή αναφοράς",
+ "delete-team": "Διαγραφή ομάδας",
+ "delete-user": "Διαγραφή χρήστη",
+ "delete-website": "Διαγραφή ιστότοπου",
+ "description": "Περιγραφή",
+ "desktop": "Σταθερός υπολογιστής",
+ "destination-url": "URL προορισμού",
+ "details": "Λεπτομέρειες",
+ "device": "Συσκευή",
+ "devices": "Συσκευές",
+ "direct": "Άμεσο",
+ "dismiss": "Απόρριψη",
+ "distinct-id": "Μοναδικό ID",
+ "documentation": "Τεκμηρίωση",
+ "does-not-contain": "Δεν περιέχει",
+ "does-not-include": "Δεν περιλαμβάνει",
+ "doest-not-exist": "Δεν υπάρχει",
+ "domain": "Τομέας",
+ "download": "Λήψη",
+ "dropoff": "Εγκατάλειψη",
+ "duration": "Διάρκεια",
+ "edit": "Επεξεργασία",
+ "edit-member": "Επεξεργασία μέλους",
+ "email": "Email",
+ "enable-share-url": "Ενεργοποίηση κοινής χρήσης URL",
+ "end-step": "Τελικό βήμα",
+ "entry": "Entry URL",
+ "environment": "Περιβάλλον",
+ "event": "Συμβάν",
+ "event-data": "Δεδομένα συμβάντος",
+ "event-name": "Όνομα συμβάντος",
+ "events": "Γεγονότα",
+ "exclude-bounce": "Εξαίρεση αναπήδησης",
+ "exists": "Υπάρχει",
+ "exit": "Exit URL",
+ "false": "Ψευδές",
+ "fcp": "FCP",
+ "field": "Πεδίο",
+ "fields": "Πεδία",
+ "filter": "Φίλτρο",
+ "filter-combined": "Σε συνδυασμό",
+ "filter-raw": "Ακατέργαστο",
+ "filters": "Φίλτρα",
+ "first-click": "Πρώτο κλικ",
+ "first-seen": "Πρώτη εμφάνιση",
+ "funnel": "Χωνί",
+ "funnel-description": "Κατανοήστε το ποσοστό μετατροπής και εγκατάλειψης χρηστών.",
+ "funnels": "Χωνιά",
+ "goal": "Στόχος",
+ "goals": "Στόχοι",
+ "goals-description": "Παρακολουθήστε τους στόχους σας για προβολές σελίδων και συμβάντα.",
+ "good": "Καλό",
+ "greater-than": "Μεγαλύτερο από",
+ "greater-than-equals": "Μεγαλύτερο ή ίσο",
+ "grouped": "Ομαδοποιημένα",
+ "growth": "Ανάπτυξη",
+ "hostname": "Όνομα κεντρικού υπολογιστή",
+ "hour": "Ώρα",
+ "includes": "Περιλαμβάνει",
+ "inp": "INP",
+ "insight": "Πληροφορία",
+ "insights": "Πληροφορίες",
+ "insights-description": "Εμβαθύνετε στα δεδομένα σας χρησιμοποιώντας τμήματα και φίλτρα.",
+ "invalid-url": "Μη έγκυρο URL",
+ "is": "Είναι",
+ "is-false": "Είναι ψευδές",
+ "is-not": "Δεν είναι",
+ "is-not-set": "Δεν έχει οριστεί",
+ "is-set": "Έχει οριστεί",
+ "is-true": "Είναι αληθές",
+ "join": "Συμμετοχή",
+ "join-team": "Συμμετοχή σε ομάδα",
+ "journey": "Διαδρομή",
+ "journey-description": "Κατανοήστε πώς πλοηγούνται οι χρήστες στον ιστότοπό σας.",
+ "journeys": "Διαδρομές",
+ "language": "Γλώσσα",
+ "languages": "Γλώσσες",
+ "laptop": "Λάπτοπ",
+ "last-click": "Τελευταίο κλικ",
+ "last-days": "Τελευταίες {x} ημέρες",
+ "last-hours": "Τελευταίες {x} ώρες",
+ "last-months": "Τελευταίοι {x} μήνες",
+ "last-seen": "Τελευταία εμφάνιση",
+ "lcp": "LCP",
+ "leave": "Αποχώρηση",
+ "leave-team": "Αποχώρηση από ομάδα",
+ "less-than": "Μικρότερο από",
+ "less-than-equals": "Μικρότερο ή ίσο",
+ "link": "Σύνδεσμος",
+ "links": "Σύνδεσμοι",
+ "location": "Τοποθεσία",
+ "login": "Είσοδος",
+ "logout": "Αποσύνδεση",
+ "manage": "Διαχείριση",
+ "manager": "Διαχειριστής",
+ "mask-level": "Επίπεδο μάσκας",
+ "match": "Αντιστοίχιση",
+ "match-all": "Όλα",
+ "match-any": "Οποιοδήποτε",
+ "max": "Μέγ",
+ "max-duration": "Μέγιστη διάρκεια",
+ "maximize": "Expand",
+ "medium": "Μέσο",
+ "member": "Μέλος",
+ "members": "Μέλη",
+ "min": "Ελάχ",
+ "minute": "Λεπτό",
+ "mobile": "Κινητό",
+ "model": "Μοντέλο",
+ "month": "Μήνας",
+ "more": "Περισσότερα",
+ "my-account": "Ο λογαριασμός μου",
+ "my-websites": "Οι ιστότοποί μου",
+ "name": "Όνομα",
+ "needs-improvement": "Χρειάζεται βελτίωση",
+ "new-password": "Νέος κωδικός",
+ "none": "Κανένα",
+ "number-of-records": "{x} {x, plural, one {εγγραφή} other {εγγραφές}}",
+ "ok": "OK",
+ "online": "Σε σύνδεση",
+ "organic-search": "Οργανική αναζήτηση",
+ "organic-shopping": "Οργανικές αγορές",
+ "organic-social": "Οργανικά κοινωνικά",
+ "organic-video": "Οργανικό βίντεο",
+ "os": "ΛΣ",
+ "other": "Άλλο",
+ "overview": "Επισκόπηση",
+ "owner": "Ιδιοκτήτης",
+ "page": "Σελίδα",
+ "page-of": "Σελίδα {current} από {total}",
+ "page-views": "Προβολές σελίδας",
+ "pages": "Σελίδες",
+ "pageTitle": "Τίτλος σελίδας",
+ "paid-ads": "Πληρωμένες διαφημίσεις",
+ "paid-search": "Πληρωμένη αναζήτηση",
+ "paid-shopping": "Πληρωμένες αγορές",
+ "paid-social": "Πληρωμένα κοινωνικά",
+ "paid-video": "Πληρωμένο βίντεο",
+ "password": "Κωδικός",
+ "path": "Διαδρομή",
+ "paths": "Διαδρομές",
+ "performance": "Απόδοση",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Αναπαραγωγή",
+ "poor": "Κακό",
+ "powered-by": "Με την υποστήριξη του {name}",
+ "preferences": "Προτιμήσεις",
+ "previous": "Προηγούμενο",
+ "previous-period": "Προηγούμενη περίοδος",
+ "previous-year": "Προηγούμενο έτος",
+ "profile": "Προφίλ",
+ "profiles": "Προφίλ",
+ "properties": "Ιδιότητες",
+ "property": "Ιδιότητα",
+ "queries": "Ερωτήματα",
+ "query": "Ερώτημα",
+ "query-parameters": "Παράμετροι ερωτήματος",
+ "realtime": "Πραγματικός χρόνος",
+ "recorded": "Καταγράφηκε στις",
+ "referral": "Παραπομπή",
+ "referrer": "Παραπέμπων",
+ "referrers": "Παραπομπές",
+ "refresh": "Ανανέωση",
+ "regenerate": "Αναδημιουργία",
+ "regex-match": "Ταιριάζει με κανονική έκφραση",
+ "regex-not-match": "Δεν ταιριάζει με κανονική έκφραση",
+ "region": "Περιφέρεια",
+ "regions": "Περιφέρειες",
+ "remaining": "Υπολειπόμενα",
+ "remove": "Αφαίρεση",
+ "remove-member": "Αφαίρεση μέλους",
+ "replay": "Επανάληψη",
+ "replay-enabled": "Επανάληψη ενεργοποιημένη",
+ "replay-id": "Replay ID",
+ "replays": "Επαναλήψεις",
+ "reports": "Αναφορές",
+ "required": "Απαιτείται",
+ "reset": "Επαναφορά",
+ "reset-website": "Reset statistics",
+ "retention": "Διατήρηση",
+ "retention-days": "Ημέρες διατήρησης",
+ "retention-description": "Μετρήστε την ικανότητα διατήρησης χρηστών του ιστότοπού σας.",
+ "revenue": "Έσοδα",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "Ρόλος",
+ "run-query": "Εκτέλεση ερωτήματος",
+ "sample-rate": "Ρυθμός δειγματοληψίας",
+ "sample-size": "Μέγεθος δείγματος",
+ "save": "Αποθήκευση",
+ "save-cohort": "Αποθήκευση κοόρτης",
+ "save-segment": "Αποθήκευση τμήματος",
+ "screen": "Οθόνη",
+ "screens": "Οθόνες",
+ "search": "Αναζήτηση",
+ "segment": "Τμήμα",
+ "segments": "Τμήματα",
+ "select": "Επιλογή",
+ "select-component": "Επιλέξτε στοιχείο",
+ "select-date": "Επιλογή ημερομηνίας",
+ "select-filter": "Επιλογή φίλτρου",
+ "select-role": "Επιλογή ρόλου",
+ "select-website": "Επιλογή ιστότοπου",
+ "session": "Συνεδρία",
+ "session-data": "Δεδομένα συνεδρίας",
+ "sessions": "Συνεδρίες",
+ "settings": "Ρυθμίσεις",
+ "share": "Κοινοποίηση",
+ "share-url": "Κοινοποίηση διεύθυνσης URL",
+ "single-day": "Ημερήσια",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Πηγή",
+ "sources": "Πηγές",
+ "start-step": "Αρχικό βήμα",
+ "steps": "Βήματα",
+ "sum": "Άθροισμα",
+ "support": "Υποστήριξη",
+ "switch-account": "Αλλαγή λογαριασμού",
+ "table": "Πίνακας",
+ "tablet": "Τάμπλετ",
+ "tag": "Ετικέτα",
+ "tags": "Ετικέτες",
+ "team": "Ομάδα",
+ "team-id": "ID ομάδας",
+ "team-manager": "Υπεύθυνος ομάδας",
+ "team-member": "Μέλος ομάδας",
+ "team-name": "Όνομα ομάδας",
+ "team-owner": "Ιδιοκτήτης ομάδας",
+ "team-settings": "Ρυθμίσεις ομάδας",
+ "team-view-only": "Μόνο προβολή ομάδας",
+ "team-websites": "Ιστότοποι ομάδας",
+ "teams": "Ομάδες",
+ "term": "Όρος αναζήτησης",
+ "terms": "Όροι",
+ "theme": "Θέμα",
+ "this-month": "Αυτο το μήνα",
+ "this-week": "Αυτή την εβδομάδα",
+ "this-year": "Αυτή την χρονιά",
+ "timezone": "Ζώνη ώρας",
+ "title": "Τίτλος",
+ "today": "Σήμερα",
+ "toggle-charts": "Εναλλαγή γραφημάτων",
+ "total": "Σύνολο",
+ "total-records": "Σύνολο εγγραφών",
+ "tracking-code": "Κωδικός παρακολούθησης",
+ "traffic": "Κίνηση",
+ "transactions": "Συναλλαγές",
+ "transfer": "Μεταφορά",
+ "transfer-website": "Μεταφορά ιστότοπου",
+ "true": "Αληθές",
+ "ttfb": "TTFB",
+ "type": "Τύπος",
+ "unique": "Μοναδικό",
+ "unique-events": "Μοναδικά συμβάντα",
+ "unique-visitors": "Μοναδικοί επισκέπτες",
+ "uniqueCustomers": "Μοναδικοί πελάτες",
+ "unknown": "Άγνωστο",
+ "untitled": "Χωρίς τίτλο",
+ "update": "Ενημέρωση",
+ "url": "URL",
+ "user": "Χρήστης",
+ "username": "Όνομα χρήστη",
+ "users": "Χρήστες",
+ "utm": "UTM",
+ "utm-campaign": "UTM Καμπάνια",
+ "utm-content": "UTM Περιεχόμενο",
+ "utm-description": "Παρακολουθήστε τις καμπάνιες σας μέσω παραμέτρων UTM.",
+ "utm-medium": "UTM Μέσο",
+ "utm-source": "UTM Πηγή",
+ "utm-term": "UTM Όρος",
+ "value": "Τιμή",
+ "version": "Έκδοση",
+ "view": "Προβολή",
+ "view-details": "Λεπτομέρειες",
+ "view-only": "Μόνο προβολή",
+ "views": "Προβολές",
+ "views-per-visit": "Προβολές ανά επίσκεψη",
+ "visit-duration": "Μέσος χρόνος επίσκεψης",
+ "visitors": "Επισκέπτες",
+ "visits": "Επισκέψεις",
+ "website": "Ιστότοπος",
+ "website-id": "ID ιστότοπου",
+ "websites": "Ιστότοποι",
+ "window": "Παράθυρο",
+ "yesterday": "Χθες"
+ },
+ "message": {
+ "action-confirmation": "Πληκτρολογήστε {confirmation} στο παρακάτω πεδίο για επιβεβαίωση.",
+ "active-users": "{x} ενεργοί {x, plural, one {επισκέπτης} other {επισκέπτες}}",
+ "bad-request": "Μη έγκυρο αίτημα",
+ "collected-data": "Συλλεχθέντα δεδομένα",
+ "confirm-delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {target};",
+ "confirm-leave": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από {target} ;",
+ "confirm-remove": "Είστε σίγουροι ότι θέλετε να αφαιρέσετε {target} ;",
+ "confirm-reset": "Are your sure you want to reset {target}'s statistics?",
+ "delete-team-warning": "Η διαγραφή μιας ομάδας θα διαγράψει επίσης όλους τους ιστότοπους της ομάδας.",
+ "delete-website-warning": "Όλα τα σχετικά δεδομένα θα διαγραφούν επίσης.",
+ "empty-dashboard": "Ο πίνακας ελέγχου σας είναι κενός. Κάντε κλικ στην Επεξεργασία για να προσθέσετε το πρώτο σας στοιχείο.",
+ "error": "Κάτι πήγε στραβά.",
+ "event-log": "{event} στο {url} ",
+ "forbidden": "Απαγορευμένο",
+ "go-to-settings": "Μεταβείτε στις ρυθμίσεις",
+ "incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.",
+ "invalid-domain": "Μη έγκυρος τομέας",
+ "min-password-length": "Ελάχιστο μήκος {n} χαρακτήρων",
+ "new-version-available": "Μια νέα έκδοση του Umami {version} είναι διαθέσιμη!",
+ "no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
+ "no-event-data": "Δεν υπάρχουν διαθέσιμα δεδομένα συμβάντων.",
+ "no-match-password": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Αυτή η ομάδα δεν έχει ιστότοπους.",
+ "no-teams": "Δεν έχετε δημιουργήσει ομάδες.",
+ "no-users": "Δεν υπάρχουν χρήστες.",
+ "no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
+ "not-found": "Δεν βρέθηκε",
+ "nothing-selected": "Τίποτα δεν έχει επιλεγεί.",
+ "page-not-found": "Η σελίδα δεν βρέθηκε.",
+ "reset-website": "Για να επαναφέρετε αυτόν τον ιστότοπο, πληκτρολογήστε {confirmation} στο παρακάτω πεδίο.",
+ "reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
+ "saved": "Αποθηκεύτηκε επιτυχώς.",
+ "select-component-preview": "Επιλέξτε ένα στοιχείο για προεπισκόπηση",
+ "select-website-first": "Επιλέξτε πρώτα έναν ιστότοπο",
+ "sever-error": "Σφάλμα διακομιστή",
+ "share-url": "Αυτό είναι το κοινόχρηστο URL για το {target}.",
+ "team-already-member": "Είστε ήδη μέλος της ομάδας.",
+ "team-not-found": "Η ομάδα δεν βρέθηκε.",
+ "team-websites-info": "Οι ιστότοποι μπορούν να προβληθούν από οποιονδήποτε στην ομάδα.",
+ "tracking-code": "Κωδικός παρακολούθησης",
+ "transfer-team-website-to-user": "Μεταφορά αυτού του ιστότοπου στον λογαριασμό σας;",
+ "transfer-user-website-to-team": "Επιλέξτε την ομάδα για μεταφορά αυτού του ιστότοπου.",
+ "transfer-website": "Μεταφέρετε την ιδιοκτησία του ιστότοπου στον λογαριασμό σας ή σε άλλη ομάδα.",
+ "triggered-event": "Ενεργοποιημένο συμβάν",
+ "unauthorized": "Μη εξουσιοδοτημένο",
+ "user-deleted": "Ο χρήστης διαγράφηκε.",
+ "viewed-page": "Προβολή σελίδας",
+ "visitor-log": "Επισκέπτης από {country} χρησιμοποιώντας {browser} σε {os} {device} "
+ }
}
diff --git a/public/intl/messages/en-GB.json b/public/intl/messages/en-GB.json
index c8c38be14..b29d7bcf2 100644
--- a/public/intl/messages/en-GB.json
+++ b/public/intl/messages/en-GB.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Add website"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "All"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Back"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancel"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Change password"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirm password"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Countries"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Current password"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Custom range"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dashboard"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Date range"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Default date range"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Delete"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Delete website"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Devices"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Dismiss"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edit"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Enable share URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Events"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combined"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " days"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hours"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Login"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logout"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "More"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Name"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "New password"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Page views"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Password"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profile"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtime"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresh"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Required"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Save"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Settings"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Share URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Single day"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "This month"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "This week"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "This year"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Timezone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Today"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Tracking code"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unique visitors"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Unknown"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Username"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "View details"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Views"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitors"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " current "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitor"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitors"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Are you sure you want to delete "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are you sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All associated data will be deleted as well."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Something went wrong."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Go to settings"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Incorrect username/password."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Invalid domain"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No data available."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwords don't match"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "You don't have any websites configured."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Page not found."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Saved successfully."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "This is the publicly shared URL for "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Tracking code"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Access code",
+ "account": "Account",
+ "action": "Action",
+ "actions": "Actions",
+ "activity": "Activity log",
+ "add": "Add",
+ "add-board": "Add board",
+ "add-description": "Add description",
+ "add-link": "Add link",
+ "add-member": "Add member",
+ "add-pixel": "Add pixel",
+ "add-step": "Add step",
+ "add-website": "Add website",
+ "admin": "Administrator",
+ "affiliate": "Affiliate",
+ "after": "After",
+ "all": "All",
+ "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",
+ "average": "Average",
+ "back": "Back",
+ "before": "Before",
+ "behavior": "Behaviour",
+ "block-selector": "Block selector",
+ "boards": "Boards",
+ "bounce-rate": "Bounce rate",
+ "breakdown": "Breakdown",
+ "browser": "Browser",
+ "browsers": "Browsers",
+ "campaign": "Campaign",
+ "campaigns": "Campaigns",
+ "cancel": "Cancel",
+ "change-password": "Change password",
+ "channel": "Channel",
+ "channels": "Channels",
+ "chart": "Chart",
+ "cities": "Cities",
+ "city": "City",
+ "clear-all": "Clear all",
+ "cls": "CLS",
+ "cohort": "Cohort",
+ "cohorts": "Cohorts",
+ "compare": "Compare",
+ "compare-dates": "Compare dates",
+ "confirm": "Confirm",
+ "confirm-password": "Confirm password",
+ "contains": "Contains",
+ "content": "Content",
+ "continue": "Continue",
+ "conversion": "Conversion",
+ "conversion-rate": "Conversion rate",
+ "conversion-step": "Conversion step",
+ "count": "Count",
+ "countries": "Countries",
+ "country": "Country",
+ "create": "Create",
+ "create-report": "Create report",
+ "create-team": "Create team",
+ "create-user": "Create user",
+ "created": "Created",
+ "created-by": "Created By",
+ "criteria": "Criteria",
+ "currency": "Currency",
+ "current": "Current",
+ "current-password": "Current password",
+ "custom-range": "Custom range",
+ "dashboard": "Dashboard",
+ "data": "Data",
+ "date": "Date",
+ "date-range": "Date range",
+ "day": "Day",
+ "default-date-range": "Default date range",
+ "delete": "Delete",
+ "delete-report": "Delete report",
+ "delete-team": "Delete team",
+ "delete-user": "Delete user",
+ "delete-website": "Delete website",
+ "description": "Description",
+ "desktop": "Desktop",
+ "destination-url": "Destination URL",
+ "details": "Details",
+ "device": "Device",
+ "devices": "Devices",
+ "direct": "Direct",
+ "dismiss": "Dismiss",
+ "distinct-id": "Distinct ID",
+ "documentation": "Documentation",
+ "does-not-contain": "Does not contain",
+ "does-not-include": "Does not include",
+ "doest-not-exist": "Does not exist",
+ "domain": "Domain",
+ "download": "Download",
+ "dropoff": "Dropoff",
+ "duration": "Duration",
+ "edit": "Edit",
+ "edit-member": "Edit member",
+ "email": "Email",
+ "enable-share-url": "Enable share URL",
+ "end-step": "End Step",
+ "entry": "Entry URL",
+ "environment": "Environment",
+ "event": "Event",
+ "event-data": "Event data",
+ "event-name": "Event name",
+ "events": "Events",
+ "exclude-bounce": "Exclude bounce",
+ "exists": "Exists",
+ "exit": "Exit URL",
+ "false": "False",
+ "fcp": "FCP",
+ "field": "Field",
+ "fields": "Fields",
+ "filter": "Filter",
+ "filter-combined": "Combined",
+ "filter-raw": "Raw",
+ "filters": "Filters",
+ "first-click": "First click",
+ "first-seen": "First seen",
+ "funnel": "Funnel",
+ "funnel-description": "Understand the conversion and drop-off rate of users.",
+ "funnels": "Funnels",
+ "goal": "Goal",
+ "goals": "Goals",
+ "goals-description": "Track your goals for pageviews and events.",
+ "good": "Good",
+ "greater-than": "Greater than",
+ "greater-than-equals": "Greater than or equals",
+ "grouped": "Grouped",
+ "growth": "Growth",
+ "hostname": "Hostname",
+ "hour": "Hour",
+ "includes": "Includes",
+ "inp": "INP",
+ "insight": "Insight",
+ "insights": "Insights",
+ "insights-description": "Dive deeper into your data by using segments and filters.",
+ "invalid-url": "Invalid URL",
+ "is": "Is",
+ "is-false": "Is false",
+ "is-not": "Is not",
+ "is-not-set": "Is not set",
+ "is-set": "Is set",
+ "is-true": "Is true",
+ "join": "Join",
+ "join-team": "Join team",
+ "journey": "Journey",
+ "journey-description": "Understand how users navigate through your website.",
+ "journeys": "Journeys",
+ "language": "Language",
+ "languages": "Languages",
+ "laptop": "Laptop",
+ "last-click": "Last click",
+ "last-days": "Last {x} days",
+ "last-hours": "Last {x} hours",
+ "last-months": "Last {x} months",
+ "last-seen": "Last seen",
+ "lcp": "LCP",
+ "leave": "Leave",
+ "leave-team": "Leave team",
+ "less-than": "Less than",
+ "less-than-equals": "Less than or equals",
+ "link": "Link",
+ "links": "Links",
+ "location": "Location",
+ "login": "Login",
+ "logout": "Logout",
+ "manage": "Manage",
+ "manager": "Manager",
+ "mask-level": "Mask level",
+ "match": "Match",
+ "match-all": "All",
+ "match-any": "Any",
+ "max": "Max",
+ "max-duration": "Max duration",
+ "maximize": "Expand",
+ "medium": "Medium",
+ "member": "Member",
+ "members": "Members",
+ "min": "Min",
+ "minute": "Minute",
+ "mobile": "Mobile",
+ "model": "Model",
+ "month": "Month",
+ "more": "More",
+ "my-account": "My account",
+ "my-websites": "My websites",
+ "name": "Name",
+ "needs-improvement": "Needs improvement",
+ "new-password": "New password",
+ "none": "None",
+ "number-of-records": "{x} {x, plural, one {record} other {records}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organic search",
+ "organic-shopping": "Organic shopping",
+ "organic-social": "Organic social",
+ "organic-video": "Organic video",
+ "os": "OS",
+ "other": "Other",
+ "overview": "Overview",
+ "owner": "Owner",
+ "page": "Page",
+ "page-of": "Page {current} of {total}",
+ "page-views": "Page views",
+ "pages": "Pages",
+ "pageTitle": "Page title",
+ "paid-ads": "Paid ads",
+ "paid-search": "Paid search",
+ "paid-shopping": "Paid shopping",
+ "paid-social": "Paid social",
+ "paid-video": "Paid video",
+ "password": "Password",
+ "path": "Path",
+ "paths": "Paths",
+ "performance": "Performance",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Play",
+ "poor": "Poor",
+ "powered-by": "Powered by {name}",
+ "preferences": "Preferences",
+ "previous": "Previous",
+ "previous-period": "Previous period",
+ "previous-year": "Previous year",
+ "profile": "Profile",
+ "profiles": "Profiles",
+ "properties": "Properties",
+ "property": "Property",
+ "queries": "Queries",
+ "query": "Query",
+ "query-parameters": "Query parameters",
+ "realtime": "Realtime",
+ "recorded": "Recorded",
+ "referral": "Referral",
+ "referrer": "Referrer",
+ "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",
+ "replay": "Replay",
+ "replay-enabled": "Replay enabled",
+ "replay-id": "Replay ID",
+ "replays": "Replays",
+ "reports": "Reports",
+ "required": "Required",
+ "reset": "Reset",
+ "reset-website": "Reset statistics",
+ "retention": "Retention",
+ "retention-days": "Retention days",
+ "retention-description": "Measure your website stickiness by tracking how often users return.",
+ "revenue": "Revenue",
+ "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-segment": "Save segment",
+ "screen": "Screen",
+ "screens": "Screens",
+ "search": "Search",
+ "segment": "Segment",
+ "segments": "Segments",
+ "select": "Select",
+ "select-component": "Select component",
+ "select-date": "Select date",
+ "select-filter": "Select filter",
+ "select-role": "Select role",
+ "select-website": "Select website",
+ "session": "Session",
+ "session-data": "Session data",
+ "sessions": "Sessions",
+ "settings": "Settings",
+ "share": "Share",
+ "share-url": "Share URL",
+ "single-day": "Single day",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Source",
+ "sources": "Sources",
+ "start-step": "Start Step",
+ "steps": "Steps",
+ "sum": "Sum",
+ "support": "Support",
+ "switch-account": "Switch account",
+ "table": "Table",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tags",
+ "team": "Team",
+ "team-id": "Team ID",
+ "team-manager": "Team manager",
+ "team-member": "Team member",
+ "team-name": "Team name",
+ "team-owner": "Team owner",
+ "team-settings": "Team settings",
+ "team-view-only": "Team view only",
+ "team-websites": "Team websites",
+ "teams": "Teams",
+ "term": "Term",
+ "terms": "Terms",
+ "theme": "Theme",
+ "this-month": "This month",
+ "this-week": "This week",
+ "this-year": "This year",
+ "timezone": "Timezone",
+ "title": "Title",
+ "today": "Today",
+ "toggle-charts": "Toggle charts",
+ "total": "Total",
+ "total-records": "Total records",
+ "tracking-code": "Tracking code",
+ "traffic": "Traffic",
+ "transactions": "Transactions",
+ "transfer": "Transfer",
+ "transfer-website": "Transfer website",
+ "true": "True",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "unique": "Unique",
+ "unique-events": "Unique events",
+ "unique-visitors": "Unique visitors",
+ "uniqueCustomers": "Unique Customers",
+ "unknown": "Unknown",
+ "untitled": "Untitled",
+ "update": "Update",
+ "url": "URL",
+ "user": "User",
+ "username": "Username",
+ "users": "Users",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaign",
+ "utm-content": "UTM Content",
+ "utm-description": "Track your campaigns through UTM parameters.",
+ "utm-medium": "UTM Medium",
+ "utm-source": "UTM Source",
+ "utm-term": "UTM Term",
+ "value": "Value",
+ "version": "Version",
+ "view": "View",
+ "view-details": "View details",
+ "view-only": "View only",
+ "views": "Views",
+ "views-per-visit": "Views per visit",
+ "visit-duration": "Visit duration",
+ "visitors": "Visitors",
+ "visits": "Visits",
+ "website": "Website",
+ "website-id": "Website ID",
+ "websites": "Websites",
+ "window": "Window",
+ "yesterday": "Yesterday"
+ },
+ "message": {
+ "action-confirmation": "Type {confirmation} in the box below to confirm.",
+ "active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
+ "bad-request": "Bad request",
+ "collected-data": "Collected data",
+ "confirm-delete": "Are you sure you want to delete {target}?",
+ "confirm-leave": "Are you sure you want to leave {target} ?",
+ "confirm-remove": "Are you sure you want to remove {target} ?",
+ "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.",
+ "event-log": "{event} on {url} ",
+ "forbidden": "Forbidden",
+ "go-to-settings": "Go to settings",
+ "incorrect-username-password": "Incorrect username/password.",
+ "invalid-domain": "Invalid domain",
+ "min-password-length": "Minimum length of {n} characters",
+ "new-version-available": "A new version of Umami {version} is available!",
+ "no-data-available": "No data available.",
+ "no-event-data": "No event data is available.",
+ "no-match-password": "Passwords don't match",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "This team does not have any websites.",
+ "no-teams": "You have not created any teams.",
+ "no-users": "There are no users.",
+ "no-websites-configured": "You don't have any websites configured.",
+ "not-found": "Not found",
+ "nothing-selected": "Nothing selected.",
+ "page-not-found": "Page not found.",
+ "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-component-preview": "Select a component to preview",
+ "select-website-first": "Select a website first",
+ "sever-error": "Server error",
+ "share-url": "This is the publicly shared URL for {target}.",
+ "team-already-member": "You are already a member of the team.",
+ "team-not-found": "Team not found.",
+ "team-websites-info": "Websites can be viewed by anyone on the team.",
+ "tracking-code": "Tracking code",
+ "transfer-team-website-to-user": "Transfer this website to your account?",
+ "transfer-user-website-to-team": "Select the team to transfer this website to.",
+ "transfer-website": "Transfer website ownership to your account or another team.",
+ "triggered-event": "Triggered event",
+ "unauthorized": "Unauthorized",
+ "user-deleted": "User deleted.",
+ "viewed-page": "Viewed page",
+ "visitor-log": "Visitor from {country} using {browser} on {os} {device} "
+ }
}
diff --git a/public/intl/messages/en-US.json b/public/intl/messages/en-US.json
index 76a68dba1..46ac8d6a0 100644
--- a/public/intl/messages/en-US.json
+++ b/public/intl/messages/en-US.json
@@ -1,1874 +1,434 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Add website"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "All"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Back"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancel"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Change password"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirm password"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Countries"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Current password"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Custom range"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dashboard"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Date range"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Default date range"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Delete"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Delete website"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Devices"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Dismiss"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edit"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Enable share URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry path"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Events"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit path"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combined"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " days"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hours"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Login"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logout"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "More"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Name"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "New password"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Page views"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Password"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profile"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtime"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresh"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Required"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset website"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Save"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Settings"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Share URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Single day"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "This month"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "This week"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "This year"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Timezone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Today"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Tracking code"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unique visitors"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Unknown"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Username"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "View details"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Views"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitors"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " current "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitor"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitors"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Are you sure you want to delete "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are you sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All website data will be deleted."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Something went wrong."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Go to settings"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Incorrect username and/or password."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Invalid domain. Do not include http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No data available."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwords do not match."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "You do not have any websites configured."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Page not found"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your settings will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Saved."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Your website stats are publicly available at the following URL:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "To track stats for this website, place the following code in the "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " section of your HTML."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Access code",
+ "account": "Account",
+ "action": "Action",
+ "actions": "Actions",
+ "activity": "Activity",
+ "add": "Add",
+ "add-board": "Add board",
+ "add-description": "Add description",
+ "add-link": "Add link",
+ "add-member": "Add member",
+ "add-pixel": "Add pixel",
+ "add-step": "Add step",
+ "add-website": "Add website",
+ "admin": "Admin",
+ "affiliate": "Affiliate",
+ "after": "After",
+ "all": "All",
+ "all-time": "All time",
+ "analysis": "Analysis",
+ "analytics": "Analytics",
+ "application": "Application",
+ "apply": "Apply",
+ "attribution": "Attribution",
+ "attribution-description": "See how users engage with your marketing and what drives conversions.",
+ "audience": "Audience",
+ "average": "Average",
+ "back": "Back",
+ "before": "Before",
+ "behavior": "Behavior",
+ "block-selector": "Block selector",
+ "boards": "Boards",
+ "board-type": "Board type",
+ "bounce-rate": "Bounce rate",
+ "breakdown": "Breakdown",
+ "browser": "Browser",
+ "browsers": "Browsers",
+ "campaign": "Campaign",
+ "campaigns": "Campaigns",
+ "cancel": "Cancel",
+ "change-password": "Change password",
+ "channel": "Channel",
+ "channels": "Channels",
+ "chart": "Chart",
+ "cities": "Cities",
+ "city": "City",
+ "clear-all": "Clear all",
+ "cls": "CLS",
+ "cohort": "Cohort",
+ "cohorts": "Cohorts",
+ "compare": "Compare",
+ "compare-dates": "Compare dates",
+ "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",
+ "conversion-rate": "Conversion rate",
+ "conversion-step": "Conversion step",
+ "count": "Count",
+ "countries": "Countries",
+ "country": "Country",
+ "create": "Create",
+ "create-report": "Create report",
+ "create-team": "Create team",
+ "create-user": "Create user",
+ "created": "Created",
+ "created-by": "Created By",
+ "criteria": "Criteria",
+ "currency": "Currency",
+ "current": "Current",
+ "current-password": "Current password",
+ "custom-range": "Custom range",
+ "dashboard": "Dashboard",
+ "data": "Data",
+ "date": "Date",
+ "date-range": "Date range",
+ "day": "Day",
+ "default-date-range": "Default date range",
+ "delete": "Delete",
+ "delete-report": "Delete report",
+ "delete-team": "Delete team",
+ "delete-user": "Delete user",
+ "delete-website": "Delete website",
+ "description": "Description",
+ "desktop": "Desktop",
+ "destination-url": "Destination URL",
+ "details": "Details",
+ "device": "Device",
+ "devices": "Devices",
+ "direct": "Direct",
+ "dismiss": "Dismiss",
+ "distinct-id": "Distinct ID",
+ "documentation": "Documentation",
+ "does-not-contain": "Does not contain",
+ "does-not-include": "Does not include",
+ "doest-not-exist": "Does not exist",
+ "domain": "Domain",
+ "download": "Download",
+ "dropoff": "Dropoff",
+ "duration": "Duration",
+ "edit": "Edit",
+ "edit-member": "Edit member",
+ "email": "Email",
+ "enable-share-url": "Enable share URL",
+ "end-step": "End Step",
+ "entry": "Entry page",
+ "environment": "Environment",
+ "event": "Event",
+ "event-data": "Event data",
+ "event-name": "Event name",
+ "events": "Events",
+ "exclude-bounce": "Exclude bounce",
+ "exists": "Exists",
+ "exit": "Exit page",
+ "false": "False",
+ "fcp": "FCP",
+ "field": "Field",
+ "fields": "Fields",
+ "filter": "Filter",
+ "filter-combined": "Combined",
+ "filter-raw": "Raw",
+ "filters": "Filters",
+ "first-click": "First click",
+ "first-seen": "First seen",
+ "funnel": "Funnel",
+ "funnel-description": "Understand the conversion and drop-off rate of users.",
+ "funnels": "Funnels",
+ "goal": "Goal",
+ "goals": "Goals",
+ "good": "Good",
+ "goals-description": "Track your goals for pageviews and events.",
+ "greater-than": "Greater than",
+ "greater-than-equals": "Greater than or equals",
+ "grouped": "Grouped",
+ "growth": "Growth",
+ "hostname": "Hostname",
+ "hour": "Hour",
+ "includes": "Includes",
+ "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",
+ "is-not": "Is not",
+ "is-not-set": "Is not set",
+ "is-set": "Is set",
+ "is-true": "Is true",
+ "join": "Join",
+ "join-team": "Join team",
+ "journey": "Journey",
+ "journey-description": "Understand how users navigate through your website.",
+ "journeys": "Journeys",
+ "language": "Language",
+ "languages": "Languages",
+ "laptop": "Laptop",
+ "last-click": "Last click",
+ "last-days": "Last {x} days",
+ "last-hours": "Last {x} hours",
+ "last-months": "Last {x} months",
+ "last-seen": "Last seen",
+ "lcp": "LCP",
+ "leave": "Leave",
+ "leave-team": "Leave team",
+ "less-than": "Less than",
+ "less-than-equals": "Less than or equals",
+ "link": "Link",
+ "links": "Links",
+ "location": "Location",
+ "login": "Login",
+ "logout": "Logout",
+ "manage": "Manage",
+ "manager": "Manager",
+ "mask-level": "Mask level",
+ "max": "Max",
+ "max-duration": "Max duration",
+ "match": "Match",
+ "match-all": "All",
+ "match-any": "Any",
+ "maximize": "Maximize",
+ "medium": "Medium",
+ "member": "Member",
+ "members": "Members",
+ "min": "Min",
+ "minute": "Minute",
+ "mobile": "Mobile",
+ "model": "Model",
+ "month": "Month",
+ "more": "More",
+ "my-account": "My account",
+ "my-websites": "My websites",
+ "name": "Name",
+ "needs-improvement": "Needs improvement",
+ "new-password": "New password",
+ "none": "None",
+ "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",
+ "organic-video": "Organic video",
+ "os": "OS",
+ "other": "Other",
+ "overview": "Overview",
+ "owner": "Owner",
+ "page": "Page",
+ "page-of": "Page {current} of {total}",
+ "page-views": "Page views",
+ "pageTitle": "Page title",
+ "pages": "Pages",
+ "paid-ads": "Paid ads",
+ "paid-search": "Paid search",
+ "paid-shopping": "Paid shopping",
+ "paid-social": "Paid social",
+ "paid-video": "Paid video",
+ "password": "Password",
+ "path": "Path",
+ "paths": "Paths",
+ "performance": "Performance",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "poor": "Poor",
+ "powered-by": "Powered by {name}",
+ "preferences": "Preferences",
+ "previous": "Previous",
+ "previous-period": "Previous period",
+ "previous-year": "Previous year",
+ "profile": "Profile",
+ "profiles": "Profiles",
+ "properties": "Properties",
+ "property": "Property",
+ "queries": "Queries",
+ "query": "Query",
+ "query-parameters": "Query parameters",
+ "realtime": "Realtime",
+ "recorded": "Recorded",
+ "referral": "Referral",
+ "referrer": "Referrer",
+ "referrers": "Referrers",
+ "refresh": "Refresh",
+ "regenerate": "Regenerate",
+ "region": "Region",
+ "regions": "Regions",
+ "remaining": "Remaining",
+ "remove": "Remove",
+ "remove-member": "Remove member",
+ "play": "Play",
+ "replay": "Replay",
+ "replay-id": "Replay ID",
+ "replay-code": "Session replay code",
+ "replay-enabled": "Replay enabled",
+ "replays": "Replays",
+ "reports": "Reports",
+ "required": "Required",
+ "reset": "Reset",
+ "reset-website": "Reset website",
+ "retention": "Retention",
+ "retention-days": "Retention days",
+ "retention-description": "Measure your website stickiness by tracking how often users return.",
+ "revenue": "Revenue",
+ "revenue-description": "Look into your revenue data and how users are spending.",
+ "role": "Role",
+ "run-query": "Run query",
+ "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-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",
+ "sessions": "Sessions",
+ "settings": "Settings",
+ "share": "Share",
+ "share-url": "Share URL",
+ "single-day": "Single day",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Source",
+ "sources": "Sources",
+ "start-step": "Start Step",
+ "steps": "Steps",
+ "sum": "Sum",
+ "support": "Support",
+ "switch-account": "Switch account",
+ "table": "Table",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tags",
+ "team": "Team",
+ "team-id": "Team ID",
+ "team-manager": "Team manager",
+ "team-member": "Team member",
+ "team-name": "Team name",
+ "team-owner": "Team owner",
+ "team-settings": "Team settings",
+ "team-view-only": "Team view only",
+ "team-websites": "Team websites",
+ "teams": "Teams",
+ "term": "Term",
+ "terms": "Terms",
+ "theme": "Theme",
+ "this-month": "This month",
+ "this-week": "This week",
+ "this-year": "This year",
+ "timezone": "Timezone",
+ "title": "Title",
+ "today": "Today",
+ "toggle-charts": "Toggle charts",
+ "total": "Total",
+ "total-records": "Total records",
+ "tracking-code": "Tracking code",
+ "traffic": "Traffic",
+ "transactions": "Transactions",
+ "transfer": "Transfer",
+ "transfer-website": "Transfer website",
+ "true": "True",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "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",
+ "username": "Username",
+ "users": "Users",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaign",
+ "utm-content": "UTM Content",
+ "utm-description": "Track your campaigns through UTM parameters.",
+ "utm-medium": "UTM Medium",
+ "utm-source": "UTM Source",
+ "utm-term": "UTM Term",
+ "value": "Value",
+ "version": "Version",
+ "view": "View",
+ "view-details": "View details",
+ "view-only": "View only",
+ "views": "Views",
+ "views-per-visit": "Views per visit",
+ "visit-duration": "Visit duration",
+ "visitors": "Visitors",
+ "visits": "Visits",
+ "website": "Website",
+ "website-id": "Website ID",
+ "websites": "Websites",
+ "window": "Window",
+ "yesterday": "Yesterday"
+ },
+ "message": {
+ "action-confirmation": "Type {confirmation} in the box below to confirm.",
+ "active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
+ "bad-request": "Bad request",
+ "collected-data": "Collected data",
+ "confirm-delete": "Are you sure you want to delete {target}?",
+ "confirm-leave": "Are you sure you want to leave {target} ?",
+ "confirm-remove": "Are you sure you want to remove {target} ?",
+ "confirm-reset": "Are you sure you want to reset {target}?",
+ "delete-team-warning": "Deleting a team will also delete all team websites.",
+ "delete-website-warning": "All website data will be deleted.",
+ "error": "Something went wrong.",
+ "empty-dashboard": "Your dashboard is empty. Click Edit to add your first component.",
+ "event-log": "{event} on {url} ",
+ "forbidden": "Forbidden",
+ "go-to-settings": "Go to settings",
+ "incorrect-username-password": "Incorrect username and/or password.",
+ "invalid-domain": "Invalid domain. Do not include http/https.",
+ "min-password-length": "Minimum length of {n} characters",
+ "new-version-available": "A new version of Umami {version} is available!",
+ "no-data-available": "No data available.",
+ "no-event-data": "No event data is available.",
+ "no-match-password": "Passwords do not match.",
+ "no-results-found": "No results found.",
+ "no-team-websites": "This team does not have any websites.",
+ "no-teams": "You have not created any teams.",
+ "no-users": "There are no users.",
+ "no-websites-configured": "You do not have any websites configured.",
+ "not-found": "Not found",
+ "nothing-selected": "Nothing selected.",
+ "page-not-found": "Page not found",
+ "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 settings will remain intact.",
+ "saved": "Saved.",
+ "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",
+ "share-url": "Your website stats are publicly available at the following URL:",
+ "team-already-member": "You are already a member of the team.",
+ "team-not-found": "Team not found.",
+ "team-websites-info": "Websites can be viewed by anyone on the team.",
+ "tracking-code": "To track stats for this website, place the following code in the '...' section of your HTML.",
+ "transfer-team-website-to-user": "Transfer this website to your account?",
+ "transfer-user-website-to-team": "Select the team to transfer this website to.",
+ "transfer-website": "Transfer website ownership to your account or another team.",
+ "triggered-event": "Triggered event",
+ "unauthorized": "Unauthorized",
+ "user-deleted": "User deleted.",
+ "viewed-page": "Viewed page",
+ "upgrade-required": "This feature requires a {plan} plan subscription.",
+ "visitor-log": "Visitor from {country} using {browser} on {os} {device} "
+ }
}
diff --git a/public/intl/messages/es-ES.json b/public/intl/messages/es-ES.json
index 540c9bbd0..e0923eca6 100644
--- a/public/intl/messages/es-ES.json
+++ b/public/intl/messages/es-ES.json
@@ -1,1868 +1,424 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Código de acceso"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Acciones"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Registro de actividad"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Añadir"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Añadir descripción"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Añadir miembro"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Añadir paso"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Nuevo sitio web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Después"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Todos"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Todos los tiempos"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analíticas"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Media"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Atrás"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Antes"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Porcentaje de rebote"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Desglose"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Navegador"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadores"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancelar"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Cambiar contraseña"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Ciudades"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Ciudad"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Limpiar todo"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Comparar"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmar"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmar contraseña"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contiene"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuar"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Contar"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Países"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "País"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Crear"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Crear informe"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Crear equipo"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Crear usuario"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Creado"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Creado por"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Actual"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Contraseña actual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Intervalo personalizado"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Panel de control"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Datos"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Fecha"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Intervalo de fechas"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Día"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Intervalo por defecto"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Eliminar"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Eliminar reporte"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Eliminar equipo"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Eliminar usuario"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Eliminar sitio"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Descripción"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Escritorio"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalles"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Dispositivo"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivos"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Cerrar"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "No contiene"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Dominio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Abandono"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editar"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Editar panel"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Editar miembro"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Habilitar compartir URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Paso final"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL de entrada"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Evento"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Datos de evento"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Eventos"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL de salida"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Falso"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Campo"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Campos"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtro"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinado"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "En crudo"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtros"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Embudo"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Comprender conversión y abandono de usuarios."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Objetivo"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Objetivos"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Realice un seguimiento de sus objetivos de páginas vistas y eventos."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Mayor que"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Mayor que o igual a"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Profundice en sus datos mediante el uso de segmentos y filtros."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Es igual a"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "No es igual a"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "No está establecido"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Está establecido"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Unir"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Unirse al equipo"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Viaje"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Comprenda cómo los usuarios navegan por su sitio web."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Idioma"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Idiomas"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portátil"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " días"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimas "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " horas"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " meses"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Abandonar"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Abandonar equipo"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Menor que"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Menor que o igual a"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Iniciar sesión"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Cerrar sesión"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Administrar"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Miembro"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Miembros"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Móvil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Más"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Mi cuenta"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mis sitios web"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nombre"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nueva contraseña"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Ninguno"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Sistema"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Resumen"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Propietario"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Página "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " de "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Vistas"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Título de página"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Páginas"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Contraseña"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Analíticas de "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Anterior"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Periodo anterior"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Año anterior"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Propiedad"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Consultas"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Consulta"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parámetros de petición"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Tiempo real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referido"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referido desde"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Actualizar"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerar"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Región"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regiones"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Quitar"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Eliminar miembro"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Informes"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obligatorio"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reiniciar"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reiniciar analíticas"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retención"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Medir la frecuencia con la que los usuarios vuelven a tu sitio web."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Ejecutar consulta"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Guardar"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Pantallas"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Buscar"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Seleccionar"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Seleccionar fecha"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Seleccionar rol"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Seleccionar sitio web"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesiones"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Ajustes"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Compartir URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Un solo día"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Paso inical"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Pasos"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tableta"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Equipo"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID del equipo"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Jefe de equipo"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Miembro del equipo"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nombre del equipo"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Admin. del equipo"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Vista solo del equipo"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Sitios web del equipo"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Equipos"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Este mes"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Esta semana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Este año"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zona horaria"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Título"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hoy"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Alternar gráficas"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total de registros"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreo"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transferir"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transferir sitio web"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Verdadero"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tipo"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Único"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitantes únicos"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Desconocida"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Sin título"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Actualizar"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Usuario"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nombre de usuario"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Usuarios"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Realice un seguimiento de sus campañas a través de parámetros UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valor"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Visualizar"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Ver detalles"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Ver sólo"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Vistas"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Vistas por visita"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tiempo promedio de visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitantes"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visitas"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Sitio web"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID del sitio web"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Sitios web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Ventana"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ayer"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Escriba "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " en el cuadro a continuación para confirmar."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "activo"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "activos"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Datos obtenidos"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "¿Seguro que quieres eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "¿Seguro que quieres abandonar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "¿Estás seguro de que desea eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "¿Seguro que quieres BORRAR las analíticas de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Al eliminar un equipo, también se eliminarán todos los sitios web del equipo."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Toda la información relacionada será eliminada."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Algo falló."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ir a la configuración"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nombre de usuario o contraseña incorrectos."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Dominio inválido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Longitud mínima de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caracteres"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Una nueva versión de Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " está disponible"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No hay información disponible."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No hay datos de eventos disponibles."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Las contraseñas no coinciden"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No se encontraron resultados."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Este equipo no tiene ningún sitio web configurado."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "No has creado ningún equipo."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "No hay usuarios."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "No tienes ningún sitio web configurado."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Página no encontrada"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Para reiniciar este sitio web, escribe "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " a continuación para confirmar."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Guardado"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Esta es la URL pública para "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Ya eres miembro de este equipo."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Equipo no encontrado."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Las analíticas de tus sitios web pueden ser vistas por cualquier miembro del equipo."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreo"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "¿Transferir este sitio web a su cuenta?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Seleccione el equipo al que transferir este sitio web."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Seleccione el equipo al que transferir este sitio web."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Evento lanzado"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Usuario eliminado."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Página vista"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitante desde "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " usando "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Los visitantes salieron"
- }
- ]
+ "label": {
+ "access-code": "Código de acceso",
+ "account": "Cuenta",
+ "action": "Acción",
+ "actions": "Acciones",
+ "activity": "Registro de actividad",
+ "add": "Añadir",
+ "add-board": "Añadir tablero",
+ "add-description": "Añadir descripción",
+ "add-link": "Añadir enlace",
+ "add-member": "Añadir miembro",
+ "add-pixel": "Añadir píxel",
+ "add-step": "Añadir paso",
+ "add-website": "Nuevo sitio web",
+ "admin": "Administrador",
+ "affiliate": "Afiliado",
+ "after": "Después",
+ "all": "Todos",
+ "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",
+ "average": "Media",
+ "back": "Atrás",
+ "before": "Antes",
+ "behavior": "Comportamiento",
+ "block-selector": "Selector de bloque",
+ "boards": "Tableros",
+ "bounce-rate": "Porcentaje de rebote",
+ "breakdown": "Desglose",
+ "browser": "Navegador",
+ "browsers": "Navegadores",
+ "campaign": "Campaña",
+ "campaigns": "Campañas",
+ "cancel": "Cancelar",
+ "change-password": "Cambiar contraseña",
+ "channel": "Canal",
+ "channels": "Canales",
+ "chart": "Gráfico",
+ "cities": "Ciudades",
+ "city": "Ciudad",
+ "clear-all": "Limpiar todo",
+ "cls": "CLS",
+ "cohort": "Cohorte",
+ "cohorts": "Cohortes",
+ "compare": "Comparar",
+ "compare-dates": "Comparar fechas",
+ "confirm": "Confirmar",
+ "confirm-password": "Confirmar contraseña",
+ "contains": "Contiene",
+ "content": "Contenido",
+ "continue": "Continuar",
+ "conversion": "Conversión",
+ "conversion-rate": "Tasa de conversión",
+ "conversion-step": "Paso de conversión",
+ "count": "Contar",
+ "countries": "Países",
+ "country": "País",
+ "create": "Crear",
+ "create-report": "Crear informe",
+ "create-team": "Crear equipo",
+ "create-user": "Crear usuario",
+ "created": "Creado",
+ "created-by": "Creado por",
+ "criteria": "Criterios",
+ "currency": "Moneda",
+ "current": "Actual",
+ "current-password": "Contraseña actual",
+ "custom-range": "Intervalo personalizado",
+ "dashboard": "Panel de control",
+ "data": "Datos",
+ "date": "Fecha",
+ "date-range": "Intervalo de fechas",
+ "day": "Día",
+ "default-date-range": "Intervalo por defecto",
+ "delete": "Eliminar",
+ "delete-report": "Eliminar reporte",
+ "delete-team": "Eliminar equipo",
+ "delete-user": "Eliminar usuario",
+ "delete-website": "Eliminar sitio",
+ "description": "Descripción",
+ "desktop": "Escritorio",
+ "destination-url": "URL de destino",
+ "details": "Detalles",
+ "device": "Dispositivo",
+ "devices": "Dispositivos",
+ "direct": "Directo",
+ "dismiss": "Cerrar",
+ "distinct-id": "ID distinto",
+ "documentation": "Documentación",
+ "does-not-contain": "No contiene",
+ "does-not-include": "No incluye",
+ "doest-not-exist": "No existe",
+ "domain": "Dominio",
+ "download": "Descargar",
+ "dropoff": "Abandono",
+ "duration": "Duración",
+ "edit": "Editar",
+ "edit-member": "Editar miembro",
+ "email": "Correo electrónico",
+ "enable-share-url": "Habilitar compartir URL",
+ "end-step": "Paso final",
+ "entry": "URL de entrada",
+ "environment": "Entorno",
+ "event": "Evento",
+ "event-data": "Datos de evento",
+ "event-name": "Nombre del evento",
+ "events": "Eventos",
+ "exclude-bounce": "Excluir rebote",
+ "exists": "Existe",
+ "exit": "URL de salida",
+ "false": "Falso",
+ "fcp": "FCP",
+ "field": "Campo",
+ "fields": "Campos",
+ "filter": "Filtro",
+ "filter-combined": "Combinado",
+ "filter-raw": "En crudo",
+ "filters": "Filtros",
+ "first-click": "Primer clic",
+ "first-seen": "Primera vez visto",
+ "funnel": "Embudo",
+ "funnel-description": "Comprender conversión y abandono de usuarios.",
+ "funnels": "Embudos",
+ "goal": "Objetivo",
+ "goals": "Objetivos",
+ "goals-description": "Realice un seguimiento de sus objetivos de páginas vistas y eventos.",
+ "good": "Bueno",
+ "greater-than": "Mayor que",
+ "greater-than-equals": "Mayor que o igual a",
+ "grouped": "Agrupado",
+ "growth": "Crecimiento",
+ "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.",
+ "invalid-url": "URL no válida",
+ "is": "Es igual a",
+ "is-false": "Es falso",
+ "is-not": "No es igual a",
+ "is-not-set": "No está establecido",
+ "is-set": "Está establecido",
+ "is-true": "Es verdadero",
+ "join": "Unir",
+ "join-team": "Unirse al equipo",
+ "journey": "Viaje",
+ "journey-description": "Comprenda cómo los usuarios navegan por su sitio web.",
+ "journeys": "Viajes",
+ "language": "Idioma",
+ "languages": "Idiomas",
+ "laptop": "Portátil",
+ "last-click": "Último clic",
+ "last-days": "Últimos {x} días",
+ "last-hours": "Últimas {x} horas",
+ "last-months": "Últimos {x} meses",
+ "last-seen": "Visto por última vez",
+ "lcp": "LCP",
+ "leave": "Abandonar",
+ "leave-team": "Abandonar equipo",
+ "less-than": "Menor que",
+ "less-than-equals": "Menor que o igual a",
+ "link": "Enlace",
+ "links": "Enlaces",
+ "location": "Ubicación",
+ "login": "Iniciar sesión",
+ "logout": "Cerrar sesión",
+ "manage": "Administrar",
+ "manager": "Gerente",
+ "mask-level": "Nivel de máscara",
+ "match": "Coincidencia",
+ "match-all": "Todo",
+ "match-any": "Cualquiera",
+ "max": "Máximo",
+ "max-duration": "Duración máxima",
+ "maximize": "Expandir",
+ "medium": "Medio",
+ "member": "Miembro",
+ "members": "Miembros",
+ "min": "Mínimo",
+ "minute": "Minuto",
+ "mobile": "Móvil",
+ "model": "Modelo",
+ "month": "Mes",
+ "more": "Más",
+ "my-account": "Mi cuenta",
+ "my-websites": "Mis sitios web",
+ "name": "Nombre",
+ "needs-improvement": "Necesita mejora",
+ "new-password": "Nueva contraseña",
+ "none": "Ninguno",
+ "number-of-records": "{x} {x, plural, one {registro} other {registros}}",
+ "ok": "Aceptar",
+ "online": "En línea",
+ "organic-search": "Búsqueda orgánica",
+ "organic-shopping": "Compras orgánicas",
+ "organic-social": "Social orgánico",
+ "organic-video": "Video orgánico",
+ "os": "Sistema",
+ "other": "Otro",
+ "overview": "Resumen",
+ "owner": "Propietario",
+ "page": "Página",
+ "page-of": "Página {current} de {total}",
+ "page-views": "Vistas",
+ "pages": "Páginas",
+ "pageTitle": "Título de página",
+ "paid-ads": "Anuncios pagados",
+ "paid-search": "Búsqueda pagada",
+ "paid-shopping": "Compras pagadas",
+ "paid-social": "Social pagado",
+ "paid-video": "Video pagado",
+ "password": "Contraseña",
+ "path": "Ruta",
+ "paths": "Rutas",
+ "performance": "Rendimiento",
+ "pixel": "Píxel",
+ "pixels": "Píxeles",
+ "play": "Reproducir",
+ "poor": "Deficiente",
+ "powered-by": "Analíticas de {name}",
+ "preferences": "Preferencias",
+ "previous": "Anterior",
+ "previous-period": "Periodo anterior",
+ "previous-year": "Año anterior",
+ "profile": "Perfil",
+ "profiles": "Perfiles",
+ "properties": "Propiedades",
+ "property": "Propiedad",
+ "queries": "Consultas",
+ "query": "Consulta",
+ "query-parameters": "Parámetros de consulta",
+ "realtime": "Tiempo real",
+ "recorded": "Registrado el",
+ "referral": "Referencia",
+ "referrer": "Referido",
+ "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",
+ "replay": "Repetición",
+ "replay-enabled": "Repetición activada",
+ "replay-id": "Replay ID",
+ "replays": "Repeticiones",
+ "reports": "Informes",
+ "required": "Obligatorio",
+ "reset": "Reiniciar",
+ "reset-website": "Reiniciar analíticas",
+ "retention": "Retención",
+ "retention-days": "Días de retención",
+ "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-segment": "Guardar segmento",
+ "screen": "Pantalla",
+ "screens": "Pantallas",
+ "search": "Buscar",
+ "segment": "Segmento",
+ "segments": "Segmentos",
+ "select": "Seleccionar",
+ "select-component": "Seleccionar componente",
+ "select-date": "Seleccionar fecha",
+ "select-filter": "Seleccionar filtro",
+ "select-role": "Seleccionar rol",
+ "select-website": "Seleccionar sitio web",
+ "session": "Sesión",
+ "session-data": "Datos de sesión",
+ "sessions": "Sesiones",
+ "settings": "Ajustes",
+ "share": "Compartir",
+ "share-url": "Compartir URL",
+ "single-day": "Un solo día",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Fuente",
+ "sources": "Fuentes",
+ "start-step": "Paso inicial",
+ "steps": "Pasos",
+ "sum": "Suma",
+ "support": "Soporte",
+ "switch-account": "Cambiar cuenta",
+ "table": "Tabla",
+ "tablet": "Tableta",
+ "tag": "Etiqueta",
+ "tags": "Etiquetas",
+ "team": "Equipo",
+ "team-id": "ID del equipo",
+ "team-manager": "Jefe de equipo",
+ "team-member": "Miembro del equipo",
+ "team-name": "Nombre del equipo",
+ "team-owner": "Admin. del equipo",
+ "team-settings": "Configuración del equipo",
+ "team-view-only": "Vista solo del equipo",
+ "team-websites": "Sitios web del equipo",
+ "teams": "Equipos",
+ "term": "Término",
+ "terms": "Términos",
+ "theme": "Tema",
+ "this-month": "Este mes",
+ "this-week": "Esta semana",
+ "this-year": "Este año",
+ "timezone": "Zona horaria",
+ "title": "Título",
+ "today": "Hoy",
+ "toggle-charts": "Alternar gráficas",
+ "total": "Total",
+ "total-records": "Total de registros",
+ "tracking-code": "Código de rastreo",
+ "traffic": "Tráfico",
+ "transactions": "Transacciones",
+ "transfer": "Transferir",
+ "transfer-website": "Transferir sitio web",
+ "true": "Verdadero",
+ "ttfb": "TTFB",
+ "type": "Tipo",
+ "unique": "Único",
+ "unique-events": "Eventos únicos",
+ "unique-visitors": "Visitantes únicos",
+ "uniqueCustomers": "Clientes únicos",
+ "unknown": "Desconocida",
+ "untitled": "Sin título",
+ "update": "Actualizar",
+ "url": "URL",
+ "user": "Usuario",
+ "user-property": "Propiedad de usuario",
+ "username": "Nombre de usuario",
+ "users": "Usuarios",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaña",
+ "utm-content": "UTM Contenido",
+ "utm-description": "Realice un seguimiento de sus campañas a través de parámetros UTM.",
+ "utm-medium": "UTM Medio",
+ "utm-source": "UTM Fuente",
+ "utm-term": "UTM Término",
+ "value": "Valor",
+ "version": "Versión",
+ "view": "Visualizar",
+ "view-details": "Ver detalles",
+ "view-only": "Ver sólo",
+ "views": "Vistas",
+ "views-per-visit": "Vistas por visita",
+ "visit-duration": "Tiempo promedio de visita",
+ "visitors": "Visitantes",
+ "visits": "Visitas",
+ "website": "Sitio web",
+ "website-id": "ID del sitio web",
+ "websites": "Sitios web",
+ "window": "Ventana",
+ "yesterday": "Ayer"
+ },
+ "message": {
+ "action-confirmation": "Escriba {confirmation} en el cuadro a continuación para confirmar.",
+ "active-users": "{x} {x, plural, one {activo} other {activos}}",
+ "bad-request": "Solicitud incorrecta",
+ "collected-data": "Datos obtenidos",
+ "confirm-delete": "¿Seguro que quieres eliminar {target}?",
+ "confirm-leave": "¿Seguro que quieres abandonar {target} ?",
+ "confirm-remove": "¿Estás seguro de que desea eliminar {target} ?",
+ "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ó.",
+ "event-log": "{event} en {url} ",
+ "forbidden": "Prohibido",
+ "go-to-settings": "Ir a la configuración",
+ "incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
+ "invalid-domain": "Dominio inválido",
+ "min-password-length": "Longitud mínima de {n} caracteres",
+ "new-version-available": "Una nueva versión de Umami {version} está disponible",
+ "no-data-available": "No hay información disponible.",
+ "no-event-data": "No hay datos de eventos disponibles.",
+ "no-match-password": "Las contraseñas no coinciden",
+ "no-results-found": "No se encontraron resultados.",
+ "no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
+ "no-teams": "No has creado ningún equipo.",
+ "no-users": "No hay usuarios.",
+ "no-websites-configured": "No tienes ningún sitio web configurado.",
+ "not-found": "No encontrado",
+ "nothing-selected": "Nada seleccionado.",
+ "page-not-found": "Página no encontrada",
+ "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-component-preview": "Selecciona un componente para previsualizar",
+ "select-website-first": "Selecciona un sitio web primero",
+ "sever-error": "Error del servidor",
+ "share-url": "Esta es la URL pública para {target}.",
+ "team-already-member": "Ya eres miembro de este equipo.",
+ "team-not-found": "Equipo no encontrado.",
+ "team-websites-info": "Las analíticas de tus sitios web pueden ser vistas por cualquier miembro del equipo.",
+ "tracking-code": "Código de rastreo",
+ "transfer-team-website-to-user": "¿Transferir este sitio web a su cuenta?",
+ "transfer-user-website-to-team": "Seleccione el equipo al que transferir este sitio web.",
+ "transfer-website": "Seleccione el equipo al que transferir este sitio web.",
+ "triggered-event": "Evento lanzado",
+ "unauthorized": "No autorizado",
+ "user-deleted": "Usuario eliminado.",
+ "viewed-page": "Página vista",
+ "visitor-log": "Visitante desde {country} usando {browser} en {os} {device} "
+ }
}
diff --git a/public/intl/messages/es-MX.json b/public/intl/messages/es-MX.json
deleted file mode 100644
index 9dc4b4c96..000000000
--- a/public/intl/messages/es-MX.json
+++ /dev/null
@@ -1,1460 +0,0 @@
-{
- "label.access-code": [
- {
- "type": 0,
- "value": "Código de acceso"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Acciones"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Registro de actividad"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Nuevo sitio web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Todos"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Todos los tiempos"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analíticas"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tiempo promedio de visita"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Atrás"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Porcentaje de rebote"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadores"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancelar"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Cambiar contraseña"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Ciudades"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Limpiar todo"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmar"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmar contraseña"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuar"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Países"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Crear equipo"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Crear usuario"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Creado"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Contraseña actual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Intervalo personalizado"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Panel de control"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Datos"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Intervalo de fechas"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Intervalo por defecto"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Eliminar"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Eliminar team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Eliminar usuario"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Eliminar sitio"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Escritorio"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalles"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivos"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Ignorar"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Dominio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editar"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Editar panel"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Habilitar compartir URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Evento"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Eventos"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinado"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Personalizado"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Unir"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Unir a equipo"
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Idioma"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Idiomas"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portátil"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " días"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimas "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " horas"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Abandonar"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Abandonar equipo"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Iniciar sesión"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Cerrar sesión"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Miembros"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Móvil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Más"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nombre"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nueva contraseña"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Ninguno"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Propietario"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Vistas"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Páginas"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Contraseña"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Analíticas de "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Consultas"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parámetros de petición"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Tiempo real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referido desde"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Actualizar"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerar"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regiones"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Quitar"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obligatorio"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reiniciar"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reiniciar estadísticas"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Guardar"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Pantallas"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Seleccionar sitio web"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesiones"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Configuraciones"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Compartir URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Día"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tableta"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Equipo"
- }
- ],
- "label.team-guest": [
- {
- "type": 0,
- "value": "Invitado de equipo"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID de equipo"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Miembro de equipo"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Admin. del equipo"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Equipos"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Este mes"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Esta semana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Este año"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zona horaria"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Título"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hoy"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Alternar gráficas"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreo"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitantes únicos"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Desconocida"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Usuario"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nombre de usuario"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Usuarios"
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Visualizar"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Ver detalles"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Vistas"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitantes"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID del sitio web"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Sitios"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ayer"
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "activo"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "activos"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "¿Seguro que quieres eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "¿Seguro que quieres abandonar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "¿Seguro que quieres BORRAR las analíticas de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-account": [
- {
- "type": 0,
- "value": "To delete this account, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.delete-website": [
- {
- "type": 0,
- "value": "To delete this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Toda la información relacionada será eliminada."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Algo falló."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ir a la configuración"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nombre de usuario o contraseña incorrectos."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Dominio inválido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Longitud mínima de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caracteres"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "No hay información disponible."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Las contraseñas no coinciden"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Este equipo no tiene ningún sitio web configurado."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "No has creado ningún equipo."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "No hay usuarios."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "No tienes ningún sitio configurado."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Página no encontrada"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Guardado."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Esta es la URL compartida públicamente para "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Ya eres miembro de este equipo."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Equipo no encontrado."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Las analíticas de tus sitios pueden verse por cualquier miembro del equipo."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreo"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Usuario eliminado."
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitante desde "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " usando "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ]
-}
diff --git a/public/intl/messages/fa-IR.json b/public/intl/messages/fa-IR.json
index b24e4732c..cd7352ac0 100644
--- a/public/intl/messages/fa-IR.json
+++ b/public/intl/messages/fa-IR.json
@@ -1,1848 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "کد دسترسی"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "اقدامات"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "فعالیت"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "افزودن"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "افزودن توضیحات"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "افزودن عضو"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "افزودن قدم"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "افزودن وبسایت"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "مدیر"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "بعد"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "همه"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "تمامی زمانها"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "تجزیه و تحلیل"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "میانگین"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "بازگشت"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "قبل از"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "نرخ ریزش"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "تفکیک"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "مرورگر"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "مرورگرها"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "انصراف"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "تغییر رمز"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "شهرها"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "شهر"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "پاک کردن همه"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "مقایسه"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "تأیید"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "تأیید رمز"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "شامل"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "ادامه"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "تعداد"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "کشورها"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "کشور"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "ایجاد"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "ایجاد گزارش"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "ایجاد تیم"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "ایجاد کاربر"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "ایجاد شد"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "ایجاد شده توسط"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "فعلی"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "رمز فعلی"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "محدودهی دلخواه"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "داشبورد"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "داده"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "تاریخ"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "محدودهی تاریخ"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "روز"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "محدودهی پیشفرض تاریخ"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "حذف"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "حذف گزارش"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "حذف تیم"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "حذف کاربر"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "حذف وبسایت"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "توضیحات"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "دسکتاپ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "جزئیات"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "دستگاه"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "دستگاهها"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "رد کردن"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "شامل نمیشود"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "دامنه"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "رها کردن"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "ویرایش"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "ویرایش داشبورد"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "ویرایش عضو"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "فعال کردن اشتراک گذاری آدرس اینترنتی"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "قدم پایانی"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "آدرس اینترنتی ورودی"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "رویداد"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "دادههای رویداد"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "رویدادها"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "آدرس اینترنتی خروجی"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "نادرست"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "فیلد"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "فیلدها"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "فیلتر"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "ترکیب شده"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "خام"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "فیلترها"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "اولین بار دیده شده"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "فانل"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "نرخ تبدیل و رها کردن کاربران را درک کنید."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "هدف"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "اهداف"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "اهداف خود را برای بازدید از صفحه و رویدادها دنبال کنید."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "بزرگتر از"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "بزرگتر یا مساوی"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "هاست"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "هاستها"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "بینش"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "با استفاده از بخشها و فیلترها، در دادههای خود عمیقتر شوید."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "برابر است با"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "برابر نیست با"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "تعیین نشده"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "تعیین شده"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "پیوستن"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "پیوستن به تیم"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "مسیر"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "درک کنید که کاربران چگونه در وبسایت شما حرکت می کنند."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "زبان"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "زبانها"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "لپتاپ"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " روز گذشته"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ساعت گذشته"
- }
- ],
- "label.last-months": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ماه گذشته"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "آخرین بار دیده شده"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "ترک کردن"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "ترک تیم"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "کمتر از"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "کمتر یا مساوی"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "ورود"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "خروج"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "مدیریت"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "مدیر"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "حداکثر"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "عضو"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "اعضا"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "حداقل"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "موبایل"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "بیشتر"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "حساب کاربری من"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "وبسایتهای من"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "نام"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "رمز جدید"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "هیچ"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "تایید"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "سیستم عامل"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "بررسی کلی"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "مالک"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "صفحه "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " از "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "بازدید صفحه"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "عنوان صفحه"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "صفحهها"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "رمز"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "مسیر"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "مسیرها"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "قدرت گرفته توسط "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "قبلی"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "دورهی قبل"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "سال قبل"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "پروفایل"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "ویژگیها"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "ویژگی"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "کوئریها"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "کوئری"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "پارامترهای کوئری"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "آمار زنده"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "ارجاع دهنده"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "ارجاع دهندگان"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "بهروزرسانی"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "تولید مجدد"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "منطقه"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "مناطق"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "حذف"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "حذف عضو"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "گزارشها"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "ضروری"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "بازنشانی"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "بازنشانی وبسایت"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "نرخ بازگشت"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "چسبندگی وبسایت خود را با دنبال کردن تعداد دفعات بازگشت کاربران اندازهگیری کنید."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "درآمد"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "به درآمد خود در طول زمان نگاه کنید."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "ویژگی درآمد"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "نقش"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "اجرای کوئری"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "ذخیره"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "صفحه"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "جستجو"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "انتخاب"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "انتخاب تاریخ"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "انتخاب نقش"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "انتخاب وبسایت"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "نشست"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "نشستها"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "تنظیمات"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "به اشتراک گذاری آدرس اینترنتی"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "یک روز"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "قدم شروع"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "قدمها"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "جمع"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "تبلت"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "تیم"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "شناسه تیم"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "مدیر تیم"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "عضو تیم"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "نام تیم"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "مالک تیم"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "فقط مشاهدهی تیم"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "وبسایتهای تیم"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "تیمها"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "تم"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "این ماه"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "این هفته"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "امسال"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "منطقهی زمانی"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "عنوان"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "امروز"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "نمایش / عدم نمایش نمودارها"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "جمع"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "جمع رکوردها"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "کد رهگیری"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "تراکنشها"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "انتقال"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "انتقال وبسایت"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "درست"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "نوع"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "یکتا"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "بازدیدکنندههای یکتا"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "مشتریان یکتا"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "ناشناخته"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "بدون عنوان"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "بهروزرسانی"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "آدرس اینترنتی"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "آدرسهای اینترنتی"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "کاربر"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "ویژگی کاربر"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "نام کاربری"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "کاربران"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "با استفاده از پارامترهای UTM، کمپینهای خود را بررسی کنید."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "مقدار"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "مشاهده"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "مشاهدهی جزئیات"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "فقط مشاهده"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "بازدید"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "نمایشها در هر بازدید"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "میانگین زمان بازدید"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "بازدیدکننده"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "بازدیدها"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "وبسایت"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "شناسه وبسایت"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "وبسایتها"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "پنجره"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "دیروز"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "برای تأیید این عملیات، لطفاً "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " را تایپ کنید."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " فعلی "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "یک"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "از میان"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "دادههای جمعآوری شده"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "آیا مطمئن هستید میخواهید "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " را حذف کنید؟"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "آیا مطمئن هستید میخواهید از "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " خارج شوید؟"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "آیا مطمئن هستید میخواهید "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " را حذف کنید؟"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "آیا مطمئن هستید میخواهید "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " را بازنشانی کنید؟"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "با حذف تیم، تمامی وبسایتهای تیم هم حذف خواهند شد."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "همهی دادههای وبسایت هم حذف خواهد شد."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "مشکلی پیش آمده است."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " در "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "رفتن به تنظیمات"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "نام کاربری / رمز نادرست است."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "دامنه نامعتبر است."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "حداقل طول "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " کاراکتر است."
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "نسخهی جدیدی از Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " در دسترس است."
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "اطلاعاتی موجود نیست."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "هیچ دادهای برای این رویداد وجود ندارد."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "رمزها یکسان نیستند"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "نتیجهای یافت نشد."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "هیچ وبسایتی برای این تیم وجود ندارد."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "شما هیچ تیمی را ایجاد نکردهاید."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "هیچ کاربری وجود ندارد."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "شما هیچ وبسایتی را پیکربندی نکردهاید."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "صفحه یافت نشد."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "برای بازنشانی وبسایت، لطفاً "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " را تایپ کنید."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "تمامی آمارهای این وبسایت حذف خواهد شد اما کدهای رهگیری بدون تغییر باقی میماند."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "ذخیره شد."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "آمار وبسایت شما به صورت عمومی در آدرس زیر قابل مشاهده است."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "شما از قبل عضو این تیم هستید."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "تیم یافت نشد."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "وبسایتها توسط تمامی اعضای تیم قابل مشاهده هستند."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "کد رهگیری"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "آیا میخواهید این وبسایت را به حساب خود منتقل کنید؟"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "تیم مورد نظر را برای انتقال وبسایت انتخاب کنید."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "مالکیت وبسایت را به حساب خودت یا یک تیم دیگر منتقل کنید."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "رویداد فعال شده"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "کاربر حذف شد."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "صفحه مشاهده شد"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "بازدیدکننده از کشور "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " با مروگر "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " در "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "ریزش بازدیدکنندهها"
- }
- ]
+ "label": {
+ "access-code": "کد دسترسی",
+ "account": "حساب کاربری",
+ "action": "عملیات",
+ "actions": "اقدامات",
+ "activity": "فعالیت",
+ "add": "افزودن",
+ "add-board": "افزودن برد",
+ "add-description": "افزودن توضیحات",
+ "add-link": "افزودن لینک",
+ "add-member": "افزودن عضو",
+ "add-pixel": "افزودن پیکسل",
+ "add-step": "افزودن قدم",
+ "add-website": "افزودن وبسایت",
+ "admin": "مدیر",
+ "affiliate": "همکار فروش",
+ "after": "بعد",
+ "all": "همه",
+ "all-time": "تمامی زمانها",
+ "analysis": "تحلیل",
+ "analytics": "تجزیه و تحلیل",
+ "aov": "AOV",
+ "application": "برنامه",
+ "apply": "اعمال",
+ "arpu": "ARPU",
+ "attribution": "انتساب",
+ "attribution-description": "ببینید کاربران چگونه با بازاریابی شما تعامل دارند و چه چیزی باعث تبدیل میشود.",
+ "audience": "مخاطبان",
+ "average": "میانگین",
+ "back": "بازگشت",
+ "before": "قبل از",
+ "behavior": "رفتار",
+ "block-selector": "انتخابگر بلوک",
+ "boards": "بردها",
+ "bounce-rate": "نرخ ریزش",
+ "breakdown": "تفکیک",
+ "browser": "مرورگر",
+ "browsers": "مرورگرها",
+ "campaign": "کمپین",
+ "campaigns": "کمپینها",
+ "cancel": "انصراف",
+ "change-password": "تغییر رمز",
+ "channel": "کانال",
+ "channels": "کانالها",
+ "chart": "نمودار",
+ "cities": "شهرها",
+ "city": "شهر",
+ "clear-all": "پاک کردن همه",
+ "cls": "CLS",
+ "cohort": "گروه",
+ "cohorts": "گروهها",
+ "compare": "مقایسه",
+ "compare-dates": "مقایسه تاریخها",
+ "confirm": "تأیید",
+ "confirm-password": "تأیید رمز",
+ "contains": "شامل",
+ "content": "محتوا",
+ "continue": "ادامه",
+ "conversion": "تبدیل",
+ "conversion-rate": "نرخ تبدیل",
+ "conversion-step": "گام تبدیل",
+ "count": "تعداد",
+ "countries": "کشورها",
+ "country": "کشور",
+ "create": "ایجاد",
+ "create-report": "ایجاد گزارش",
+ "create-team": "ایجاد تیم",
+ "create-user": "ایجاد کاربر",
+ "created": "ایجاد شد",
+ "created-by": "ایجاد شده توسط",
+ "criteria": "معیارها",
+ "currency": "واحد پول",
+ "current": "فعلی",
+ "current-password": "رمز فعلی",
+ "custom-range": "محدودهی دلخواه",
+ "dashboard": "داشبورد",
+ "data": "داده",
+ "date": "تاریخ",
+ "date-range": "محدودهی تاریخ",
+ "day": "روز",
+ "default-date-range": "محدودهی پیشفرض تاریخ",
+ "delete": "حذف",
+ "delete-report": "حذف گزارش",
+ "delete-team": "حذف تیم",
+ "delete-user": "حذف کاربر",
+ "delete-website": "حذف وبسایت",
+ "description": "توضیحات",
+ "desktop": "دسکتاپ",
+ "destination-url": "URL مقصد",
+ "details": "جزئیات",
+ "device": "دستگاه",
+ "devices": "دستگاهها",
+ "direct": "مستقیم",
+ "dismiss": "رد کردن",
+ "distinct-id": "شناسه یکتا",
+ "documentation": "مستندات",
+ "does-not-contain": "شامل نمیشود",
+ "does-not-include": "شامل نمیشود",
+ "doest-not-exist": "وجود ندارد",
+ "domain": "دامنه",
+ "download": "دانلود",
+ "dropoff": "رها کردن",
+ "duration": "مدت",
+ "edit": "ویرایش",
+ "edit-member": "ویرایش عضو",
+ "email": "ایمیل",
+ "enable-share-url": "فعال کردن اشتراک گذاری آدرس اینترنتی",
+ "end-step": "قدم پایانی",
+ "entry": "آدرس اینترنتی ورودی",
+ "environment": "محیط",
+ "event": "رویداد",
+ "event-data": "دادههای رویداد",
+ "event-name": "نام رویداد",
+ "events": "رویدادها",
+ "exclude-bounce": "حذف نرخ پرش",
+ "exists": "وجود دارد",
+ "exit": "آدرس اینترنتی خروجی",
+ "false": "نادرست",
+ "fcp": "FCP",
+ "field": "فیلد",
+ "fields": "فیلدها",
+ "filter": "فیلتر",
+ "filter-combined": "ترکیب شده",
+ "filter-raw": "خام",
+ "filters": "فیلترها",
+ "first-click": "اولین کلیک",
+ "first-seen": "اولین بار دیده شده",
+ "funnel": "فانل",
+ "funnel-description": "نرخ تبدیل و رها کردن کاربران را درک کنید.",
+ "funnels": "قیفها",
+ "goal": "هدف",
+ "goals": "اهداف",
+ "goals-description": "اهداف خود را برای بازدید از صفحه و رویدادها دنبال کنید.",
+ "good": "خوب",
+ "greater-than": "بزرگتر از",
+ "greater-than-equals": "بزرگتر یا مساوی",
+ "grouped": "گروهبندی شده",
+ "growth": "رشد",
+ "hostname": "نام میزبان",
+ "hour": "ساعت",
+ "includes": "شامل میشود",
+ "inp": "INP",
+ "insight": "بینش",
+ "insights": "بینش",
+ "insights-description": "با استفاده از بخشها و فیلترها، در دادههای خود عمیقتر شوید.",
+ "invalid-url": "URL نامعتبر",
+ "is": "برابر است با",
+ "is-false": "نادرست است",
+ "is-not": "برابر نیست با",
+ "is-not-set": "تعیین نشده",
+ "is-set": "تعیین شده",
+ "is-true": "درست است",
+ "join": "پیوستن",
+ "join-team": "پیوستن به تیم",
+ "journey": "مسیر",
+ "journey-description": "درک کنید که کاربران چگونه در وبسایت شما حرکت می کنند.",
+ "journeys": "مسیرها",
+ "language": "زبان",
+ "languages": "زبانها",
+ "laptop": "لپتاپ",
+ "last-click": "آخرین کلیک",
+ "last-days": "{x} روز گذشته",
+ "last-hours": "{x} ساعت گذشته",
+ "last-months": "{x} ماه گذشته",
+ "last-seen": "آخرین بار دیده شده",
+ "lcp": "LCP",
+ "leave": "ترک کردن",
+ "leave-team": "ترک تیم",
+ "less-than": "کمتر از",
+ "less-than-equals": "کمتر یا مساوی",
+ "link": "لینک",
+ "links": "لینکها",
+ "location": "موقعیت",
+ "login": "ورود",
+ "logout": "خروج",
+ "manage": "مدیریت",
+ "manager": "مدیر",
+ "mask-level": "سطح ماسک",
+ "match": "تطابق",
+ "match-all": "همه",
+ "match-any": "هر",
+ "max": "حداکثر",
+ "max-duration": "حداکثر مدت",
+ "maximize": "گسترش",
+ "medium": "متوسط",
+ "member": "عضو",
+ "members": "اعضا",
+ "min": "حداقل",
+ "minute": "دقیقه",
+ "mobile": "موبایل",
+ "model": "مدل",
+ "month": "ماه",
+ "more": "بیشتر",
+ "my-account": "حساب کاربری من",
+ "my-websites": "وبسایتهای من",
+ "name": "نام",
+ "needs-improvement": "نیاز به بهبود",
+ "new-password": "رمز جدید",
+ "none": "هیچ",
+ "number-of-records": "{x} {x, plural, one {رکورد} other {رکورد}}",
+ "ok": "تایید",
+ "online": "آنلاین",
+ "organic-search": "جستجوی ارگانیک",
+ "organic-shopping": "خرید ارگانیک",
+ "organic-social": "شبکه اجتماعی ارگانیک",
+ "organic-video": "ویدیوی ارگانیک",
+ "os": "سیستم عامل",
+ "other": "سایر",
+ "overview": "بررسی کلی",
+ "owner": "مالک",
+ "page": "صفحه",
+ "page-of": "صفحه {current} از {total}",
+ "page-views": "بازدید صفحه",
+ "pages": "صفحهها",
+ "pageTitle": "عنوان صفحه",
+ "paid-ads": "تبلیغات پولی",
+ "paid-search": "جستجوی پولی",
+ "paid-shopping": "خرید پولی",
+ "paid-social": "شبکه اجتماعی پولی",
+ "paid-video": "ویدیوی پولی",
+ "password": "رمز",
+ "path": "مسیر",
+ "paths": "مسیرها",
+ "performance": "عملکرد",
+ "pixel": "پیکسل",
+ "pixels": "پیکسلها",
+ "play": "پخش",
+ "poor": "ضعیف",
+ "powered-by": "قدرت گرفته توسط {name}",
+ "preferences": "تنظیمات",
+ "previous": "قبلی",
+ "previous-period": "دورهی قبل",
+ "previous-year": "سال قبل",
+ "profile": "پروفایل",
+ "profiles": "پروفایلها",
+ "properties": "ویژگیها",
+ "property": "ویژگی",
+ "queries": "کوئریها",
+ "query": "کوئری",
+ "query-parameters": "پارامترهای کوئری",
+ "realtime": "آمار زنده",
+ "recorded": "ثبت شده در",
+ "referral": "ارجاع",
+ "referrer": "ارجاع دهنده",
+ "referrers": "ارجاع دهندگان",
+ "refresh": "بهروزرسانی",
+ "regenerate": "تولید مجدد",
+ "regex-match": "با عبارت منظم مطابقت دارد",
+ "regex-not-match": "با عبارت منظم مطابقت ندارد",
+ "region": "منطقه",
+ "regions": "مناطق",
+ "remaining": "باقیمانده",
+ "remove": "حذف",
+ "remove-member": "حذف عضو",
+ "replay": "پخش مجدد",
+ "replay-enabled": "پخش مجدد فعال",
+ "replay-id": "Replay ID",
+ "replays": "پخشهای مجدد",
+ "reports": "گزارشها",
+ "required": "ضروری",
+ "reset": "بازنشانی",
+ "reset-website": "بازنشانی وبسایت",
+ "retention": "نرخ بازگشت",
+ "retention-days": "روزهای نگهداری",
+ "retention-description": "چسبندگی وبسایت خود را با دنبال کردن تعداد دفعات بازگشت کاربران اندازهگیری کنید.",
+ "revenue": "درآمد",
+ "revenue-description": "به درآمد خود در طول زمان نگاه کنید.",
+ "role": "نقش",
+ "run-query": "اجرای کوئری",
+ "sample-rate": "نرخ نمونهگیری",
+ "sample-size": "اندازه نمونه",
+ "save": "ذخیره",
+ "save-cohort": "ذخیره گروه",
+ "save-segment": "ذخیره بخش",
+ "screen": "صفحه نمایش",
+ "screens": "صفحه",
+ "search": "جستجو",
+ "segment": "بخش",
+ "segments": "بخشها",
+ "select": "انتخاب",
+ "select-component": "یک کامپوننت انتخاب کنید",
+ "select-date": "انتخاب تاریخ",
+ "select-filter": "انتخاب فیلتر",
+ "select-role": "انتخاب نقش",
+ "select-website": "انتخاب وبسایت",
+ "session": "نشست",
+ "session-data": "دادههای نشست",
+ "sessions": "نشستها",
+ "settings": "تنظیمات",
+ "share": "اشتراکگذاری",
+ "share-url": "به اشتراک گذاری آدرس اینترنتی",
+ "single-day": "یک روز",
+ "slug": "Slug",
+ "sms": "پیامک",
+ "source": "منبع",
+ "sources": "منابع",
+ "start-step": "قدم شروع",
+ "steps": "قدمها",
+ "sum": "جمع",
+ "support": "پشتیبانی",
+ "switch-account": "تغییر حساب",
+ "table": "جدول",
+ "tablet": "تبلت",
+ "tag": "برچسب",
+ "tags": "برچسبها",
+ "team": "تیم",
+ "team-id": "شناسه تیم",
+ "team-manager": "مدیر تیم",
+ "team-member": "عضو تیم",
+ "team-name": "نام تیم",
+ "team-owner": "مالک تیم",
+ "team-settings": "تنظیمات تیم",
+ "team-view-only": "فقط مشاهدهی تیم",
+ "team-websites": "وبسایتهای تیم",
+ "teams": "تیمها",
+ "term": "عبارت جستجو",
+ "terms": "شرایط",
+ "theme": "تم",
+ "this-month": "این ماه",
+ "this-week": "این هفته",
+ "this-year": "امسال",
+ "timezone": "منطقهی زمانی",
+ "title": "عنوان",
+ "today": "امروز",
+ "toggle-charts": "نمایش / عدم نمایش نمودارها",
+ "total": "جمع",
+ "total-records": "جمع رکوردها",
+ "tracking-code": "کد رهگیری",
+ "traffic": "ترافیک",
+ "transactions": "تراکنشها",
+ "transfer": "انتقال",
+ "transfer-website": "انتقال وبسایت",
+ "true": "درست",
+ "ttfb": "TTFB",
+ "type": "نوع",
+ "unique": "یکتا",
+ "unique-events": "رویدادهای یکتا",
+ "unique-visitors": "بازدیدکنندههای یکتا",
+ "uniqueCustomers": "مشتریان یکتا",
+ "unknown": "ناشناخته",
+ "untitled": "بدون عنوان",
+ "update": "بهروزرسانی",
+ "url": "URL",
+ "user": "کاربر",
+ "username": "نام کاربری",
+ "users": "کاربران",
+ "utm": "UTM",
+ "utm-campaign": "UTM کمپین",
+ "utm-content": "UTM محتوا",
+ "utm-description": "با استفاده از پارامترهای UTM، کمپینهای خود را بررسی کنید.",
+ "utm-medium": "UTM رسانه",
+ "utm-source": "UTM منبع",
+ "utm-term": "UTM عبارت",
+ "value": "مقدار",
+ "version": "نسخه",
+ "view": "مشاهده",
+ "view-details": "مشاهدهی جزئیات",
+ "view-only": "فقط مشاهده",
+ "views": "بازدید",
+ "views-per-visit": "نمایشها در هر بازدید",
+ "visit-duration": "میانگین زمان بازدید",
+ "visitors": "بازدیدکننده",
+ "visits": "بازدیدها",
+ "website": "وبسایت",
+ "website-id": "شناسه وبسایت",
+ "websites": "وبسایتها",
+ "window": "پنجره",
+ "yesterday": "دیروز"
+ },
+ "message": {
+ "action-confirmation": "برای تأیید این عملیات، لطفاً {confirmation} را تایپ کنید.",
+ "active-users": "{x} فعلی {x, plural, one {یک} other {از میان}}",
+ "bad-request": "درخواست نامعتبر",
+ "collected-data": "دادههای جمعآوری شده",
+ "confirm-delete": "آیا مطمئن هستید میخواهید {target} را حذف کنید؟",
+ "confirm-leave": "آیا مطمئن هستید میخواهید از {target} خارج شوید؟",
+ "confirm-remove": "آیا مطمئن هستید میخواهید {target} را حذف کنید؟",
+ "confirm-reset": "آیا مطمئن هستید میخواهید {target} را بازنشانی کنید؟",
+ "delete-team-warning": "با حذف تیم، تمامی وبسایتهای تیم هم حذف خواهند شد.",
+ "delete-website-warning": "همهی دادههای وبسایت هم حذف خواهد شد.",
+ "empty-dashboard": "داشبورد شما خالی است. روی ویرایش کلیک کنید تا اولین کامپوننت خود را اضافه کنید.",
+ "error": "مشکلی پیش آمده است.",
+ "event-log": "{event} در {url} ",
+ "forbidden": "ممنوع",
+ "go-to-settings": "رفتن به تنظیمات",
+ "incorrect-username-password": "نام کاربری / رمز نادرست است.",
+ "invalid-domain": "دامنه نامعتبر است.",
+ "min-password-length": "حداقل طول {n} کاراکتر است.",
+ "new-version-available": "نسخهی جدیدی از Umami {version} در دسترس است.",
+ "no-data-available": "اطلاعاتی موجود نیست.",
+ "no-event-data": "هیچ دادهای برای این رویداد وجود ندارد.",
+ "no-match-password": "رمزها یکسان نیستند",
+ "no-results-found": "نتیجهای یافت نشد.",
+ "no-team-websites": "هیچ وبسایتی برای این تیم وجود ندارد.",
+ "no-teams": "شما هیچ تیمی را ایجاد نکردهاید.",
+ "no-users": "هیچ کاربری وجود ندارد.",
+ "no-websites-configured": "شما هیچ وبسایتی را پیکربندی نکردهاید.",
+ "not-found": "یافت نشد",
+ "nothing-selected": "چیزی انتخاب نشده است.",
+ "page-not-found": "صفحه یافت نشد.",
+ "reset-website": "برای بازنشانی وبسایت، لطفاً {confirmation} را تایپ کنید.",
+ "reset-website-warning": "تمامی آمارهای این وبسایت حذف خواهد شد اما کدهای رهگیری بدون تغییر باقی میماند.",
+ "saved": "ذخیره شد.",
+ "select-component-preview": "یک کامپوننت برای پیشنمایش انتخاب کنید",
+ "select-website-first": "ابتدا یک وبسایت انتخاب کنید",
+ "sever-error": "خطای سرور",
+ "share-url": "آمار وبسایت شما به صورت عمومی در آدرس زیر قابل مشاهده است.",
+ "team-already-member": "شما از قبل عضو این تیم هستید.",
+ "team-not-found": "تیم یافت نشد.",
+ "team-websites-info": "وبسایتها توسط تمامی اعضای تیم قابل مشاهده هستند.",
+ "tracking-code": "کد رهگیری",
+ "transfer-team-website-to-user": "آیا میخواهید این وبسایت را به حساب خود منتقل کنید؟",
+ "transfer-user-website-to-team": "تیم مورد نظر را برای انتقال وبسایت انتخاب کنید.",
+ "transfer-website": "مالکیت وبسایت را به حساب خودت یا یک تیم دیگر منتقل کنید.",
+ "triggered-event": "رویداد فعال شده",
+ "unauthorized": "غیرمجاز",
+ "user-deleted": "کاربر حذف شد.",
+ "viewed-page": "صفحه مشاهده شد",
+ "visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device} "
+ }
}
diff --git a/public/intl/messages/fi-FI.json b/public/intl/messages/fi-FI.json
index 9a1f066f2..4dfc671b9 100644
--- a/public/intl/messages/fi-FI.json
+++ b/public/intl/messages/fi-FI.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Toiminnat"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Lisää verkkosivu"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Järjestelmänvalvoja"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Kaikki"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Alusta lähtien"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Takaisin"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Välitön poistuminen"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Selaimet"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Peruuta"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Vaihda salasana"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Vahvista salasana"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Maat"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Nykyinen salasana"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Mukautettu ajanjakso"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Ohjauspaneeli"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Ajanjakso"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Oletusajanjakso"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Poista"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Poista verkkosivu"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Pöytäkone"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Laitteet"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Hylkää"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Verkkotunnus"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Muokkaa"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Ota jakamisen URL-osoite käyttöön"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Tapahtumat"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Yhdistetty"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Käsittelemätön"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Kieli"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Kielet"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Kannettava tietokone"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Viimeisimmät "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " päivää"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Viimeisimmät "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " tuntia"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Kirjaudu sisään"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Kirjaudu ulos"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Puhelin"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Lisää"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nimi"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Uusi salasana"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Omistaja"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Sivun näyttökerrat"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Sivut"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Salasana"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Voimanlähteenä "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profiili"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Juuri nyt"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Viittaajat"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Päivitä"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Vaaditaan"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Nollaa"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Nollaa tilastot"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Tallenna"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Asetukset"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Jaa URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Yksi päivä"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tabletti"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Teema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Tämä kuukausi"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Tämä viikko"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Tämä vuosi"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Aikavyöhyke"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Tänään"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Kytke kaaviot päälle/pois"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Seurantakoodi"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Yksittäiset kävijät"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Tuntematon"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Käyttäjänimi"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Katso tiedot"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Näyttökerrat"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Keskimääräinen vierailuaika"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Vierailijat"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Verkkosivut"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "vierailija"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "vierailijaa"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Haluatko varmasti poistaa sivuston "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Haluatko varmasti poistaa sivuston "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " tilastot?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Kaikki siihen liittyvät tiedot poistetaan."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Jotain meni pieleen."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Mene asetuksiin"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Väärä käyttäjänimi/salasana."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Virheellinen verkkotunnus"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Tietoja ei ole käytettävissä."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Salasanat eivät täsmää"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Sinulla ei ole määritettyjä verkkosivustoja."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Sivua ei löydetty."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Tallennettu onnistuneesti."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Tämä on julkisesti jaettu URL sivustolle "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Seurantakoodi"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Vierailija maasta "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " selaimella "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " laitteella "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Pääsykoodi",
+ "account": "Tili",
+ "action": "Toiminto",
+ "actions": "Toiminnat",
+ "activity": "Toimintaloki",
+ "add": "Lisää",
+ "add-board": "Lisää taulu",
+ "add-description": "Lisää kuvaus",
+ "add-link": "Lisää linkki",
+ "add-member": "Lisää jäsen",
+ "add-pixel": "Lisää pikseli",
+ "add-step": "Lisää vaihe",
+ "add-website": "Lisää verkkosivu",
+ "admin": "Järjestelmänvalvoja",
+ "affiliate": "Kumppani",
+ "after": "Jälkeen",
+ "all": "Kaikki",
+ "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ö",
+ "average": "Keskiarvo",
+ "back": "Takaisin",
+ "before": "Ennen",
+ "behavior": "Käyttäytyminen",
+ "block-selector": "Lohkovalitsin",
+ "boards": "Taulut",
+ "bounce-rate": "Välitön poistuminen",
+ "breakdown": "Erittele",
+ "browser": "Selain",
+ "browsers": "Selaimet",
+ "campaign": "Kampanja",
+ "campaigns": "Kampanjat",
+ "cancel": "Peruuta",
+ "change-password": "Vaihda salasana",
+ "channel": "Kanava",
+ "channels": "Kanavat",
+ "chart": "Kaavio",
+ "cities": "Kaupungit",
+ "city": "Kaupunki",
+ "clear-all": "Tyhjennä kaikki",
+ "cls": "CLS",
+ "cohort": "Kohortti",
+ "cohorts": "Kohortit",
+ "compare": "Vertaa",
+ "compare-dates": "Vertaa päivämääriä",
+ "confirm": "Vahvista",
+ "confirm-password": "Vahvista salasana",
+ "contains": "Sisältää",
+ "content": "Sisältö",
+ "continue": "Jatka",
+ "conversion": "Konversio",
+ "conversion-rate": "Konversioprosentti",
+ "conversion-step": "Konversiovaihe",
+ "count": "Lukumäärä",
+ "countries": "Maat",
+ "country": "Maa",
+ "create": "Luo",
+ "create-report": "Luo raportti",
+ "create-team": "Luo tiimi",
+ "create-user": "Luo käyttäjä",
+ "created": "Luotu",
+ "created-by": "Luonut",
+ "criteria": "Kriteerit",
+ "currency": "Valuutta",
+ "current": "Nykyinen",
+ "current-password": "Nykyinen salasana",
+ "custom-range": "Mukautettu ajanjakso",
+ "dashboard": "Ohjauspaneeli",
+ "data": "Data",
+ "date": "Päivämäärä",
+ "date-range": "Ajanjakso",
+ "day": "Päivä",
+ "default-date-range": "Oletusajanjakso",
+ "delete": "Poista",
+ "delete-report": "Poista raportti",
+ "delete-team": "Poista tiimi",
+ "delete-user": "Poista käyttäjä",
+ "delete-website": "Poista verkkosivu",
+ "description": "Kuvaus",
+ "desktop": "Pöytäkone",
+ "destination-url": "Kohde-URL",
+ "details": "Tiedot",
+ "device": "Laite",
+ "devices": "Laitteet",
+ "direct": "Suora",
+ "dismiss": "Hylkää",
+ "distinct-id": "Yksilöllinen ID",
+ "documentation": "Dokumentaatio",
+ "does-not-contain": "Ei sisällä",
+ "does-not-include": "Ei sisällä",
+ "doest-not-exist": "Ei ole olemassa",
+ "domain": "Verkkotunnus",
+ "download": "Lataa",
+ "dropoff": "Poistuminen",
+ "duration": "Kesto",
+ "edit": "Muokkaa",
+ "edit-member": "Muokkaa jäsentä",
+ "email": "Sähköposti",
+ "enable-share-url": "Ota jakamisen URL-osoite käyttöön",
+ "end-step": "Loppuvaihe",
+ "entry": "Tulo-URL",
+ "environment": "Ympäristö",
+ "event": "Tapahtuma",
+ "event-data": "Tapahtumatiedot",
+ "event-name": "Tapahtuman nimi",
+ "events": "Tapahtumat",
+ "exclude-bounce": "Sulje poishyppäys pois",
+ "exists": "On olemassa",
+ "exit": "Poistumis-URL",
+ "false": "Epätosi",
+ "fcp": "FCP",
+ "field": "Kenttä",
+ "fields": "Kentät",
+ "filter": "Suodatin",
+ "filter-combined": "Yhdistetty",
+ "filter-raw": "Käsittelemätön",
+ "filters": "Suodattimet",
+ "first-click": "Ensimmäinen klikkaus",
+ "first-seen": "Ensimmäinen havainto",
+ "funnel": "Suppilo",
+ "funnel-description": "Ymmärrä käyttäjien konversio- ja poistumisprosentti.",
+ "funnels": "Suppilot",
+ "goal": "Tavoite",
+ "goals": "Tavoitteet",
+ "goals-description": "Seuraa sivun katselujen ja tapahtumien tavoitteitasi.",
+ "good": "Hyvä",
+ "greater-than": "Suurempi kuin",
+ "greater-than-equals": "Suurempi tai yhtä suuri kuin",
+ "grouped": "Ryhmitelty",
+ "growth": "Kasvu",
+ "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.",
+ "invalid-url": "Virheellinen URL",
+ "is": "On",
+ "is-false": "On epätosi",
+ "is-not": "Ei ole",
+ "is-not-set": "Ei asetettu",
+ "is-set": "Asetettu",
+ "is-true": "On tosi",
+ "join": "Liity",
+ "join-team": "Liity tiimiin",
+ "journey": "Polku",
+ "journey-description": "Ymmärrä, miten käyttäjät navigoivat sivustollasi.",
+ "journeys": "Polut",
+ "language": "Kieli",
+ "languages": "Kielet",
+ "laptop": "Kannettava tietokone",
+ "last-click": "Viimeinen klikkaus",
+ "last-days": "Viimeisimmät {x} päivää",
+ "last-hours": "Viimeisimmät {x} tuntia",
+ "last-months": "Viimeiset {x} kuukautta",
+ "last-seen": "Viimeksi nähty",
+ "lcp": "LCP",
+ "leave": "Poistu",
+ "leave-team": "Poistu tiimistä",
+ "less-than": "Vähemmän kuin",
+ "less-than-equals": "Vähemmän tai yhtä suuri kuin",
+ "link": "Linkki",
+ "links": "Linkit",
+ "location": "Sijainti",
+ "login": "Kirjaudu sisään",
+ "logout": "Kirjaudu ulos",
+ "manage": "Hallinnoi",
+ "manager": "Päällikkö",
+ "mask-level": "Maskitaso",
+ "match": "Vastaavuus",
+ "match-all": "Kaikki",
+ "match-any": "Mikä tahansa",
+ "max": "Maksimi",
+ "max-duration": "Enimmäiskesto",
+ "maximize": "Laajenna",
+ "medium": "Keskitaso",
+ "member": "Jäsen",
+ "members": "Jäsenet",
+ "min": "Minimi",
+ "minute": "Minuutti",
+ "mobile": "Puhelin",
+ "model": "Malli",
+ "month": "Kuukausi",
+ "more": "Lisää",
+ "my-account": "Oma tili",
+ "my-websites": "Omat verkkosivut",
+ "name": "Nimi",
+ "needs-improvement": "Tarvitsee parannusta",
+ "new-password": "Uusi salasana",
+ "none": "Ei mitään",
+ "number-of-records": "{x} {x, plural, one {tietue} other {tietuetta}}",
+ "ok": "OK",
+ "online": "Verkossa",
+ "organic-search": "Orgaaninen haku",
+ "organic-shopping": "Orgaaninen ostaminen",
+ "organic-social": "Orgaaninen sosiaalinen",
+ "organic-video": "Orgaaninen video",
+ "os": "Käyttöjärjestelmä",
+ "other": "Muu",
+ "overview": "Yleiskatsaus",
+ "owner": "Omistaja",
+ "page": "Sivu",
+ "page-of": "Sivu {current} / {total}",
+ "page-views": "Sivun näyttökerrat",
+ "pages": "Sivut",
+ "pageTitle": "Sivun otsikko",
+ "paid-ads": "Maksetut mainokset",
+ "paid-search": "Maksettu haku",
+ "paid-shopping": "Maksettu ostaminen",
+ "paid-social": "Maksettu sosiaalinen",
+ "paid-video": "Maksettu video",
+ "password": "Salasana",
+ "path": "Polku",
+ "paths": "Polut",
+ "performance": "Suorituskyky",
+ "pixel": "Pikseli",
+ "pixels": "Pikselit",
+ "play": "Toista",
+ "poor": "Huono",
+ "powered-by": "Voimanlähteenä {name}",
+ "preferences": "Asetukset",
+ "previous": "Edellinen",
+ "previous-period": "Edellinen ajanjakso",
+ "previous-year": "Edellinen vuosi",
+ "profile": "Profiili",
+ "profiles": "Profiilit",
+ "properties": "Ominaisuudet",
+ "property": "Ominaisuus",
+ "queries": "Kyselyt",
+ "query": "Kysely",
+ "query-parameters": "Kyselyn parametrit",
+ "realtime": "Juuri nyt",
+ "recorded": "Tallennettu",
+ "referral": "Viittaus",
+ "referrer": "Viittaaja",
+ "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",
+ "replay": "Toisto",
+ "replay-enabled": "Toisto käytössä",
+ "replay-id": "Replay ID",
+ "replays": "Toistot",
+ "reports": "Raportit",
+ "required": "Vaaditaan",
+ "reset": "Nollaa",
+ "reset-website": "Nollaa tilastot",
+ "retention": "Säilyvyys",
+ "retention-days": "Säilytyspäivät",
+ "retention-description": "Mittaa verkkosivustosi sitoutumista seuraamalla, kuinka usein käyttäjät palaavat.",
+ "revenue": "Tulot",
+ "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-segment": "Tallenna segmentti",
+ "screen": "Näyttö",
+ "screens": "Näytöt",
+ "search": "Haku",
+ "segment": "Segmentti",
+ "segments": "Segmentit",
+ "select": "Valitse",
+ "select-component": "Valitse komponentti",
+ "select-date": "Valitse päivämäärä",
+ "select-filter": "Valitse suodatin",
+ "select-role": "Valitse rooli",
+ "select-website": "Valitse verkkosivu",
+ "session": "Istunto",
+ "session-data": "Istuntotiedot",
+ "sessions": "Istunnot",
+ "settings": "Asetukset",
+ "share": "Jaa",
+ "share-url": "Jaa URL",
+ "single-day": "Yksi päivä",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Lähde",
+ "sources": "Lähteet",
+ "start-step": "Aloitusvaihe",
+ "steps": "Vaiheet",
+ "sum": "Summa",
+ "support": "Tuki",
+ "switch-account": "Vaihda tiliä",
+ "table": "Taulukko",
+ "tablet": "Tabletti",
+ "tag": "Tunniste",
+ "tags": "Tunnisteet",
+ "team": "Tiimi",
+ "team-id": "Tiimin ID",
+ "team-manager": "Tiimin johtaja",
+ "team-member": "Tiimin jäsen",
+ "team-name": "Tiimin nimi",
+ "team-owner": "Tiimin omistaja",
+ "team-settings": "Tiimin asetukset",
+ "team-view-only": "Vain tiimin katselu",
+ "team-websites": "Tiimin verkkosivut",
+ "teams": "Tiimit",
+ "term": "Hakusana",
+ "terms": "Ehdot",
+ "theme": "Teema",
+ "this-month": "Tämä kuukausi",
+ "this-week": "Tämä viikko",
+ "this-year": "Tämä vuosi",
+ "timezone": "Aikavyöhyke",
+ "title": "Otsikko",
+ "today": "Tänään",
+ "toggle-charts": "Kytke kaaviot päälle/pois",
+ "total": "Yhteensä",
+ "total-records": "Tietueita yhteensä",
+ "tracking-code": "Seurantakoodi",
+ "traffic": "Liikenne",
+ "transactions": "Transaktiot",
+ "transfer": "Siirrä",
+ "transfer-website": "Siirrä verkkosivu",
+ "true": "Tosi",
+ "ttfb": "TTFB",
+ "type": "Tyyppi",
+ "unique": "Uniikki",
+ "unique-events": "Uniikit tapahtumat",
+ "unique-visitors": "Yksittäiset kävijät",
+ "uniqueCustomers": "Uniikit asiakkaat",
+ "unknown": "Tuntematon",
+ "untitled": "Nimetön",
+ "update": "Päivitä",
+ "url": "URL",
+ "user": "Käyttäjä",
+ "username": "Käyttäjänimi",
+ "users": "Käyttäjät",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampanja",
+ "utm-content": "UTM-sisältö",
+ "utm-description": "Seuraa kampanjoitasi UTM-parametrien avulla.",
+ "utm-medium": "UTM-media",
+ "utm-source": "UTM-lähde",
+ "utm-term": "UTM-hakusana",
+ "value": "Arvo",
+ "version": "Versio",
+ "view": "Näytä",
+ "view-details": "Katso tiedot",
+ "view-only": "Vain katselu",
+ "views": "Näyttökerrat",
+ "views-per-visit": "Katselukerrat vierailua kohti",
+ "visit-duration": "Keskimääräinen vierailuaika",
+ "visitors": "Vierailijat",
+ "visits": "Vierailut",
+ "website": "Verkkosivu",
+ "website-id": "Verkkosivun ID",
+ "websites": "Verkkosivut",
+ "window": "Ikkuna",
+ "yesterday": "Eilen"
+ },
+ "message": {
+ "action-confirmation": "Kirjoita {confirmation} alla olevaan kenttään vahvistaaksesi.",
+ "active-users": "{x} {x, plural, one {vierailija} other {vierailijaa}}",
+ "bad-request": "Virheellinen pyyntö",
+ "collected-data": "Kerätty data",
+ "confirm-delete": "Haluatko varmasti poistaa sivuston {target}?",
+ "confirm-leave": "Haluatko varmasti poistua {target} ?",
+ "confirm-remove": "Haluatko varmasti poistaa {target} ?",
+ "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.",
+ "event-log": "{event} sivulla {url} ",
+ "forbidden": "Kielletty",
+ "go-to-settings": "Mene asetuksiin",
+ "incorrect-username-password": "Väärä käyttäjänimi/salasana.",
+ "invalid-domain": "Virheellinen verkkotunnus",
+ "min-password-length": "Vähimmäispituus {n} merkkiä",
+ "new-version-available": "Umamista on saatavilla uusi versio {version}!",
+ "no-data-available": "Tietoja ei ole käytettävissä.",
+ "no-event-data": "Tapahtumatietoja ei ole saatavilla.",
+ "no-match-password": "Salasanat eivät täsmää",
+ "no-results-found": "Tuloksia ei löytynyt.",
+ "no-team-websites": "Tällä tiimillä ei ole verkkosivustoja.",
+ "no-teams": "Et ole luonut yhtään tiimiä.",
+ "no-users": "Käyttäjiä ei ole.",
+ "no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.",
+ "not-found": "Ei löytynyt",
+ "nothing-selected": "Mitään ei ole valittu.",
+ "page-not-found": "Sivua ei löydetty.",
+ "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-component-preview": "Valitse komponentti esikatselua varten",
+ "select-website-first": "Valitse ensin verkkosivusto",
+ "sever-error": "Palvelinvirhe",
+ "share-url": "Tämä on julkisesti jaettu URL sivustolle {target}.",
+ "team-already-member": "Olet jo tiimissä.",
+ "team-not-found": "Tiimiä ei löydetty.",
+ "team-websites-info": "Verkkosivuja voi tarkastella kuka tahansa tiimin jäsen.",
+ "tracking-code": "Seurantakoodi",
+ "transfer-team-website-to-user": "Siirretäänkö tämä verkkosivu tilillesi?",
+ "transfer-user-website-to-team": "Valitse tiimi, johon verkkosivusto siirretään.",
+ "transfer-website": "Siirrä verkkosivusto tiliisi tai toiselle tiimille.",
+ "triggered-event": "Laukaistu tapahtuma",
+ "unauthorized": "Ei oikeuksia",
+ "user-deleted": "Käyttäjä poistettu.",
+ "viewed-page": "Katsottu sivu",
+ "visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device} "
+ }
}
diff --git a/public/intl/messages/fo-FO.json b/public/intl/messages/fo-FO.json
index f6bdf4ca6..b765e78a5 100644
--- a/public/intl/messages/fo-FO.json
+++ b/public/intl/messages/fo-FO.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Gerðir"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Legg heimasíðu afturat"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Fyrisitari"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alt"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Aftur"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce prosenttal"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Kagar"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Strika"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Skift loyniorð"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Vátta loyniorð"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Lond"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Núverandi loyniorð"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Tillaga spenni"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Yvirlitsskíggi"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Vel dato"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Forsett dato"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Sletta"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Sletta heimasíðu"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Borðtelda"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Tóleindir"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Lat fara"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Økisnavn"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Ger broyting"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Virkja deili leinki"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Hendingar/tiltøk"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Samansett"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Óviðgjørt"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Fartelda"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Seinastu "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dagarnar"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Seinastu "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " tímarnar"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Rita inn"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Rita út"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Telefon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Meira"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Navn"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nýtt loyniorð"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Opnaðar síðir"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Síðir"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Loyniorð"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Vangi"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Beinleiðis"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Framsendingar"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Endurskapa"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Kravt"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Nulstilla"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Goym"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Stillingar"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Deil leinku"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Einkultur dagur"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Teldil"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Hendan mánan"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Hesa vikuna"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Hetta árið"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Tíðarsona"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Í dag"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Spori kota"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Einsýna vitjanir"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Ókent"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Brúkaranavn"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Vís frágreiðing"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Sýningar"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Miðal vitjurnartíð "
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Vitjandi"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Heimasíður"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " í løtuni "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "vitjandi"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": " vitjandi "
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Ert tú sikkur at tú ynskir at strika "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Øll data ið er knýtt at verður eisini strika."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Okkurt bleiv gali."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Far til stillingar"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Skeivt brúkaranavn/loyniorð."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ógilt økisnavn"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Einki data tøk."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Loyniorðini eru ikki eins"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Tú hevur ongar heimasíður stillaða til."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Síðan bleiv ikki funnin."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Goymt."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Hettar er tann almenna leinkan av "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Spori kota"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Vitjandi frá "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " brúkar "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " á "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Aðgangskoda",
+ "account": "Konto",
+ "action": "Handling",
+ "actions": "Gerðir",
+ "activity": "Activity log",
+ "add": "Legg afturat",
+ "add-board": "Legg borð afturat",
+ "add-description": "Legg lýsing afturat",
+ "add-link": "Legg afturat link",
+ "add-member": "Legg lim afturat",
+ "add-pixel": "Legg afturat piksel",
+ "add-step": "Legg stig afturat",
+ "add-website": "Legg heimasíðu afturat",
+ "admin": "Fyrisitari",
+ "affiliate": "Samband",
+ "after": "Eftir",
+ "all": "Alt",
+ "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",
+ "average": "Miðal",
+ "back": "Aftur",
+ "before": "Áðrenn",
+ "behavior": "Atferð",
+ "block-selector": "Blokkveljari",
+ "boards": "Borð",
+ "bounce-rate": "Bounce prosenttal",
+ "breakdown": "Sundurgreining",
+ "browser": "Kagi",
+ "browsers": "Kagar",
+ "campaign": "Herferð",
+ "campaigns": "Herferðir",
+ "cancel": "Strika",
+ "change-password": "Skift loyniorð",
+ "channel": "Rás",
+ "channels": "Rásir",
+ "chart": "Graf",
+ "cities": "Býir",
+ "city": "Býur",
+ "clear-all": "Tøm alt",
+ "cls": "CLS",
+ "cohort": "Bólkur",
+ "cohorts": "Kohortar",
+ "compare": "Samanber",
+ "compare-dates": "Samanber dato",
+ "confirm": "Staðfest",
+ "confirm-password": "Vátta loyniorð",
+ "contains": "Inniheldur",
+ "content": "Innihald",
+ "continue": "Halt fram",
+ "conversion": "Umvending",
+ "conversion-rate": "Umvendingarprosent",
+ "conversion-step": "Umvendingarstigur",
+ "count": "Tal",
+ "countries": "Lond",
+ "country": "Land",
+ "create": "Stovna",
+ "create-report": "Stovna frágreiðing",
+ "create-team": "Stovna lið",
+ "create-user": "Stovna brúkara",
+ "created": "Stovnaður",
+ "created-by": "Stovnaður av",
+ "criteria": "Viðmið",
+ "currency": "Gjaldoyra",
+ "current": "Núverandi",
+ "current-password": "Núverandi loyniorð",
+ "custom-range": "Tillaga spenni",
+ "dashboard": "Yvirlitsskíggi",
+ "data": "Dáta",
+ "date": "Dato",
+ "date-range": "Vel dato",
+ "day": "Dagur",
+ "default-date-range": "Forsett dato",
+ "delete": "Sletta",
+ "delete-report": "Strika frágreiðing",
+ "delete-team": "Strika lið",
+ "delete-user": "Strika brúkara",
+ "delete-website": "Sletta heimasíðu",
+ "description": "Lýsing",
+ "desktop": "Borðtelda",
+ "destination-url": "Mál-URL",
+ "details": "Nærri upplýsingar",
+ "device": "Tól",
+ "devices": "Tóleindir",
+ "direct": "Beinleiðis",
+ "dismiss": "Lat fara",
+ "distinct-id": "Sermerkt ID",
+ "documentation": "Skjøl",
+ "does-not-contain": "Inniheldur ikki",
+ "does-not-include": "Er ikki við",
+ "doest-not-exist": "Er ikki til",
+ "domain": "Økisnavn",
+ "download": "Tak niður",
+ "dropoff": "Fráfall",
+ "duration": "Tíðarlongd",
+ "edit": "Ger broyting",
+ "edit-member": "Ritstjórna lim",
+ "email": "Teldupostur",
+ "enable-share-url": "Virkja deili leinki",
+ "end-step": "Endastigur",
+ "entry": "Inngangs URL",
+ "environment": "Umhvørvi",
+ "event": "Tiltak",
+ "event-data": "Tiltaksdata",
+ "event-name": "Tiltaksnavn",
+ "events": "Hendingar/tiltøk",
+ "exclude-bounce": "Útiloka frástøyt",
+ "exists": "Er til",
+ "exit": "Útgangs URL",
+ "false": "Falskt",
+ "fcp": "FCP",
+ "field": "Øki",
+ "fields": "Øki",
+ "filter": "Sía",
+ "filter-combined": "Samansett",
+ "filter-raw": "Óviðgjørt",
+ "filters": "Síur",
+ "first-click": "Fyrsta trýst",
+ "first-seen": "Fyrst sæddur",
+ "funnel": "Traktari",
+ "funnel-description": "Fá yvirlit yvir umvendingar og fráfall hjá brúkarum.",
+ "funnels": "Traktarar",
+ "goal": "Mál",
+ "goals": "Mál",
+ "goals-description": "Fylg við málum fyri síðuvísingar og tiltøk.",
+ "good": "Gott",
+ "greater-than": "Størri enn",
+ "greater-than-equals": "Størri ella javnt",
+ "grouped": "Bólkað",
+ "growth": "Vøkstur",
+ "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.",
+ "invalid-url": "Ógild URL",
+ "is": "Er",
+ "is-false": "Er falskt",
+ "is-not": "Er ikki",
+ "is-not-set": "Er ikki sett",
+ "is-set": "Er sett",
+ "is-true": "Er satt",
+ "join": "Luttak",
+ "join-team": "Luttak í liði",
+ "journey": "Ferð",
+ "journey-description": "Fá yvirlit yvir hvussu brúkarar ferðast á heimasíðuni.",
+ "journeys": "Ferðir",
+ "language": "Mál",
+ "languages": "Mál",
+ "laptop": "Fartelda",
+ "last-click": "Seinasta trýst",
+ "last-days": "Seinastu {x} dagarnar",
+ "last-hours": "Seinastu {x} tímarnar",
+ "last-months": "Seinastu {x} mánaðirnar",
+ "last-seen": "Síðst sæddur",
+ "lcp": "LCP",
+ "leave": "Far burtur",
+ "leave-team": "Far úr liði",
+ "less-than": "Minni enn",
+ "less-than-equals": "Minni ella javnt",
+ "link": "Leinkja",
+ "links": "Leinkjur",
+ "location": "Støða",
+ "login": "Rita inn",
+ "logout": "Rita út",
+ "manage": "Stýra",
+ "manager": "Stjóri",
+ "mask-level": "Maskustig",
+ "match": "Samsvørun",
+ "match-all": "Allt",
+ "match-any": "Nakað",
+ "max": "Mest",
+ "max-duration": "Mesta tíðarlongd",
+ "maximize": "Víðka",
+ "medium": "Miðal",
+ "member": "Limur",
+ "members": "Limir",
+ "min": "Minst",
+ "minute": "Minuttur",
+ "mobile": "Telefon",
+ "model": "Fyrimynd",
+ "month": "Mánaður",
+ "more": "Meira",
+ "my-account": "Mín konto",
+ "my-websites": "Mínar heimasíður",
+ "name": "Navn",
+ "needs-improvement": "Tørvar at bætast",
+ "new-password": "Nýtt loyniorð",
+ "none": "Eingin",
+ "number-of-records": "{x} {x, plural, one {skrá} other {skrár}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organisk leiting",
+ "organic-shopping": "Organisk keyp",
+ "organic-social": "Organisk sosial miðla",
+ "organic-video": "Organisk video",
+ "os": "OS",
+ "other": "Annað",
+ "overview": "Yvirlit",
+ "owner": "Eigari",
+ "page": "Síða",
+ "page-of": "Síða {current} av {total}",
+ "page-views": "Opnaðar síðir",
+ "pages": "Síðir",
+ "pageTitle": "Síðuheiti",
+ "paid-ads": "Goldnar lýsingar",
+ "paid-search": "Goldin leiting",
+ "paid-shopping": "Goldið keyp",
+ "paid-social": "Goldin sosial miðla",
+ "paid-video": "Goldið video",
+ "password": "Loyniorð",
+ "path": "Leið",
+ "paths": "Leiðir",
+ "performance": "Effektivni",
+ "pixel": "Piksel",
+ "pixels": "Pikslur",
+ "play": "Spæla",
+ "poor": "Dårligt",
+ "powered-by": "Rikið av {name}",
+ "preferences": "Stillingar",
+ "previous": "Fyrra",
+ "previous-period": "Fyrra tíðarskeið",
+ "previous-year": "Fyrra ár",
+ "profile": "Vangi",
+ "profiles": "Profilir",
+ "properties": "Eginleikar",
+ "property": "Eginleiki",
+ "queries": "Fyrispurningar",
+ "query": "Fyrispurningur",
+ "query-parameters": "Fyrispurningsparametrar",
+ "realtime": "Beinleiðis",
+ "recorded": "Upptikið tann",
+ "referral": "Ávísing",
+ "referrer": "Ávísari",
+ "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",
+ "replay": "Uppspæling",
+ "replay-enabled": "Uppspæling virkjað",
+ "replay-id": "Replay ID",
+ "replays": "Uppspælingar",
+ "reports": "Frágreiðingar",
+ "required": "Kravið",
+ "reset": "Nulstilla",
+ "reset-website": "Nulstilla heimasíðu",
+ "retention": "Hald",
+ "retention-days": "Geymingardagar",
+ "retention-description": "Mát hvussu ofta brúkarar koma aftur á tína síðu.",
+ "revenue": "Inntøka",
+ "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-segment": "Goym segment",
+ "screen": "Skíggi",
+ "screens": "Skíggjar",
+ "search": "Leita",
+ "segment": "Segment",
+ "segments": "Segment",
+ "select": "Vel",
+ "select-component": "Vel eina íhlut",
+ "select-date": "Vel dato",
+ "select-filter": "Vel síu",
+ "select-role": "Vel leiklut",
+ "select-website": "Vel heimasíðu",
+ "session": "Seta",
+ "session-data": "Setudáta",
+ "sessions": "Setur",
+ "settings": "Stillingar",
+ "share": "Deil",
+ "share-url": "Deil leinku",
+ "single-day": "Einkultur dagur",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Kelda",
+ "sources": "Keldur",
+ "start-step": "Byrjanarstigur",
+ "steps": "Stig",
+ "sum": "Samanlagt",
+ "support": "Stuðul",
+ "switch-account": "Skift konto",
+ "table": "Tabell",
+ "tablet": "Teldil",
+ "tag": "Merki",
+ "tags": "Merki",
+ "team": "Lið",
+ "team-id": "Lið ID",
+ "team-manager": "Liðleiðari",
+ "team-member": "Liðlimur",
+ "team-name": "Liðnavn",
+ "team-owner": "Liðeigari",
+ "team-settings": "Liðstillingar",
+ "team-view-only": "Bert til at síggja lið",
+ "team-websites": "Lið heimasíður",
+ "teams": "Lið",
+ "term": "Leitorð",
+ "terms": "Treytir",
+ "theme": "Evni",
+ "this-month": "Hendan mánan",
+ "this-week": "Hesa vikuna",
+ "this-year": "Hetta árið",
+ "timezone": "Tíðarsona",
+ "title": "Heiti",
+ "today": "Í dag",
+ "toggle-charts": "Vísa/fjal grafir",
+ "total": "Tilsamans",
+ "total-records": "Skrár tilsamans",
+ "tracking-code": "Spori kota",
+ "traffic": "Umferð",
+ "transactions": "Umsetningar",
+ "transfer": "Flyt",
+ "transfer-website": "Flyt heimasíðu",
+ "true": "Satt",
+ "ttfb": "TTFB",
+ "type": "Slag",
+ "unique": "Einstaklingar",
+ "unique-events": "Einstakar hendingar",
+ "unique-visitors": "Einsýna vitjanir",
+ "uniqueCustomers": "Einstakar kundar",
+ "unknown": "Ókent",
+ "untitled": "Einki heiti",
+ "update": "Dagfør",
+ "url": "URL",
+ "user": "Brúkari",
+ "username": "Brúkaranavn",
+ "users": "Brúkarar",
+ "utm": "UTM",
+ "utm-campaign": "UTM-herferð",
+ "utm-content": "UTM-innihald",
+ "utm-description": "Fylg herferðunum við UTM-stikum.",
+ "utm-medium": "UTM-miðil",
+ "utm-source": "UTM-kelda",
+ "utm-term": "UTM-leitorð",
+ "value": "Virði",
+ "version": "Útgáva",
+ "view": "Vís",
+ "view-details": "Vís frágreiðing",
+ "view-only": "Bert vísing",
+ "views": "Sýningar",
+ "views-per-visit": "Sýningar per vitjan",
+ "visit-duration": "Miðal vitjurnartíð ",
+ "visitors": "Vitjandi",
+ "visits": "Vitjanir",
+ "website": "Heimasíða",
+ "website-id": "Heimasíðu-ID",
+ "websites": "Heimasíður",
+ "window": "Gluggi",
+ "yesterday": "Í gjár"
+ },
+ "message": {
+ "action-confirmation": "Skriva {confirmation} í teigin niðanfyri at vátta.",
+ "active-users": "{x} í løtuni {x, plural, one {vitjandi} other { vitjandi }}",
+ "bad-request": "Ógild umbøn",
+ "collected-data": "Innsamlaði dáta",
+ "confirm-delete": "Ert tú sikkur at tú ynskir at strika {target}?",
+ "confirm-leave": "Ert tú vís/ur í at fara frá {target} ?",
+ "confirm-remove": "Ert tú vís/ur í at strika {target} ?",
+ "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.",
+ "event-log": "{event} á {url} ",
+ "forbidden": "Forboðið",
+ "go-to-settings": "Far til stillingar",
+ "incorrect-username-password": "Skeivt brúkaranavn/loyniorð.",
+ "invalid-domain": "Ógilt økisnavn",
+ "min-password-length": "Minsta longd er {n} tekn",
+ "new-version-available": "Nýggj útgáva av Umami {version} er tøk!",
+ "no-data-available": "Einki data tøk.",
+ "no-event-data": "Eingin hendingardata tøk.",
+ "no-match-password": "Loyniorðini eru ikki eins",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Hetta liðið hevur eingi heimasíður.",
+ "no-teams": "Tú hevur ikki stovnað nøkur lið.",
+ "no-users": "Eingi brúkarar eru.",
+ "no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
+ "not-found": "Ikki funnið",
+ "nothing-selected": "Einki valt.",
+ "page-not-found": "Síðan bleiv ikki funnin.",
+ "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-component-preview": "Vel eina íhlut at forskoða",
+ "select-website-first": "Vel fyrst eina heimasíðu",
+ "sever-error": "Ambætaravilla",
+ "share-url": "Hettar er tann almenna leinkan av {target}.",
+ "team-already-member": "Tú ert longu limur í liðnum.",
+ "team-not-found": "Lið ikki funnið.",
+ "team-websites-info": "Heimasíður kunnu síggjas av øllum á liðnum.",
+ "tracking-code": "Spori kota",
+ "transfer-team-website-to-user": "Flyt hesa heimasíðu til tín konto?",
+ "transfer-user-website-to-team": "Vel liðið at flyta hesa heimasíðu til.",
+ "transfer-website": "Flyt ognarskapið av heimasíðuni til tín konto ella annað lið.",
+ "triggered-event": "Avbjóðað hending",
+ "unauthorized": "Ikki góðkent",
+ "user-deleted": "Brúkari strikaður.",
+ "viewed-page": "Síð vís",
+ "visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device} "
+ }
}
diff --git a/public/intl/messages/fr-FR.json b/public/intl/messages/fr-FR.json
index 8f22c1ae8..665651451 100644
--- a/public/intl/messages/fr-FR.json
+++ b/public/intl/messages/fr-FR.json
@@ -1,2020 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Code d'accès"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Journal d'activité"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Ajouter"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Ajouter une description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Ajouter un membre"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Ajouter une étape"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Ajouter un site"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrateur"
- }
- ],
- "label.affiliate": [
- {
- "type": 0,
- "value": "Affiliation"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Après"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Tout"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Toutes les données"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.attribution": [
- {
- "type": 0,
- "value": "Attribution"
- }
- ],
- "label.attribution-description": [
- {
- "type": 0,
- "value": "Découvrez comment les utilisateurs s'engagent avec votre marketing et ce qui génère des conversions."
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Moyenne"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Retour"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Avant"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Taux de rebond"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Répartition"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Navigateur"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navigateurs"
- }
- ],
- "label.campaigns": [
- {
- "type": 0,
- "value": "Campagnes"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Annuler"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Changer le mot de passe"
- }
- ],
- "label.channels": [
- {
- "type": 0,
- "value": "Canaux"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Villes"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Ville"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Réinitialiser"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Comparer"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmer"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmation du mot de passe"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contient"
- }
- ],
- "label.content": [
- {
- "type": 0,
- "value": "Contenu"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuer"
- }
- ],
- "label.conversion-step": [
- {
- "type": 0,
- "value": "Étape de conversion"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Compte"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Pays"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Pays"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Créer"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Créer un rapport"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Créer une équipe"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Créer un utilisateur"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Créé"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Créé par"
- }
- ],
- "label.currency": [
- {
- "type": 0,
- "value": "Devise"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Actuel"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Mot de passe actuel"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Période personnalisée"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Tableau de bord"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Données"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Période"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Jour"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Période par défaut"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Supprimer"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Supprimer le rapport"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Supprimer l'équipe"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Supprimer l'utilisateur"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Supprimer le site"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Ordinateur"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Détails"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Appareil"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Appareils"
- }
- ],
- "label.direct": [
- {
- "type": 0,
- "value": "Direct"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Ignorer"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Ne contient pas"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domaine"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Abandons"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Modifier"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Modifier le tableau de bord"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Modifier le membre"
- }
- ],
- "label.email": [
- {
- "type": 0,
- "value": "E-mail"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Activer l'URL de partage"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Étape de fin"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Chemin d'entrée"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Évènement"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Données d'évènements"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Évènements"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Chemin de sortie"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Faux"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Champ"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Champs"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtrer"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combiné"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Brut"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtres"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Vu pour la première fois"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Entonnoir"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Comprenez les taux de conversions et d'abandons des utilisateurs."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Objectif"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Objectifs"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Suivez vos objectifs en matière de pages vues et d'événements."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Supérieur à"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Supérieur ou égal à"
- }
- ],
- "label.grouped": [
- {
- "type": 0,
- "value": "Groupé"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Hôte"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hôtes"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Analysez précisément vos données en utilisant des segments et des filtres."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Est"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "N'est pas"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "N'est pas défini"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Est défini"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Rejoindre"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Rejoindre une équipe"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Parcours"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Comprennez comment les utilisateurs naviguent sur votre site."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Langue"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Langues"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portable"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " derniers jours"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dernières heures"
- }
- ],
- "label.last-months": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " derniers mois"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Vu pour la dernière fois"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Quitter"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Quitter l'équipe"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Inférieur à"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Inférieur ou égal à"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Connexion"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Déconnexion"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Gérer"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.medium": [
- {
- "type": 0,
- "value": "Support"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Membre"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Membres"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Téléphone"
- }
- ],
- "label.model": [
- {
- "type": 0,
- "value": "Modèle"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Plus"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Mon compte"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mes sites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nom"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nouveau mot de passe"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Aucun"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "enregistrement"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "enregistrements"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.organic-search": [
- {
- "type": 0,
- "value": "Recherche organique"
- }
- ],
- "label.organic-shopping": [
- {
- "type": 0,
- "value": "E-commerce organique"
- }
- ],
- "label.organic-social": [
- {
- "type": 0,
- "value": "Réseau social organique"
- }
- ],
- "label.organic-video": [
- {
- "type": 0,
- "value": "Vidéo organique"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.other": [
- {
- "type": 0,
- "value": "Autre"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Vue d'ensemble"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Propriétaire"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " sur "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Pages vues"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Titre de page"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.paid-ads": [
- {
- "type": 0,
- "value": "Publicités payantes"
- }
- ],
- "label.paid-search": [
- {
- "type": 0,
- "value": "Recherche payante"
- }
- ],
- "label.paid-shopping": [
- {
- "type": 0,
- "value": "E-commerce payant"
- }
- ],
- "label.paid-social": [
- {
- "type": 0,
- "value": "Réseau social payant"
- }
- ],
- "label.paid-video": [
- {
- "type": 0,
- "value": "Vidéo payante"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Mot de passe"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Chemin"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Chemins"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Propulsé par "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Précédent"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Période précédente"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Année précédente"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Propriétés"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Propriété"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Requêtes"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Requête"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Paramètres de requête"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Temps réel"
- }
- ],
- "label.referral": [
- {
- "type": 0,
- "value": "Référent"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Site référent"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Sites référents"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Rafraîchir"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Régénérer"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Région"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Régions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Retirer"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Retirer le membre"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Rapports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Requis"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Réinitialiser"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Réinitialiser les statistiques"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Rétention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mesurez l'attractivité de votre site en suivant la fréquence de retour des utilisateurs."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Recettes"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Examinez vos recettes et comment dépensent vos utilisateurs."
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rôle"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Exécuter la requête"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Enregistrer"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Résolutions d'écran"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Rechercher"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Sélectionner"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Choisir une période"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Choisir un rôle"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Choisir un site"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.session-data": [
- {
- "type": 0,
- "value": "Session data"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Paramètres"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "URL de partage"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Journée"
- }
- ],
- "label.sms": [
- {
- "type": 0,
- "value": "SMS"
- }
- ],
- "label.sources": [
- {
- "type": 0,
- "value": "Sources"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Étape de départ"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Étapes"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Somme"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablette"
- }
- ],
- "label.tag": [
- {
- "type": 0,
- "value": "Tag"
- }
- ],
- "label.tags": [
- {
- "type": 0,
- "value": "Tags"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Équipe"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID d'équipe"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Manager de l'équipe"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Membre de l'équipe"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nom de l'équipe"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Propriétaire de l'équipe"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Vue d'équipe uniquement"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Sites d'équipes"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Équipes"
- }
- ],
- "label.terms": [
- {
- "type": 0,
- "value": "Mots clés"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Thème"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Ce mois"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Cette semaine"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Cette année"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Fuseau horaire"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titre"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Aujourd'hui"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Afficher/Masquer les graphiques"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Nombre d'enregistrements"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Code de suivi"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transférer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transférer le site"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Vrai"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visiteurs uniques"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Clients uniques"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Inconnu"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Sans titre"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Modifier"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Utilisateur"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nom d'utilisateur"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Utilisateurs"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Suivez vos campagnes via les paramètres UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valeur"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Voir"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Voir les détails"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Consultation"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Vues"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Vues par visite"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Temps de visite"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visiteurs"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visites"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Site"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID de site"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Sites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Fenêtre"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Hier"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Taper "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " ci-dessous pour confirmer."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visiteur"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visiteurs"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " actuellement"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Donnée collectée"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Êtes-vous sûr de vouloir supprimer "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Êtes-vous sûr de vouloir quitter "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Êtes-vous sûr de vouloir retirer "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Êtes-vous sûr de vouloir réinitialiser les statistiques de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Supprimer une équipe supprimera aussi tous les sites de cette équipe."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Toutes les données associées seront supprimées."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Un problème est survenu."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " sur "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Aller aux paramètres"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nom d'utilisateur/Mot de passe incorrect."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domaine invalide"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Taille minimale de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caractères"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Une nouvelle version d'Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " est disponible !"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Aucune donnée disponible."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Aucune donnée d'événement disponible."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Les mots de passe ne correspondent pas"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Aucun résultat n'a été trouvé."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Cette équipe n'a aucun site."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Vous n'avez pas créé d'équipe."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Aucun utilisateur."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Vous n'avez pas configuré de site."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Page non trouvée."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Pour réinitialiser ce site, taper "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " ci-dessous pour confirmer."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Enregistré."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Les statistiques de votre site sont accessibles publiquement sur cette URL :"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Vous êtes déjà membre de cette équipe."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Équipe non trouvée."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Les sites peuvent être vus par tout utilisateur dans l'équipe."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Code de suivi"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transférer ce site sur votre compte ?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Choisir l'équipe à laquelle transférer ce site."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transférer la propriété du site sur votre compte ou à une autre équipe."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Évènement déclenché"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Utilisateur supprimé."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Page vue"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visiteur de "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " utilisant "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " sur "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visiteurs ont abandonné"
- }
- ]
+ "label": {
+ "access-code": "Code d'accès",
+ "account": "Compte",
+ "action": "Action",
+ "actions": "Actions",
+ "activity": "Journal d'activité",
+ "add": "Ajouter",
+ "add-board": "Ajouter un tableau",
+ "add-description": "Ajouter une description",
+ "add-link": "Ajouter un lien",
+ "add-member": "Ajouter un membre",
+ "add-pixel": "Ajouter un pixel",
+ "add-step": "Ajouter une étape",
+ "add-website": "Ajouter un site",
+ "admin": "Administrateur",
+ "affiliate": "Affiliation",
+ "after": "Après",
+ "all": "Tout",
+ "all-time": "Toutes les données",
+ "analysis": "Analyse",
+ "analytics": "Analytique",
+ "aov": "AOV",
+ "application": "Application",
+ "apply": "Appliquer",
+ "arpu": "ARPU",
+ "attribution": "Attribution",
+ "attribution-description": "Découvrez comment les utilisateurs s'engagent avec votre marketing et ce qui génère des conversions.",
+ "audience": "Audience",
+ "average": "Moyenne",
+ "back": "Retour",
+ "before": "Avant",
+ "behavior": "Comportement",
+ "block-selector": "Sélecteur de bloc",
+ "boards": "Tableaux",
+ "bounce-rate": "Taux de rebond",
+ "breakdown": "Répartition",
+ "browser": "Navigateur",
+ "browsers": "Navigateurs",
+ "campaign": "Campagne",
+ "campaigns": "Campagnes",
+ "cancel": "Annuler",
+ "change-password": "Changer le mot de passe",
+ "channel": "Canal",
+ "channels": "Canaux",
+ "chart": "Graphique",
+ "cities": "Villes",
+ "city": "Ville",
+ "clear-all": "Réinitialiser",
+ "cls": "CLS",
+ "cohort": "Cohorte",
+ "cohorts": "Cohortes",
+ "compare": "Comparer",
+ "compare-dates": "Comparer les dates",
+ "confirm": "Confirmer",
+ "confirm-password": "Confirmation du mot de passe",
+ "contains": "Contient",
+ "content": "Contenu",
+ "continue": "Continuer",
+ "conversion": "Conversion",
+ "conversion-rate": "Taux de conversion",
+ "conversion-step": "Étape de conversion",
+ "count": "Compte",
+ "countries": "Pays",
+ "country": "Pays",
+ "create": "Créer",
+ "create-report": "Créer un rapport",
+ "create-team": "Créer une équipe",
+ "create-user": "Créer un utilisateur",
+ "created": "Créé",
+ "created-by": "Créé par",
+ "criteria": "Critères",
+ "currency": "Devise",
+ "current": "Actuel",
+ "current-password": "Mot de passe actuel",
+ "custom-range": "Période personnalisée",
+ "dashboard": "Tableau de bord",
+ "data": "Données",
+ "date": "Date",
+ "date-range": "Période",
+ "day": "Jour",
+ "default-date-range": "Période par défaut",
+ "delete": "Supprimer",
+ "delete-report": "Supprimer le rapport",
+ "delete-team": "Supprimer l'équipe",
+ "delete-user": "Supprimer l'utilisateur",
+ "delete-website": "Supprimer le site",
+ "description": "Description",
+ "desktop": "Ordinateur",
+ "destination-url": "URL de destination",
+ "details": "Détails",
+ "device": "Appareil",
+ "devices": "Appareils",
+ "direct": "Direct",
+ "dismiss": "Ignorer",
+ "distinct-id": "ID distinct",
+ "documentation": "Documentation",
+ "does-not-contain": "Ne contient pas",
+ "does-not-include": "N'inclut pas",
+ "doest-not-exist": "N'existe pas",
+ "domain": "Domaine",
+ "download": "Télécharger",
+ "dropoff": "Abandons",
+ "duration": "Durée",
+ "edit": "Modifier",
+ "edit-member": "Modifier le membre",
+ "email": "E-mail",
+ "enable-share-url": "Activer l'URL de partage",
+ "end-step": "Étape de fin",
+ "entry": "Chemin d'entrée",
+ "environment": "Environnement",
+ "event": "Évènement",
+ "event-data": "Données d'évènements",
+ "event-name": "Nom de l'évènement",
+ "events": "Évènements",
+ "exclude-bounce": "Exclure le rebond",
+ "exists": "Existe",
+ "exit": "Chemin de sortie",
+ "false": "Faux",
+ "fcp": "FCP",
+ "field": "Champ",
+ "fields": "Champs",
+ "filter": "Filtrer",
+ "filter-combined": "Combiné",
+ "filter-raw": "Brut",
+ "filters": "Filtres",
+ "first-click": "Premier clic",
+ "first-seen": "Vu pour la première fois",
+ "funnel": "Entonnoir",
+ "funnel-description": "Comprenez les taux de conversions et d'abandons des utilisateurs.",
+ "funnels": "Entonnoirs",
+ "goal": "Objectif",
+ "goals": "Objectifs",
+ "goals-description": "Suivez vos objectifs en matière de pages vues et d'événements.",
+ "good": "Bon",
+ "greater-than": "Supérieur à",
+ "greater-than-equals": "Supérieur ou égal à",
+ "grouped": "Groupé",
+ "growth": "Croissance",
+ "hostname": "Nom d'hôte",
+ "hour": "Heure",
+ "includes": "Inclut",
+ "inp": "INP",
+ "insight": "Aperçu",
+ "insights": "Aperçus",
+ "insights-description": "Analysez précisément vos données en utilisant des segments et des filtres.",
+ "invalid-url": "URL invalide",
+ "is": "Est",
+ "is-false": "Est faux",
+ "is-not": "N'est pas",
+ "is-not-set": "N'est pas défini",
+ "is-set": "Est défini",
+ "is-true": "Est vrai",
+ "join": "Rejoindre",
+ "join-team": "Rejoindre une équipe",
+ "journey": "Parcours",
+ "journey-description": "Comprennez comment les utilisateurs naviguent sur votre site.",
+ "journeys": "Parcours",
+ "language": "Langue",
+ "languages": "Langues",
+ "laptop": "Portable",
+ "last-click": "Dernier clic",
+ "last-days": "{x} derniers jours",
+ "last-hours": "{x} dernières heures",
+ "last-months": "{x} derniers mois",
+ "last-seen": "Vu pour la dernière fois",
+ "lcp": "LCP",
+ "leave": "Quitter",
+ "leave-team": "Quitter l'équipe",
+ "less-than": "Inférieur à",
+ "less-than-equals": "Inférieur ou égal à",
+ "link": "Lien",
+ "links": "Liens",
+ "location": "Emplacement",
+ "login": "Connexion",
+ "logout": "Déconnexion",
+ "manage": "Gérer",
+ "manager": "Gestionnaire",
+ "mask-level": "Niveau de masque",
+ "match": "Correspondance",
+ "match-all": "Tous",
+ "match-any": "N'importe lequel",
+ "max": "Max",
+ "max-duration": "Durée maximale",
+ "maximize": "Développer",
+ "medium": "Moyen",
+ "member": "Membre",
+ "members": "Membres",
+ "min": "Min",
+ "minute": "Minute",
+ "mobile": "Téléphone",
+ "model": "Modèle",
+ "month": "Mois",
+ "more": "Plus",
+ "my-account": "Mon compte",
+ "my-websites": "Mes sites",
+ "name": "Nom",
+ "needs-improvement": "Doit être amélioré",
+ "new-password": "Nouveau mot de passe",
+ "none": "Aucun",
+ "number-of-records": "{x} {x, plural, one {enregistrement} other {enregistrements}}",
+ "ok": "OK",
+ "online": "En ligne",
+ "organic-search": "Recherche organique",
+ "organic-shopping": "Achat organique",
+ "organic-social": "Réseau social organique",
+ "organic-video": "Vidéo organique",
+ "os": "OS",
+ "other": "Autre",
+ "overview": "Vue d'ensemble",
+ "owner": "Propriétaire",
+ "page": "Page",
+ "page-of": "Page {current} sur {total}",
+ "page-views": "Pages vues",
+ "pages": "Pages",
+ "pageTitle": "Titre de page",
+ "paid-ads": "Publicités payantes",
+ "paid-search": "Recherche payante",
+ "paid-shopping": "Achat payant",
+ "paid-social": "Réseau social payant",
+ "paid-video": "Vidéo payante",
+ "password": "Mot de passe",
+ "path": "Chemin",
+ "paths": "Chemins",
+ "performance": "Performance",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Lire",
+ "poor": "Mauvais",
+ "powered-by": "Propulsé par {name}",
+ "preferences": "Préférences",
+ "previous": "Précédent",
+ "previous-period": "Période précédente",
+ "previous-year": "Année précédente",
+ "profile": "Profil",
+ "profiles": "Profils",
+ "properties": "Propriétés",
+ "property": "Propriété",
+ "queries": "Requêtes",
+ "query": "Requête",
+ "query-parameters": "Paramètres de requête",
+ "realtime": "Temps réel",
+ "recorded": "Enregistré le",
+ "referral": "Référent",
+ "referrer": "Site référent",
+ "referrers": "Sites référents",
+ "refresh": "Rafraîchir",
+ "regenerate": "Régénérer",
+ "regex-match": "Correspond à l'expression régulière",
+ "regex-not-match": "Ne correspond pas à l'expression régulière",
+ "region": "Région",
+ "regions": "Régions",
+ "remaining": "Restant",
+ "remove": "Retirer",
+ "remove-member": "Retirer le membre",
+ "replay": "Relecture",
+ "replay-enabled": "Relecture activée",
+ "replay-id": "Replay ID",
+ "replays": "Relectures",
+ "reports": "Rapports",
+ "required": "Requis",
+ "reset": "Réinitialiser",
+ "reset-website": "Réinitialiser les statistiques",
+ "retention": "Rétention",
+ "retention-days": "Jours de rétention",
+ "retention-description": "Mesurez l'attractivité de votre site en suivant la fréquence de retour des utilisateurs.",
+ "revenue": "Revenus",
+ "revenue-description": "Consultez vos revenus au fil du temps.",
+ "role": "Rôle",
+ "run-query": "Exécuter la requête",
+ "sample-rate": "Taux d'échantillonnage",
+ "sample-size": "Taille de l'échantillon",
+ "save": "Enregistrer",
+ "save-cohort": "Enregistrer la cohorte",
+ "save-segment": "Enregistrer le segment",
+ "screen": "Écran",
+ "screens": "Écrans",
+ "search": "Rechercher",
+ "segment": "Segment",
+ "segments": "Segments",
+ "select": "Sélectionner",
+ "select-component": "Sélectionner un composant",
+ "select-date": "Choisir une période",
+ "select-filter": "Sélectionner un filtre",
+ "select-role": "Choisir un rôle",
+ "select-website": "Choisir un site",
+ "session": "Session",
+ "session-data": "Données de session",
+ "sessions": "Sessions",
+ "settings": "Paramètres",
+ "share": "Partager",
+ "share-url": "URL de partage",
+ "single-day": "Journée",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Source",
+ "sources": "Sources",
+ "start-step": "Étape de départ",
+ "steps": "Étapes",
+ "sum": "Somme",
+ "support": "Support",
+ "switch-account": "Changer de compte",
+ "table": "Tableau",
+ "tablet": "Tablette",
+ "tag": "Étiquette",
+ "tags": "Étiquettes",
+ "team": "Équipe",
+ "team-id": "ID d'équipe",
+ "team-manager": "Manager de l'équipe",
+ "team-member": "Membre de l'équipe",
+ "team-name": "Nom de l'équipe",
+ "team-owner": "Propriétaire de l'équipe",
+ "team-settings": "Paramètres de l'équipe",
+ "team-view-only": "Vue d'équipe uniquement",
+ "team-websites": "Sites d'équipes",
+ "teams": "Équipes",
+ "term": "Terme",
+ "terms": "Mots clés",
+ "theme": "Thème",
+ "this-month": "Ce mois",
+ "this-week": "Cette semaine",
+ "this-year": "Cette année",
+ "timezone": "Fuseau horaire",
+ "title": "Titre",
+ "today": "Aujourd'hui",
+ "toggle-charts": "Afficher/Masquer les graphiques",
+ "total": "Total",
+ "total-records": "Nombre d'enregistrements",
+ "tracking-code": "Code de suivi",
+ "traffic": "Trafic",
+ "transactions": "Transactions",
+ "transfer": "Transférer",
+ "transfer-website": "Transférer le site",
+ "true": "Vrai",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "unique": "Unique",
+ "unique-events": "Événements uniques",
+ "unique-visitors": "Visiteurs uniques",
+ "uniqueCustomers": "Clients uniques",
+ "unknown": "Inconnu",
+ "untitled": "Sans titre",
+ "update": "Modifier",
+ "url": "URL",
+ "user": "Utilisateur",
+ "username": "Nom d'utilisateur",
+ "users": "Utilisateurs",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campagne",
+ "utm-content": "UTM Contenu",
+ "utm-description": "Suivez vos campagnes via les paramètres UTM.",
+ "utm-medium": "UTM Média",
+ "utm-source": "UTM Source",
+ "utm-term": "UTM Terme",
+ "value": "Valeur",
+ "version": "Version",
+ "view": "Voir",
+ "view-details": "Voir les détails",
+ "view-only": "Consultation",
+ "views": "Vues",
+ "views-per-visit": "Vues par visite",
+ "visit-duration": "Temps de visite",
+ "visitors": "Visiteurs",
+ "visits": "Visites",
+ "website": "Site",
+ "website-id": "ID de site",
+ "websites": "Sites",
+ "window": "Fenêtre",
+ "yesterday": "Hier"
+ },
+ "message": {
+ "action-confirmation": "Taper {confirmation} ci-dessous pour confirmer.",
+ "active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement",
+ "bad-request": "Requête incorrecte",
+ "collected-data": "Donnée collectée",
+ "confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?",
+ "confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?",
+ "confirm-remove": "Êtes-vous sûr de vouloir retirer {target} ?",
+ "confirm-reset": "Êtes-vous sûr de vouloir réinitialiser les statistiques de {target} ?",
+ "delete-team-warning": "Supprimer une équipe supprimera aussi tous les sites de cette équipe.",
+ "delete-website-warning": "Toutes les données associées seront supprimées.",
+ "empty-dashboard": "Votre tableau de bord est vide. Cliquez sur Modifier pour ajouter votre premier composant.",
+ "error": "Un problème est survenu.",
+ "event-log": "{event} sur {url} ",
+ "forbidden": "Interdit",
+ "go-to-settings": "Aller aux paramètres",
+ "incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.",
+ "invalid-domain": "Domaine invalide",
+ "min-password-length": "Taille minimale de {n} caractères",
+ "new-version-available": "Une nouvelle version d'Umami {version} est disponible !",
+ "no-data-available": "Aucune donnée disponible.",
+ "no-event-data": "Aucune donnée d'événement disponible.",
+ "no-match-password": "Les mots de passe ne correspondent pas",
+ "no-results-found": "Aucun résultat n'a été trouvé.",
+ "no-team-websites": "Cette équipe n'a aucun site.",
+ "no-teams": "Vous n'avez pas créé d'équipe.",
+ "no-users": "Aucun utilisateur.",
+ "no-websites-configured": "Vous n'avez pas configuré de site.",
+ "not-found": "Non trouvé!",
+ "nothing-selected": "Rien n'est sélectionné.",
+ "page-not-found": "Page non trouvée.",
+ "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-component-preview": "Sélectionnez un composant pour le prévisualiser",
+ "select-website-first": "Sélectionnez d'abord un site web",
+ "sever-error": "Erreur serveur",
+ "share-url": "Les statistiques de votre site sont accessibles publiquement sur cette URL :",
+ "team-already-member": "Vous êtes déjà membre de cette équipe.",
+ "team-not-found": "Équipe non trouvée.",
+ "team-websites-info": "Les sites peuvent être vus par tout utilisateur dans l'équipe.",
+ "tracking-code": "Code de suivi",
+ "transfer-team-website-to-user": "Transférer ce site sur votre compte ?",
+ "transfer-user-website-to-team": "Choisir l'équipe à laquelle transférer ce site.",
+ "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é!",
+ "user-deleted": "Utilisateur supprimé.",
+ "viewed-page": "Page vue",
+ "visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device} "
+ }
}
diff --git a/public/intl/messages/ga-ES.json b/public/intl/messages/ga-ES.json
index 9e2c366e8..6c92798aa 100644
--- a/public/intl/messages/ga-ES.json
+++ b/public/intl/messages/ga-ES.json
@@ -1,1876 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Código de acceso"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Accións"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Rexistro de actividade"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Engadir"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Engadir descrición"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Engadir membro"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Engadir paso"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Engadir sitio web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador/a"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Todo"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Sempre"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analíticas"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Media"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Atrás"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Antes"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Proporción de rebote"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Desglose"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Navegador"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadores"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancelar"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Mudar contrasinal"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cidades"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Cidade"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Comparar"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmar"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmar contrasinal"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contén"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuar"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Reconto"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Países"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "País"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Crear"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Crear report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Crear team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Crear user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Creado"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Creado por"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Actual"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Contrasinal actual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Rango personalizado"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Taboleiro"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Datos"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Rango temporal"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Día"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Rango temporal por defecto"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Eliminar"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Eliminar reporte"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Eliminar equipo"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Eliminar usuario"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Eliminar sitio web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Descripción"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Escritorio"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalles"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Dispositivo"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivos"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Desbotar"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Non contén"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Dominio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Disminución"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editar"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Editar taboleiro"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Editar membro"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Activar URL de compartición"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Evento"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Datos do evento"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Eventos"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL de saída"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Falso"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Campo"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Campos"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtro"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinado"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Crú"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtros"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Primeira visita"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Entende a taxa de conversión e de abandono dos usuarios."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Obxectivo"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Obxectivos"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Segue os teus obxectivos de visualizacións de páxinas e eventos."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Maior que"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Maior ou igual que"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Dominio"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Dominios"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "É"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Non é"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Non está establecido"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Está establecido"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Unirse"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Unirse ao equipo"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Traxectoria"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Entende como os usuarios navegan polo teu sitio web."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Idioma"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Idiomas"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portátil"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " días"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimas "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " horas"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " meses"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Última visita"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Deixar"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Deixar o equipo"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Menor que"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Menor ou igual que"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Acceder"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Pechar sesión"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Xestionar"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Xestor"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Membro"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Membros"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Móbil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Máis"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "A miña conta"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Os meus sitios web"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nome"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Novo contrasinal"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Sistema operativo"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Resumo"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Propietario/a"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Páxina "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " de "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Vistas de páxinas"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Título da páxina"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Páxinas"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Contrasinal"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Ruta"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Rutas"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Funciona grazas a "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Anterior"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Periodo anterior"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Ano anterior"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Propiedades"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Propiedade"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Peticións"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Petición"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parámetros da petición"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Agora mesmo"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Orixe"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Orixes"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Actualizar"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Rexenerar"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Rexión"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Rexións"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Eliminar"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Eliminar membro"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reportes"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Requerido"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Restablecer"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Para restablecer este sitio web, escriba "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " na caixa de texto de embaixo para confirmar."
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retención"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mide a fidelidade dos usuarios ao teu sitio web seguindo a frecuencia coa que volven."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Ingresos"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Consulta os teus ingresos ao longo do tempo."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Executar petición"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Gardar"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Pantallas"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Buscar"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Seleccionar"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Seleccionar data"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Seleccionar rol"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Seleccionar sitio web"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sesión"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesións"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Axustes"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Compartir URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Un só día"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Pasos"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tableta"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Equipo"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID do equipo"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Xestor do equipo"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Membro do equipo"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nome do equipo"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Propietario do equipo"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Equipo de só lectura"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Sitios web do equipo"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Equipos"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Decorado"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Este mes"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Esta semana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Este ano"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zona horaria"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Título"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hoxe"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Activación das gráficas"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Rexistros totais"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Código de seguemento"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaccións"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transferir"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transferir sitio web"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Verdadeiro"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tipo"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Único"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitas únicas"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Clientes únicos"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Descoñecido"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Sen título"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Actualizar"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Usuario"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Propiedade do usuario"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Identificador"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Usuarios"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Segue as túas campañas a través dos parámetros UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valor"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Vista"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Ver detalles"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Só lectura"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visualizacións"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Visualizacións por visita"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tempo medio de visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitantes"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visitas"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Sitio web"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID do sitio web"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Sitios web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Ventá"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Onte"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Escribe "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " na caixa de embaixo para confirmar."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " actual "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitante"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitantes"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Datos recopilados"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Estás seguro/a de que queres eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Estás seguro/a de que queres deixar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Estás seguro/a de que queres eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Estás seguro/a de querer restablecer as estatísticas de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Eliminar un equipo tamén eliminará tódolos sitios web do equipo."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Tamén serán borrados tódolos datos asociados."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Houbo un fallo."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ir aos axustes"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Credenciais incorrectas."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Dominio non válido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Lonxitude mínima de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caracteres"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Unha nova versión de Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " está dispoñible!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Sen datos dispoñibles."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Sen datos de eventos dispoñibles."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Non concordan os contrasinais"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Non se atoparon resultados."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Este equipo non ten ningún sitio web."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Non creaches ningún equipo."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Non hai usuarios."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Non tes sitios web configurados."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Páxina non atopada."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Para restablecer este sitio web, escriba "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " na caixa de embaixo para confirmar."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Vanse eliminar tódalas estatísticas deste sitio web, pero o código de seguimento permanecerá sen cambios."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Gardouse correctamente."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Este é o URL da compartición pública de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Xa es membro do equipo."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Equipo non atopado."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Os sitios web poden ser vistos por calquera membro do equipo."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Código de seguimento"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transferir este sitio web á túa conta?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Selecciona o equipo ao que transferir este sitio web."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transferir propiedade do sitio web á túa conta ou a outro equipo."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Activou o evento"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Usuario eliminado."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Páxina vista"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitante desde "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " usando "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " en "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitantes abandonados"
- }
- ]
+ "label": {
+ "access-code": "Código de acceso",
+ "account": "Conta",
+ "action": "Acción",
+ "actions": "Accións",
+ "activity": "Rexistro de actividade",
+ "add": "Engadir",
+ "add-board": "Engadir taboleiro",
+ "add-description": "Engadir descrición",
+ "add-link": "Engadir ligazón",
+ "add-member": "Engadir membro",
+ "add-pixel": "Engadir píxel",
+ "add-step": "Engadir paso",
+ "add-website": "Engadir sitio web",
+ "admin": "Administrador/a",
+ "affiliate": "Afiliado",
+ "after": "Despois",
+ "all": "Todo",
+ "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",
+ "average": "Media",
+ "back": "Atrás",
+ "before": "Antes",
+ "behavior": "Comportamento",
+ "block-selector": "Selector de bloque",
+ "boards": "Taboleiros",
+ "bounce-rate": "Proporción de rebote",
+ "breakdown": "Desglose",
+ "browser": "Navegador",
+ "browsers": "Navegadores",
+ "campaign": "Campaña",
+ "campaigns": "Campañas",
+ "cancel": "Cancelar",
+ "change-password": "Mudar contrasinal",
+ "channel": "Canle",
+ "channels": "Canles",
+ "chart": "Gráfico",
+ "cities": "Cidades",
+ "city": "Cidade",
+ "clear-all": "Limpar todo",
+ "cls": "CLS",
+ "cohort": "Cohorte",
+ "cohorts": "Cohortes",
+ "compare": "Comparar",
+ "compare-dates": "Comparar datas",
+ "confirm": "Confirmar",
+ "confirm-password": "Confirmar contrasinal",
+ "contains": "Contén",
+ "content": "Contido",
+ "continue": "Continuar",
+ "conversion": "Conversión",
+ "conversion-rate": "Taxa de conversión",
+ "conversion-step": "Paso de conversión",
+ "count": "Reconto",
+ "countries": "Países",
+ "country": "País",
+ "create": "Crear",
+ "create-report": "Crear informe",
+ "create-team": "Crear equipo",
+ "create-user": "Crear usuario",
+ "created": "Creado",
+ "created-by": "Creado por",
+ "criteria": "Criterios",
+ "currency": "Moeda",
+ "current": "Actual",
+ "current-password": "Contrasinal actual",
+ "custom-range": "Rango personalizado",
+ "dashboard": "Taboleiro",
+ "data": "Datos",
+ "date": "Data",
+ "date-range": "Rango temporal",
+ "day": "Día",
+ "default-date-range": "Rango temporal por defecto",
+ "delete": "Eliminar",
+ "delete-report": "Eliminar reporte",
+ "delete-team": "Eliminar equipo",
+ "delete-user": "Eliminar usuario",
+ "delete-website": "Eliminar sitio web",
+ "description": "Descripción",
+ "desktop": "Escritorio",
+ "destination-url": "URL de destino",
+ "details": "Detalles",
+ "device": "Dispositivo",
+ "devices": "Dispositivos",
+ "direct": "Directo",
+ "dismiss": "Desbotar",
+ "distinct-id": "ID distinto",
+ "documentation": "Documentación",
+ "does-not-contain": "Non contén",
+ "does-not-include": "Non inclúe",
+ "doest-not-exist": "Non existe",
+ "domain": "Dominio",
+ "download": "Descargar",
+ "dropoff": "Disminución",
+ "duration": "Duración",
+ "edit": "Editar",
+ "edit-member": "Editar membro",
+ "email": "Correo electrónico",
+ "enable-share-url": "Activar URL de compartición",
+ "end-step": "Paso final",
+ "entry": "URL de entrada",
+ "environment": "Contorno",
+ "event": "Evento",
+ "event-data": "Datos do evento",
+ "event-name": "Nome do evento",
+ "events": "Eventos",
+ "exclude-bounce": "Excluír rebote",
+ "exists": "Existe",
+ "exit": "URL de saída",
+ "false": "Falso",
+ "fcp": "FCP",
+ "field": "Campo",
+ "fields": "Campos",
+ "filter": "Filtro",
+ "filter-combined": "Combinado",
+ "filter-raw": "Crú",
+ "filters": "Filtros",
+ "first-click": "Primeiro clic",
+ "first-seen": "Primeira visita",
+ "funnel": "Funil",
+ "funnel-description": "Entende a taxa de conversión e de abandono dos usuarios.",
+ "funnels": "Funís",
+ "goal": "Obxectivo",
+ "goals": "Obxectivos",
+ "goals-description": "Segue os teus obxectivos de visualizacións de páxinas e eventos.",
+ "good": "Bo",
+ "greater-than": "Maior que",
+ "greater-than-equals": "Maior ou igual que",
+ "grouped": "Agrupado",
+ "growth": "Crecemento",
+ "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.",
+ "invalid-url": "URL non válida",
+ "is": "É",
+ "is-false": "É falso",
+ "is-not": "Non é",
+ "is-not-set": "Non está establecido",
+ "is-set": "Está establecido",
+ "is-true": "É verdadeiro",
+ "join": "Unirse",
+ "join-team": "Unirse ao equipo",
+ "journey": "Traxectoria",
+ "journey-description": "Entende como os usuarios navegan polo teu sitio web.",
+ "journeys": "Traxectorias",
+ "language": "Idioma",
+ "languages": "Idiomas",
+ "laptop": "Portátil",
+ "last-click": "Último clic",
+ "last-days": "Últimos {x} días",
+ "last-hours": "Últimas {x} horas",
+ "last-months": "Últimos {x} meses",
+ "last-seen": "Última visita",
+ "lcp": "LCP",
+ "leave": "Deixar",
+ "leave-team": "Deixar o equipo",
+ "less-than": "Menor que",
+ "less-than-equals": "Menor ou igual que",
+ "link": "Ligazón",
+ "links": "Ligazóns",
+ "location": "Localización",
+ "login": "Acceder",
+ "logout": "Pechar sesión",
+ "manage": "Xestionar",
+ "manager": "Xestor",
+ "mask-level": "Nivel de máscara",
+ "match": "Coincidencia",
+ "match-all": "Todo",
+ "match-any": "Calquera",
+ "max": "Máx",
+ "max-duration": "Duración máxima",
+ "maximize": "Expandir",
+ "medium": "Medio",
+ "member": "Membro",
+ "members": "Membros",
+ "min": "Mín",
+ "minute": "Minuto",
+ "mobile": "Móbil",
+ "model": "Modelo",
+ "month": "Mes",
+ "more": "Máis",
+ "my-account": "A miña conta",
+ "my-websites": "Os meus sitios web",
+ "name": "Nome",
+ "needs-improvement": "Necesita mellora",
+ "new-password": "Novo contrasinal",
+ "none": "Ningún",
+ "number-of-records": "{x} {x, plural, one {rexistro} other {rexistros}}",
+ "ok": "Aceptar",
+ "online": "En liña",
+ "organic-search": "Busca orgánica",
+ "organic-shopping": "Compra orgánica",
+ "organic-social": "Social orgánico",
+ "organic-video": "Vídeo orgánico",
+ "os": "Sistema operativo",
+ "other": "Outro",
+ "overview": "Resumo",
+ "owner": "Propietario/a",
+ "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",
+ "paid-ads": "Anuncios de pago",
+ "paid-search": "Busca de pago",
+ "paid-shopping": "Compra de pago",
+ "paid-social": "Social de pago",
+ "paid-video": "Vídeo de pago",
+ "password": "Contrasinal",
+ "path": "Ruta",
+ "paths": "Rutas",
+ "performance": "Rendemento",
+ "pixel": "Píxel",
+ "pixels": "Píxeles",
+ "play": "Reproducir",
+ "poor": "Deficiente",
+ "powered-by": "Funciona grazas a {name}",
+ "preferences": "Preferencias",
+ "previous": "Anterior",
+ "previous-period": "Periodo anterior",
+ "previous-year": "Ano anterior",
+ "profile": "Perfil",
+ "profiles": "Perfís",
+ "properties": "Propiedades",
+ "property": "Propiedade",
+ "queries": "Peticións",
+ "query": "Petición",
+ "query-parameters": "Parámetros da petición",
+ "realtime": "Agora mesmo",
+ "recorded": "Rexistrado en",
+ "referral": "Referencia",
+ "referrer": "Orixe",
+ "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",
+ "replay": "Reprodución",
+ "replay-enabled": "Reprodución activada",
+ "replay-id": "Replay ID",
+ "replays": "Reproducións",
+ "reports": "Reportes",
+ "required": "Requerido",
+ "reset": "Restablecer",
+ "reset-website": "Para restablecer este sitio web, escriba {confirmation} na caixa de texto de embaixo para confirmar.",
+ "retention": "Retención",
+ "retention-days": "Días de retención",
+ "retention-description": "Mide a fidelidade dos usuarios ao teu sitio web seguindo a frecuencia coa que volven.",
+ "revenue": "Ingresos",
+ "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-segment": "Gardar segmento",
+ "screen": "Pantalla",
+ "screens": "Pantallas",
+ "search": "Buscar",
+ "segment": "Segmento",
+ "segments": "Segmentos",
+ "select": "Seleccionar",
+ "select-component": "Seleccionar compoñente",
+ "select-date": "Seleccionar data",
+ "select-filter": "Seleccionar filtro",
+ "select-role": "Seleccionar rol",
+ "select-website": "Seleccionar sitio web",
+ "session": "Sesión",
+ "session-data": "Datos da sesión",
+ "sessions": "Sesións",
+ "settings": "Axustes",
+ "share": "Compartir",
+ "share-url": "Compartir URL",
+ "single-day": "Un só día",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Orixe",
+ "sources": "Fontes",
+ "start-step": "Paso inicial",
+ "steps": "Pasos",
+ "sum": "Suma",
+ "support": "Soporte",
+ "switch-account": "Cambiar de conta",
+ "table": "Táboa",
+ "tablet": "Tableta",
+ "tag": "Etiqueta",
+ "tags": "Etiquetas",
+ "team": "Equipo",
+ "team-id": "ID do equipo",
+ "team-manager": "Xestor do equipo",
+ "team-member": "Membro do equipo",
+ "team-name": "Nome do equipo",
+ "team-owner": "Propietario do equipo",
+ "team-settings": "Axustes do equipo",
+ "team-view-only": "Equipo de só lectura",
+ "team-websites": "Sitios web do equipo",
+ "teams": "Equipos",
+ "term": "Termo",
+ "terms": "Termos",
+ "theme": "Decorado",
+ "this-month": "Este mes",
+ "this-week": "Esta semana",
+ "this-year": "Este ano",
+ "timezone": "Zona horaria",
+ "title": "Título",
+ "today": "Hoxe",
+ "toggle-charts": "Activación das gráficas",
+ "total": "Total",
+ "total-records": "Rexistros totais",
+ "tracking-code": "Código de seguemento",
+ "traffic": "Tráfico",
+ "transactions": "Transaccións",
+ "transfer": "Transferir",
+ "transfer-website": "Transferir sitio web",
+ "true": "Verdadeiro",
+ "ttfb": "TTFB",
+ "type": "Tipo",
+ "unique": "Único",
+ "unique-events": "Eventos únicos",
+ "unique-visitors": "Visitas únicas",
+ "uniqueCustomers": "Clientes únicos",
+ "unknown": "Descoñecido",
+ "untitled": "Sen título",
+ "update": "Actualizar",
+ "url": "URL",
+ "user": "Usuario",
+ "username": "Identificador",
+ "users": "Usuarios",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaña",
+ "utm-content": "UTM Contido",
+ "utm-description": "Segue as túas campañas a través dos parámetros UTM.",
+ "utm-medium": "UTM Medio",
+ "utm-source": "UTM Orixe",
+ "utm-term": "UTM Termo",
+ "value": "Valor",
+ "version": "Versión",
+ "view": "Vista",
+ "view-details": "Ver detalles",
+ "view-only": "Só lectura",
+ "views": "Visualizacións",
+ "views-per-visit": "Visualizacións por visita",
+ "visit-duration": "Tempo medio de visita",
+ "visitors": "Visitantes",
+ "visits": "Visitas",
+ "website": "Sitio web",
+ "website-id": "ID do sitio web",
+ "websites": "Sitios web",
+ "window": "Ventá",
+ "yesterday": "Onte"
+ },
+ "message": {
+ "action-confirmation": "Escribe {confirmation} na caixa de embaixo para confirmar.",
+ "active-users": "{x} actual {x, plural, one {visitante} other {visitantes}}",
+ "bad-request": "Solicitude incorrecta",
+ "collected-data": "Datos recopilados",
+ "confirm-delete": "Estás seguro/a de que queres eliminar {target}?",
+ "confirm-leave": "Estás seguro/a de que queres deixar {target} ?",
+ "confirm-remove": "Estás seguro/a de que queres eliminar {target} ?",
+ "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.",
+ "event-log": "{event} en {url} ",
+ "forbidden": "Prohibido",
+ "go-to-settings": "Ir aos axustes",
+ "incorrect-username-password": "Credenciais incorrectas.",
+ "invalid-domain": "Dominio non válido",
+ "min-password-length": "Lonxitude mínima de {n} caracteres",
+ "new-version-available": "Unha nova versión de Umami {version} está dispoñible!",
+ "no-data-available": "Sen datos dispoñibles.",
+ "no-event-data": "Sen datos de eventos dispoñibles.",
+ "no-match-password": "Non concordan os contrasinais",
+ "no-results-found": "Non se atoparon resultados.",
+ "no-team-websites": "Este equipo non ten ningún sitio web.",
+ "no-teams": "Non creaches ningún equipo.",
+ "no-users": "Non hai usuarios.",
+ "no-websites-configured": "Non tes sitios web configurados.",
+ "not-found": "Non atopado",
+ "nothing-selected": "Nada seleccionado.",
+ "page-not-found": "Páxina non atopada.",
+ "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-component-preview": "Selecciona un compoñente para previsualizar",
+ "select-website-first": "Selecciona primeiro un sitio web",
+ "sever-error": "Erro do servidor",
+ "share-url": "Este é o URL da compartición pública de {target}.",
+ "team-already-member": "Xa es membro do equipo.",
+ "team-not-found": "Equipo non atopado.",
+ "team-websites-info": "Os sitios web poden ser vistos por calquera membro do equipo.",
+ "tracking-code": "Código de seguimento",
+ "transfer-team-website-to-user": "Transferir este sitio web á túa conta?",
+ "transfer-user-website-to-team": "Selecciona o equipo ao que transferir este sitio web.",
+ "transfer-website": "Transferir propiedade do sitio web á túa conta ou a outro equipo.",
+ "triggered-event": "Activou o evento",
+ "unauthorized": "Non autorizado",
+ "user-deleted": "Usuario eliminado.",
+ "viewed-page": "Páxina vista",
+ "visitor-log": "Visitante desde {country} usando {browser} en {os} {device} "
+ }
}
diff --git a/public/intl/messages/he-IL.json b/public/intl/messages/he-IL.json
index d3ada47cc..f5ed72c2f 100644
--- a/public/intl/messages/he-IL.json
+++ b/public/intl/messages/he-IL.json
@@ -1,1856 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "פעולות"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "הוספת אתר"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "מנהל"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "הכל"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "חזרה"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "דפדפנים"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "ביטול"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "שינוי סיסמה"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "אישור סיסמה"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "מדינות"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "סיסמה נוכחית"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "טווח מותאם"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "דשבורד"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "טווח תאריכים"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "טווח תאריכים בברירת מחדל"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "הסרה"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "הסרת אתר"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "דסקטופ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "מכשירים"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "שיחרור"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "דומיין"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "עריכה"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "הפעלת URL שיתוף"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "אירועים"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "משותף"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "גולמי"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "לפטופ"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ימים אחרונים"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " שעות אחרונות"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "התחברות"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "התנתקות"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "מובייל"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "עוד"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "שם"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "סיסמה חדשה"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "צפיות בדפים"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "דפים"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "סיסמה"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "פרופיל"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "זמן אמת"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "מפנים"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "רענון"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "נדרש"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "איפוס"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "שמירה"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "הגדרות"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "שיתוף URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "יום בודד"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "טאבלט"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "החודש"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "השבוע"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "השנה"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "אזור זמן"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "היום"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "קוד מעקב"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "מבקרים ייחודיים"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "לא ידוע"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "שם משתמש"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "פרטים נוספים"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "צפיות"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "זמן ביקור ממוצע"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "מבקרים"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "אתרים"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " נוכחיים "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "מבקר"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "מבקרים"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "האם באמת למחוק את "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "כל המידע המקושר יימחק"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "משהו השתבש"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "להדרותג"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "שם משתמש או סיסמה לא נכונים"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "דומיין לא תקין"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "אין מידע זמין"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "סיסמאות לא תואמות"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "לא מוגדרים אתרים"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "דף לא נמצא"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "נשמר בהצלחה"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "זהו URL ציבורי עבור "
- },
- {
- "type": 1,
- "value": "target"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "קוד מעקב"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "מבקר ממדינת "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " משתמבש בדפדפן "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " ב-"
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "קוד גישה",
+ "account": "חשבון",
+ "action": "פעולה",
+ "actions": "פעולות",
+ "activity": "יומן פעילות",
+ "add": "הוסף",
+ "add-board": "הוסף לוח",
+ "add-description": "הוסף תיאור",
+ "add-link": "הוספת קישור",
+ "add-member": "הוסף חבר",
+ "add-pixel": "הוספת פיקסל",
+ "add-step": "הוסף שלב",
+ "add-website": "הוספת אתר",
+ "admin": "מנהל",
+ "affiliate": "שותף",
+ "after": "אחרי",
+ "all": "הכל",
+ "all-time": "כל הזמנים",
+ "analysis": "ניתוח",
+ "analytics": "אנליטיקה",
+ "aov": "AOV",
+ "application": "יישום",
+ "apply": "החל",
+ "arpu": "ARPU",
+ "attribution": "שיוך",
+ "attribution-description": "צפה כיצד משתמשים מתקשרים עם השיווק שלך ומה מניע המרות.",
+ "audience": "קהל",
+ "average": "ממוצע",
+ "back": "חזרה",
+ "before": "לפני",
+ "behavior": "התנהגות",
+ "block-selector": "בוחר בלוק",
+ "boards": "לוחות",
+ "bounce-rate": "שיעור נטישה",
+ "breakdown": "פירוט",
+ "browser": "דפדפן",
+ "browsers": "דפדפנים",
+ "campaign": "מסע פרסום",
+ "campaigns": "קמפיינים",
+ "cancel": "ביטול",
+ "change-password": "שינוי סיסמה",
+ "channel": "ערוץ",
+ "channels": "ערוצים",
+ "chart": "תרשים",
+ "cities": "ערים",
+ "city": "עיר",
+ "clear-all": "נקה הכל",
+ "cls": "CLS",
+ "cohort": "קבוצה",
+ "cohorts": "קוהורטות",
+ "compare": "השווה",
+ "compare-dates": "השווה תאריכים",
+ "confirm": "אשר",
+ "confirm-password": "אישור סיסמה",
+ "contains": "מכיל",
+ "content": "תוכן",
+ "continue": "המשך",
+ "conversion": "המרה",
+ "conversion-rate": "שיעור המרה",
+ "conversion-step": "שלב המרה",
+ "count": "ספירה",
+ "countries": "מדינות",
+ "country": "מדינה",
+ "create": "צור",
+ "create-report": "צור דוח",
+ "create-team": "צור צוות",
+ "create-user": "צור משתמש",
+ "created": "נוצר",
+ "created-by": "נוצר על ידי",
+ "criteria": "קריטריונים",
+ "currency": "מטבע",
+ "current": "נוכחי",
+ "current-password": "סיסמה נוכחית",
+ "custom-range": "טווח מותאם",
+ "dashboard": "דשבורד",
+ "data": "נתונים",
+ "date": "תאריך",
+ "date-range": "טווח תאריכים",
+ "day": "יום",
+ "default-date-range": "טווח תאריכים בברירת מחדל",
+ "delete": "הסרה",
+ "delete-report": "מחק דוח",
+ "delete-team": "מחק צוות",
+ "delete-user": "מחק משתמש",
+ "delete-website": "הסרת אתר",
+ "description": "תיאור",
+ "desktop": "מחשב שולחני",
+ "destination-url": "כתובת יעד",
+ "details": "פרטים",
+ "device": "מכשיר",
+ "devices": "מכשירים",
+ "direct": "ישיר",
+ "dismiss": "שיחרור",
+ "distinct-id": "מזהה ייחודי",
+ "documentation": "תיעוד",
+ "does-not-contain": "לא מכיל",
+ "does-not-include": "לא כולל",
+ "doest-not-exist": "לא קיים",
+ "domain": "דומיין",
+ "download": "הורדה",
+ "dropoff": "עזיבה",
+ "duration": "משך",
+ "edit": "עריכה",
+ "edit-member": "ערוך חבר",
+ "email": "אימייל",
+ "enable-share-url": "הפעלת URL שיתוף",
+ "end-step": "שלב סיום",
+ "entry": "כתובת כניסה",
+ "environment": "סביבה",
+ "event": "אירוע",
+ "event-data": "נתוני אירוע",
+ "event-name": "שם האירוע",
+ "events": "אירועים",
+ "exclude-bounce": "החרג נטישה",
+ "exists": "קיים",
+ "exit": "כתובת יציאה",
+ "false": "שקר",
+ "fcp": "FCP",
+ "field": "שדה",
+ "fields": "שדות",
+ "filter": "סינון",
+ "filter-combined": "משותף",
+ "filter-raw": "גולמי",
+ "filters": "מסננים",
+ "first-click": "קליק ראשון",
+ "first-seen": "נראה לראשונה",
+ "funnel": "משפך",
+ "funnel-description": "הבן את שיעור ההמרה והעזיבה של המשתמשים.",
+ "funnels": "משפכים",
+ "goal": "מטרה",
+ "goals": "מטרות",
+ "goals-description": "עקוב אחרי המטרות שלך לצפיות בדף ואירועים.",
+ "good": "טוב",
+ "greater-than": "גדול מ-",
+ "greater-than-equals": "גדול או שווה ל-",
+ "grouped": "מקובץ",
+ "growth": "צמיחה",
+ "hostname": "שם מארח",
+ "hour": "שעה",
+ "includes": "כולל",
+ "inp": "INP",
+ "insight": "תובנה",
+ "insights": "תובנות",
+ "insights-description": "צלול עמוק יותר לנתונים שלך באמצעות פילוחים ומסננים.",
+ "invalid-url": "כתובת לא תקינה",
+ "is": "הוא",
+ "is-false": "הוא שקר",
+ "is-not": "אינו",
+ "is-not-set": "לא הוגדר",
+ "is-set": "הוגדר",
+ "is-true": "הוא אמת",
+ "join": "הצטרף",
+ "join-team": "הצטרף לצוות",
+ "journey": "מסע",
+ "journey-description": "הבן כיצד משתמשים מנווטים באתר שלך.",
+ "journeys": "מסעות",
+ "language": "שפה",
+ "languages": "שפות",
+ "laptop": "לפטופ",
+ "last-click": "קליק אחרון",
+ "last-days": "{x} ימים אחרונים",
+ "last-hours": "{x} שעות אחרונות",
+ "last-months": "{x} חודשים אחרונים",
+ "last-seen": "נראה לאחרונה",
+ "lcp": "LCP",
+ "leave": "עזוב",
+ "leave-team": "עזוב צוות",
+ "less-than": "פחות מ-",
+ "less-than-equals": "פחות או שווה ל-",
+ "link": "קישור",
+ "links": "קישורים",
+ "location": "מיקום",
+ "login": "התחברות",
+ "logout": "התנתקות",
+ "manage": "נהל",
+ "manager": "מנהל",
+ "mask-level": "רמת מסיכה",
+ "match": "התאמה",
+ "match-all": "הכל",
+ "match-any": "כלשהו",
+ "max": "מקסימום",
+ "max-duration": "משך מקסימלי",
+ "maximize": "הרחב",
+ "medium": "בינוני",
+ "member": "חבר",
+ "members": "חברים",
+ "min": "מינימום",
+ "minute": "דקה",
+ "mobile": "מובייל",
+ "model": "דגם",
+ "month": "חודש",
+ "more": "עוד",
+ "my-account": "החשבון שלי",
+ "my-websites": "האתרים שלי",
+ "name": "שם",
+ "needs-improvement": "דרוש שיפור",
+ "new-password": "סיסמה חדשה",
+ "none": "ללא",
+ "number-of-records": "{x} {x, plural, one {רשומה} other {רשומות}}",
+ "ok": "אישור",
+ "online": "מחובר",
+ "organic-search": "חיפוש אורגני",
+ "organic-shopping": "קניות אורגניות",
+ "organic-social": "רשת חברתית אורגנית",
+ "organic-video": "וידאו אורגני",
+ "os": "מערכת הפעלה",
+ "other": "אחר",
+ "overview": "סקירה כללית",
+ "owner": "בעלים",
+ "page": "דף",
+ "page-of": "דף {current} מתוך {total}",
+ "page-views": "צפיות בדפים",
+ "pages": "דפים",
+ "pageTitle": "כותרת עמוד",
+ "paid-ads": "מודעות בתשלום",
+ "paid-search": "חיפוש בתשלום",
+ "paid-shopping": "קניות בתשלום",
+ "paid-social": "רשת חברתית בתשלום",
+ "paid-video": "וידאו בתשלום",
+ "password": "סיסמה",
+ "path": "נתיב",
+ "paths": "נתיבים",
+ "performance": "ביצועים",
+ "pixel": "פיקסל",
+ "pixels": "פיקסלים",
+ "play": "הפעל",
+ "poor": "גרוע",
+ "powered-by": "מופעל על ידי {name}",
+ "preferences": "העדפות",
+ "previous": "הקודם",
+ "previous-period": "תקופה קודמת",
+ "previous-year": "שנה קודמת",
+ "profile": "פרופיל",
+ "profiles": "פרופילים",
+ "properties": "מאפיינים",
+ "property": "מאפיין",
+ "queries": "שאילתות",
+ "query": "שאילתה",
+ "query-parameters": "פרמטרי שאילתה",
+ "realtime": "זמן אמת",
+ "recorded": "הוקלט ב",
+ "referral": "הפניה",
+ "referrer": "מפנה",
+ "referrers": "מפנים",
+ "refresh": "רענון",
+ "regenerate": "ייצור מחדש",
+ "regex-match": "תואם ביטוי רגולרי",
+ "regex-not-match": "לא תואם ביטוי רגולרי",
+ "region": "אזור",
+ "regions": "אזורים",
+ "remaining": "נותר",
+ "remove": "הסרה",
+ "remove-member": "הסרת חבר",
+ "replay": "הקלטה חוזרת",
+ "replay-enabled": "הקלטה חוזרת מופעלת",
+ "replay-id": "Replay ID",
+ "replays": "הקלטות חוזרות",
+ "reports": "דוחות",
+ "required": "נדרש",
+ "reset": "איפוס",
+ "reset-website": "Reset statistics",
+ "retention": "שימור",
+ "retention-days": "ימי שמירה",
+ "retention-description": "מדדו את מידת ההיצמדות לאתר שלכם על ידי מעקב אחר תדירות חזרת המשתמשים.",
+ "revenue": "הכנסה",
+ "revenue-description": "בדוק את ההכנסות שלך לאורך זמן.",
+ "role": "תפקיד",
+ "run-query": "הרץ שאילתה",
+ "sample-rate": "קצב דגימה",
+ "sample-size": "גודל מדגם",
+ "save": "שמירה",
+ "save-cohort": "שמור קוהורטה",
+ "save-segment": "שמור מקטע",
+ "screen": "מסך",
+ "screens": "מסכים",
+ "search": "חיפוש",
+ "segment": "מקטע",
+ "segments": "מקטעים",
+ "select": "בחירה",
+ "select-component": "בחר רכיב",
+ "select-date": "בחר תאריך",
+ "select-filter": "בחר מסנן",
+ "select-role": "בחר תפקיד",
+ "select-website": "בחר אתר",
+ "session": "סשן",
+ "session-data": "נתוני סשן",
+ "sessions": "הפעלות",
+ "settings": "הגדרות",
+ "share": "שתף",
+ "share-url": "שיתוף URL",
+ "single-day": "יום בודד",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "מקור",
+ "sources": "מקורות",
+ "start-step": "שלב התחלה",
+ "steps": "שלבים",
+ "sum": "סכום",
+ "support": "תמיכה",
+ "switch-account": "החלף חשבון",
+ "table": "טבלה",
+ "tablet": "טאבלט",
+ "tag": "תגית",
+ "tags": "תגיות",
+ "team": "צוות",
+ "team-id": "מזהה צוות",
+ "team-manager": "מנהל צוות",
+ "team-member": "חבר צוות",
+ "team-name": "שם צוות",
+ "team-owner": "בעלי צוות",
+ "team-settings": "הגדרות צוות",
+ "team-view-only": "צפייה בלבד בצוות",
+ "team-websites": "אתרי צוות",
+ "teams": "צוותות",
+ "term": "מונח חיפוש",
+ "terms": "תנאים",
+ "theme": "ערכת נושא",
+ "this-month": "החודש",
+ "this-week": "השבוע",
+ "this-year": "השנה",
+ "timezone": "אזור זמן",
+ "title": "כותרת",
+ "today": "היום",
+ "toggle-charts": "הצג/הסתר תרשימים",
+ "total": "סה\"כ",
+ "total-records": "סה\"כ רשומות",
+ "tracking-code": "קוד מעקב",
+ "traffic": "תעבורה",
+ "transactions": "עסקאות",
+ "transfer": "העברה",
+ "transfer-website": "העברת אתר",
+ "true": "אמת",
+ "ttfb": "TTFB",
+ "type": "סוג",
+ "unique": "ייחודי",
+ "unique-events": "אירועים ייחודיים",
+ "unique-visitors": "מבקרים ייחודיים",
+ "uniqueCustomers": "לקוחות ייחודיים",
+ "unknown": "לא ידוע",
+ "untitled": "ללא כותרת",
+ "update": "עדכון",
+ "url": "URL",
+ "user": "משתמש",
+ "username": "שם משתמש",
+ "users": "משתמשים",
+ "utm": "UTM",
+ "utm-campaign": "UTM מסע פרסום",
+ "utm-content": "UTM תוכן",
+ "utm-description": "עקבו אחר מסעות הפרסום שלכם באמצעות פרמטרי UTM.",
+ "utm-medium": "UTM מדיה",
+ "utm-source": "UTM מקור",
+ "utm-term": "UTM מונח",
+ "value": "ערך",
+ "version": "גרסה",
+ "view": "צפייה",
+ "view-details": "פרטים נוספים",
+ "view-only": "צפייה בלבד",
+ "views": "צפיות",
+ "views-per-visit": "צפיות לביקור",
+ "visit-duration": "זמן ביקור ממוצע",
+ "visitors": "מבקרים",
+ "visits": "ביקורים",
+ "website": "אתר",
+ "website-id": "מזהה אתר",
+ "websites": "אתרים",
+ "window": "חלון",
+ "yesterday": "אתמול"
+ },
+ "message": {
+ "action-confirmation": "הקלידו {confirmation} בתיבה למטה לאישור.",
+ "active-users": "{x} נוכחיים {x, plural, one {מבקר} other {מבקרים}}",
+ "bad-request": "בקשה שגויה",
+ "collected-data": "נתונים שנאספו",
+ "confirm-delete": "האם באמת למחוק את {target}?",
+ "confirm-leave": "האם אתם בטוחים שברצונכם לעזוב את {target} ?",
+ "confirm-remove": "האם אתם בטוחים שברצונכם להסיר את {target} ?",
+ "confirm-reset": "Are your sure you want to reset {target}'s statistics?",
+ "delete-team-warning": "מחיקת צוות תמחק גם את כל אתרי הצוות.",
+ "delete-website-warning": "כל המידע המקושר יימחק",
+ "empty-dashboard": "לוח המחוונים שלך ריק. לחץ על עריכה כדי להוסיף את הרכיב הראשון שלך.",
+ "error": "משהו השתבש",
+ "event-log": "{event} ב-{url} ",
+ "forbidden": "אסור",
+ "go-to-settings": "להדרותג",
+ "incorrect-username-password": "שם משתמש או סיסמה לא נכונים",
+ "invalid-domain": "דומיין לא תקין",
+ "min-password-length": "אורך מינימלי של {n} תווים",
+ "new-version-available": "גרסה חדשה של Umami {version} זמינה!",
+ "no-data-available": "אין מידע זמין",
+ "no-event-data": "אין נתוני אירועים זמינים.",
+ "no-match-password": "סיסמאות לא תואמות",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "לצוות זה אין אתרים.",
+ "no-teams": "לא יצרתם צוותות.",
+ "no-users": "אין משתמשים.",
+ "no-websites-configured": "לא מוגדרים אתרים",
+ "not-found": "לא נמצא",
+ "nothing-selected": "לא נבחר דבר.",
+ "page-not-found": "דף לא נמצא",
+ "reset-website": "לאיפוס אתר זה, הקלידו {confirmation} בתיבה למטה לאישור.",
+ "reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
+ "saved": "נשמר בהצלחה",
+ "select-component-preview": "בחר רכיב לתצוגה מקדימה",
+ "select-website-first": "בחר תחילה אתר אינטרנט",
+ "sever-error": "שגיאת שרת",
+ "share-url": "זהו URL ציבורי עבור {target}",
+ "team-already-member": "אתם כבר חברים בצוות.",
+ "team-not-found": "צוות לא נמצא.",
+ "team-websites-info": "האתרים ניתנים לצפייה על ידי כל חברי הצוות.",
+ "tracking-code": "קוד מעקב",
+ "transfer-team-website-to-user": "להעביר אתר זה לחשבון שלכם?",
+ "transfer-user-website-to-team": "בחרו את הצוות אליו להעביר אתר זה.",
+ "transfer-website": "העבירו את בעלות האתר לחשבון שלכם או לצוות אחר.",
+ "triggered-event": "אירוע שהופעל",
+ "unauthorized": "לא מורשה",
+ "user-deleted": "משתמש נמחק.",
+ "viewed-page": "עמוד שנצפה",
+ "visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device} "
+ }
}
diff --git a/public/intl/messages/hi-IN.json b/public/intl/messages/hi-IN.json
index 097349a34..a1b7d396f 100644
--- a/public/intl/messages/hi-IN.json
+++ b/public/intl/messages/hi-IN.json
@@ -1,1860 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "पहुंच कोड"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "कार्य"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "गतिविधि लॉग"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "जोडो"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "विवरण लिखें"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "वेबसाइट"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "प्रशासक"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "सब"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "पीछे"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "उछाल दर"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "वेब ब्राउज़र"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "रद्द करें"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "पासवर्ड बदलें"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "पासवर्ड की पुष्टि कीजिये"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "देश"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "वर्तमान पासवर्ड"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "कस्टम रेंज"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "नियंत्रण-पट्ट"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "तिथि सीमा"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "डिफ़ॉल्ट तिथि सीमा"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "खाता हटाएं"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "वेबसाइट हटाएं"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "डेस्कटॉप"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "उपकरण"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "खारिज कीजिये"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "डोमेन"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "संपादित करें"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "शेयर URL सक्षम करें"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "स्पर्धाएँ"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "संयुक्त"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "रॉ"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "लैपटॉप"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "पिछले "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " दिन"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "पिछले "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " घंटे"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "लॉग इन"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "लॉग आउट"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "मोबाइल फोन"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "और"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "नाम"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "नया पासवर्ड"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "पृष्ठ दृश्य"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "पृष्ठों"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "पासवर्ड"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " द्वारा संचालित"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "प्रोफ़ाइल"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "वास्तव काल"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "सन्दर्भदाता"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "रिफ्रेश"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "प्रतिवेदन"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "अपेक्षित"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "रीसेट"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "सहेजें"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "समायोजन"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "यूआरएल साझा करें"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "एक दिन"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "टैबलेट"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "इस महीने"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "इस सप्ताह"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "इस साल"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "समय क्षेत्र"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "आज"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "ट्रैकिंग कोड"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "अद्वितीय आगंतुकों"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "अज्ञात"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "उपयोगकर्ता नाम"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "विवरण देखें"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "दृश्य"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "औसत दृश्य समय"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "आगंतुकों"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "वेबसाइटों"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " मौजूद "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "आगंतुक"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "आगंतुकों"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "क्या आप वाकई में "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " हटाना चाहते हैं?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "सभी संबद्ध डेटा को भी हटा दिया जाएगा।"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "कुछ गलत हो गया।"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "समायोजन में जाइए"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "ग़लत उपयोगकर्ता नाम / पासवर्ड।"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "अमान्य डोमेन"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "कोई डेटा उपलब्ध नहीं है।"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "पासवर्ड मेल नहीं खाते"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "आपके पास कोई वेबसाइट कॉन्फ़िगर नहीं है।"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "पृष्ठ नहीं मिला।"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "सफलतापूर्वक संचित कर लिया गया है।"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "यह "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " के लिए सार्वजनिक रूप से साझा किया गया URL है।"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "ट्रैकिंग कोड"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " का आगंतुक, जो "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " का उपयोग करता है, "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " यन्त्र पर"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "पहुंच कोड",
+ "account": "खाता",
+ "action": "कार्रवाई",
+ "actions": "कार्य",
+ "activity": "गतिविधि लॉग",
+ "add": "जोडो",
+ "add-board": "बोर्ड जोड़ें",
+ "add-description": "विवरण लिखें",
+ "add-link": "लिंक जोड़ें",
+ "add-member": "सदस्य जोड़ें",
+ "add-pixel": "पिक्सेल जोड़ें",
+ "add-step": "चरण जोड़ें",
+ "add-website": "वेबसाइट",
+ "admin": "प्रशासक",
+ "affiliate": "संबद्ध",
+ "after": "बाद में",
+ "all": "सब",
+ "all-time": "सभी समय",
+ "analysis": "विश्लेषण",
+ "analytics": "विश्लेषण",
+ "aov": "AOV",
+ "application": "एप्लिकेशन",
+ "apply": "लागू करें",
+ "arpu": "ARPU",
+ "attribution": "अर्पण",
+ "attribution-description": "देखें कि उपयोगकर्ता आपके विपणन के साथ कैसे जुड़ते हैं और क्या रूपांतरण को प्रेरित करता है।",
+ "audience": "दर्शक",
+ "average": "औसत",
+ "back": "पीछे",
+ "before": "पहले",
+ "behavior": "व्यवहार",
+ "block-selector": "ब्लॉक चयनकर्ता",
+ "boards": "बोर्ड्स",
+ "bounce-rate": "उछाल दर",
+ "breakdown": "विभाजन",
+ "browser": "ब्राउज़र",
+ "browsers": "वेब ब्राउज़र",
+ "campaign": "अभियान",
+ "campaigns": "अभियान",
+ "cancel": "रद्द करें",
+ "change-password": "पासवर्ड बदलें",
+ "channel": "चैनल",
+ "channels": "चैनल",
+ "chart": "चार्ट",
+ "cities": "शहर",
+ "city": "शहर",
+ "clear-all": "सभी साफ करें",
+ "cls": "CLS",
+ "cohort": "समूह",
+ "cohorts": "कोहॉर्ट",
+ "compare": "तुलना करें",
+ "compare-dates": "तिथियों की तुलना करें",
+ "confirm": "पुष्टि करें",
+ "confirm-password": "पासवर्ड की पुष्टि कीजिये",
+ "contains": "शामिल है",
+ "content": "सामग्री",
+ "continue": "जारी रखें",
+ "conversion": "रूपांतरण",
+ "conversion-rate": "रूपांतरण दर",
+ "conversion-step": "रूपांतरण चरण",
+ "count": "गिनती",
+ "countries": "देश",
+ "country": "देश",
+ "create": "बनाएँ",
+ "create-report": "रिपोर्ट बनाएं",
+ "create-team": "टीम बनाएं",
+ "create-user": "उपयोगकर्ता बनाएं",
+ "created": "बनाया गया",
+ "created-by": "द्वारा बनाया गया",
+ "criteria": "मानदंड",
+ "currency": "मुद्रा",
+ "current": "वर्तमान",
+ "current-password": "वर्तमान पासवर्ड",
+ "custom-range": "कस्टम रेंज",
+ "dashboard": "नियंत्रण-पट्ट",
+ "data": "डेटा",
+ "date": "तिथि",
+ "date-range": "तिथि सीमा",
+ "day": "दिन",
+ "default-date-range": "डिफ़ॉल्ट तिथि सीमा",
+ "delete": "खाता हटाएं",
+ "delete-report": "रिपोर्ट हटाएं",
+ "delete-team": "टीम हटाएं",
+ "delete-user": "उपयोगकर्ता हटाएं",
+ "delete-website": "वेबसाइट हटाएं",
+ "description": "विवरण",
+ "desktop": "डेस्कटॉप",
+ "destination-url": "गंतव्य URL",
+ "details": "विवरण",
+ "device": "डिवाइस",
+ "devices": "उपकरण",
+ "direct": "प्रत्यक्ष",
+ "dismiss": "खारिज कीजिये",
+ "distinct-id": "अद्वितीय आईडी",
+ "documentation": "प्रलेखन",
+ "does-not-contain": "शामिल नहीं है",
+ "does-not-include": "शामिल नहीं है",
+ "doest-not-exist": "मौजूद नहीं है",
+ "domain": "डोमेन",
+ "download": "डाउनलोड",
+ "dropoff": "ड्रॉपऑफ",
+ "duration": "अवधि",
+ "edit": "संपादित करें",
+ "edit-member": "सदस्य संपादित करें",
+ "email": "ईमेल",
+ "enable-share-url": "शेयर URL सक्षम करें",
+ "end-step": "अंतिम चरण",
+ "entry": "प्रवेश URL",
+ "environment": "वातावरण",
+ "event": "घटना",
+ "event-data": "घटना डेटा",
+ "event-name": "घटना नाम",
+ "events": "स्पर्धाएँ",
+ "exclude-bounce": "बाउंस को बाहर करें",
+ "exists": "मौजूद है",
+ "exit": "निकास URL",
+ "false": "गलत",
+ "fcp": "FCP",
+ "field": "फ़ील्ड",
+ "fields": "फ़ील्ड्स",
+ "filter": "फ़िल्टर",
+ "filter-combined": "संयुक्त",
+ "filter-raw": "रॉ",
+ "filters": "फ़िल्टर",
+ "first-click": "पहला क्लिक",
+ "first-seen": "पहली बार देखा गया",
+ "funnel": "फनल",
+ "funnel-description": "उपयोगकर्ताओं की रूपांतरण और ड्रॉप-ऑफ दर को समझें।",
+ "funnels": "फनल्स",
+ "goal": "लक्ष्य",
+ "goals": "लक्ष्य",
+ "goals-description": "पृष्ठदृश्यों और घटनाओं के लिए अपने लक्ष्यों को ट्रैक करें।",
+ "good": "अच्छा",
+ "greater-than": "से अधिक",
+ "greater-than-equals": "से अधिक या बराबर",
+ "grouped": "समूहित",
+ "growth": "वृद्धि",
+ "hostname": "होस्टनाम",
+ "hour": "घंटा",
+ "includes": "शामिल है",
+ "inp": "INP",
+ "insight": "अंतर्दृष्टि",
+ "insights": "अंतर्दृष्टियाँ",
+ "insights-description": "सेगमेंट और फ़िल्टर का उपयोग करके अपने डेटा में गहराई से जाएं।",
+ "invalid-url": "अमान्य URL",
+ "is": "है",
+ "is-false": "गलत है",
+ "is-not": "नहीं है",
+ "is-not-set": "सेट नहीं है",
+ "is-set": "सेट है",
+ "is-true": "सही है",
+ "join": "शामिल हों",
+ "join-team": "टीम में शामिल हों",
+ "journey": "यात्रा",
+ "journey-description": "समझें कि उपयोगकर्ता आपकी वेबसाइट पर कैसे नेविगेट करते हैं।",
+ "journeys": "यात्राएँ",
+ "language": "भाषा",
+ "languages": "भाषाएँ",
+ "laptop": "लैपटॉप",
+ "last-click": "अंतिम क्लिक",
+ "last-days": "पिछले {x} दिन",
+ "last-hours": "पिछले {x} घंटे",
+ "last-months": "पिछले {x} महीने",
+ "last-seen": "अंतिम बार देखा गया",
+ "lcp": "LCP",
+ "leave": "छोड़ें",
+ "leave-team": "टीम छोड़ें",
+ "less-than": "से कम",
+ "less-than-equals": "से कम या बराबर",
+ "link": "लिंक",
+ "links": "लिंक",
+ "location": "स्थान",
+ "login": "लॉग इन",
+ "logout": "लॉग आउट",
+ "manage": "प्रबंधित करें",
+ "manager": "प्रबंधक",
+ "mask-level": "मास्क स्तर",
+ "match": "मेल",
+ "match-all": "सभी",
+ "match-any": "कोई भी",
+ "max": "अधिकतम",
+ "max-duration": "अधिकतम अवधि",
+ "maximize": "विस्तार करें",
+ "medium": "मध्यम",
+ "member": "सदस्य",
+ "members": "सदस्यगण",
+ "min": "न्यूनतम",
+ "minute": "मिनट",
+ "mobile": "मोबाइल फोन",
+ "model": "मॉडल",
+ "month": "महीना",
+ "more": "और",
+ "my-account": "मेरा खाता",
+ "my-websites": "मेरी वेबसाइट्स",
+ "name": "नाम",
+ "needs-improvement": "सुधार की आवश्यकता है",
+ "new-password": "नया पासवर्ड",
+ "none": "कोई नहीं",
+ "number-of-records": "{x} {x, plural, one {रिकॉर्ड} other {रिकॉर्ड}}",
+ "ok": "ठीक है",
+ "online": "ऑनलाइन",
+ "organic-search": "ऑर्गेनिक खोज",
+ "organic-shopping": "ऑर्गेनिक खरीदारी",
+ "organic-social": "ऑर्गेनिक सोशल",
+ "organic-video": "ऑर्गेनिक वीडियो",
+ "os": "OS",
+ "other": "अन्य",
+ "overview": "सारांश",
+ "owner": "मालिक",
+ "page": "पृष्ठ",
+ "page-of": "पृष्ठ {current} का {total}",
+ "page-views": "पृष्ठ दृश्य",
+ "pages": "पृष्ठों",
+ "pageTitle": "पृष्ठ शीर्षक",
+ "paid-ads": "पेड विज्ञापन",
+ "paid-search": "पेड खोज",
+ "paid-shopping": "पेड खरीदारी",
+ "paid-social": "पेड सोशल",
+ "paid-video": "पेड वीडियो",
+ "password": "पासवर्ड",
+ "path": "पथ",
+ "paths": "पथ",
+ "performance": "प्रदर्शन",
+ "pixel": "पिक्सेल",
+ "pixels": "पिक्सेल",
+ "play": "चलाएं",
+ "poor": "खराब",
+ "powered-by": "{name} द्वारा संचालित",
+ "preferences": "प्राथमिकताएँ",
+ "previous": "पिछला",
+ "previous-period": "पिछली अवधि",
+ "previous-year": "पिछला वर्ष",
+ "profile": "प्रोफ़ाइल",
+ "profiles": "प्रोफ़ाइल",
+ "properties": "गुण",
+ "property": "गुण",
+ "queries": "प्रश्न",
+ "query": "प्रश्न",
+ "query-parameters": "प्रश्न पैरामीटर",
+ "realtime": "वास्तव काल",
+ "recorded": "रिकॉर्ड किया गया",
+ "referral": "संदर्भ",
+ "referrer": "संदर्भकर्ता",
+ "referrers": "सन्दर्भदाता",
+ "refresh": "रिफ्रेश",
+ "regenerate": "पुनः उत्पन्न करें",
+ "regex-match": "रेगेक्स से मेल खाता है",
+ "regex-not-match": "रेगेक्स से मेल नहीं खाता",
+ "region": "क्षेत्र",
+ "regions": "क्षेत्र",
+ "remaining": "शेष",
+ "remove": "हटाएं",
+ "remove-member": "सदस्य हटाएं",
+ "replay": "रीप्ले",
+ "replay-enabled": "रीप्ले सक्षम",
+ "replay-id": "Replay ID",
+ "replays": "रीप्ले",
+ "reports": "रिपोर्ट्स",
+ "required": "अपेक्षित",
+ "reset": "रीसेट",
+ "reset-website": "आँकड़े रीसेट करें",
+ "retention": "पुनः आगमन",
+ "retention-days": "प्रतिधारण दिन",
+ "retention-description": "यह मापें कि उपयोगकर्ता कितनी बार आपकी वेबसाइट पर लौटते हैं।",
+ "revenue": "राजस्व",
+ "revenue-description": "समय के साथ अपने राजस्व को देखें।",
+ "role": "भूमिका",
+ "run-query": "प्रश्न चलाएँ",
+ "sample-rate": "नमूना दर",
+ "sample-size": "नमूना आकार",
+ "save": "सहेजें",
+ "save-cohort": "कोहॉर्ट सहेजें",
+ "save-segment": "सेगमेंट सहेजें",
+ "screen": "स्क्रीन",
+ "screens": "स्क्रीन",
+ "search": "खोजें",
+ "segment": "सेगमेंट",
+ "segments": "सेगमेंट",
+ "select": "चुनें",
+ "select-component": "घटक चुनें",
+ "select-date": "तिथि चुनें",
+ "select-filter": "फ़िल्टर चुनें",
+ "select-role": "भूमिका चुनें",
+ "select-website": "वेबसाइट चुनें",
+ "session": "सत्र",
+ "session-data": "सत्र डेटा",
+ "sessions": "सत्र",
+ "settings": "समायोजन",
+ "share": "साझा करें",
+ "share-url": "यूआरएल साझा करें",
+ "single-day": "एक दिन",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "स्रोत",
+ "sources": "स्रोत",
+ "start-step": "प्रारंभिक चरण",
+ "steps": "चरण",
+ "sum": "योग",
+ "support": "सहायता",
+ "switch-account": "खाता बदलें",
+ "table": "तालिका",
+ "tablet": "टैबलेट",
+ "tag": "टैग",
+ "tags": "टैग्स",
+ "team": "टीम",
+ "team-id": "टीम आईडी",
+ "team-manager": "टीम प्रबंधक",
+ "team-member": "टीम सदस्य",
+ "team-name": "टीम नाम",
+ "team-owner": "टीम मालिक",
+ "team-settings": "टीम सेटिंग्स",
+ "team-view-only": "केवल टीम देखें",
+ "team-websites": "टीम वेबसाइट्स",
+ "teams": "टीमें",
+ "term": "खोज शब्द",
+ "terms": "शर्तें",
+ "theme": "थीम",
+ "this-month": "इस महीने",
+ "this-week": "इस सप्ताह",
+ "this-year": "इस साल",
+ "timezone": "समय क्षेत्र",
+ "title": "शीर्षक",
+ "today": "आज",
+ "toggle-charts": "चार्ट दिखाएँ/छिपाएँ",
+ "total": "कुल",
+ "total-records": "कुल रिकॉर्ड",
+ "tracking-code": "ट्रैकिंग कोड",
+ "traffic": "ट्रैफ़िक",
+ "transactions": "लेनदेन",
+ "transfer": "स्थानांतरण",
+ "transfer-website": "वेबसाइट स्थानांतरित करें",
+ "true": "सत्य",
+ "ttfb": "TTFB",
+ "type": "प्रकार",
+ "unique": "अद्वितीय",
+ "unique-events": "अद्वितीय ईवेंट",
+ "unique-visitors": "अद्वितीय आगंतुकों",
+ "uniqueCustomers": "अद्वितीय ग्राहक",
+ "unknown": "अज्ञात",
+ "untitled": "बिना शीर्षक",
+ "update": "अपडेट",
+ "url": "URL",
+ "user": "उपयोगकर्ता",
+ "username": "उपयोगकर्ता नाम",
+ "users": "उपयोगकर्ता",
+ "utm": "UTM",
+ "utm-campaign": "UTM अभियान",
+ "utm-content": "UTM सामग्री",
+ "utm-description": "UTM पैरामीटर के माध्यम से अपने अभियानों को ट्रैक करें।",
+ "utm-medium": "UTM माध्यम",
+ "utm-source": "UTM स्रोत",
+ "utm-term": "UTM शब्द",
+ "value": "मान",
+ "version": "संस्करण",
+ "view": "देखें",
+ "view-details": "विवरण देखें",
+ "view-only": "केवल देखें",
+ "views": "दृश्य",
+ "views-per-visit": "प्रति विज़िट दृश्य",
+ "visit-duration": "औसत दृश्य समय",
+ "visitors": "आगंतुकों",
+ "visits": "विज़िट",
+ "website": "वेबसाइट",
+ "website-id": "वेबसाइट ID",
+ "websites": "वेबसाइटों",
+ "window": "विंडो",
+ "yesterday": "कल"
+ },
+ "message": {
+ "action-confirmation": "पुष्टि करने के लिए नीचे बॉक्स में {confirmation} टाइप करें।",
+ "active-users": "{x} मौजूद {x, plural, one {आगंतुक} other {आगंतुकों}}",
+ "bad-request": "अमान्य अनुरोध",
+ "collected-data": "एकत्रित डेटा",
+ "confirm-delete": "क्या आप वाकई में {target} हटाना चाहते हैं?",
+ "confirm-leave": "क्या आप वाकई {target} छोड़ना चाहते हैं?",
+ "confirm-remove": "क्या आप वाकई {target} को हटाना चाहते हैं?",
+ "confirm-reset": "Are your sure you want to reset {target}'s statistics?",
+ "delete-team-warning": "टीम हटाने से टीम की सभी वेबसाइटें भी हट जाएँगी।",
+ "delete-website-warning": "सभी संबद्ध डेटा को भी हटा दिया जाएगा।",
+ "empty-dashboard": "आपका डैशबोर्ड खाली है। अपना पहला घटक जोड़ने के लिए संपादित करें पर क्लिक करें।",
+ "error": "कुछ गलत हो गया।",
+ "event-log": "{url} पर {event} ",
+ "forbidden": "प्रतिबंधित",
+ "go-to-settings": "समायोजन में जाइए",
+ "incorrect-username-password": "ग़लत उपयोगकर्ता नाम / पासवर्ड।",
+ "invalid-domain": "अमान्य डोमेन",
+ "min-password-length": "न्यूनतम {n} वर्ण",
+ "new-version-available": "Umami {version} का नया संस्करण उपलब्ध है!",
+ "no-data-available": "कोई डेटा उपलब्ध नहीं है।",
+ "no-event-data": "कोई ईवेंट डेटा उपलब्ध नहीं है।",
+ "no-match-password": "पासवर्ड मेल नहीं खाते",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "इस टीम के पास कोई वेबसाइट नहीं है।",
+ "no-teams": "आपने कोई टीम नहीं बनाई है।",
+ "no-users": "कोई उपयोगकर्ता नहीं हैं।",
+ "no-websites-configured": "आपके पास कोई वेबसाइट कॉन्फ़िगर नहीं है।",
+ "not-found": "नहीं मिला",
+ "nothing-selected": "कुछ भी चयनित नहीं है।",
+ "page-not-found": "पृष्ठ नहीं मिला।",
+ "reset-website": "इस वेबसाइट को रीसेट करने के लिए, नीचे बॉक्स में {confirmation} टाइप करें।",
+ "reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
+ "saved": "सफलतापूर्वक संचित कर लिया गया है।",
+ "select-component-preview": "पूर्वावलोकन के लिए एक घटक चुनें",
+ "select-website-first": "पहले एक वेबसाइट चुनें",
+ "sever-error": "सर्वर त्रुटि",
+ "share-url": "यह {target} के लिए सार्वजनिक रूप से साझा किया गया URL है।",
+ "team-already-member": "आप पहले से ही टीम के सदस्य हैं।",
+ "team-not-found": "टीम नहीं मिली।",
+ "team-websites-info": "वेबसाइटें टीम के किसी भी सदस्य द्वारा देखी जा सकती हैं।",
+ "tracking-code": "ट्रैकिंग कोड",
+ "transfer-team-website-to-user": "इस वेबसाइट को अपने खाते में स्थानांतरित करें?",
+ "transfer-user-website-to-team": "इस वेबसाइट को स्थानांतरित करने के लिए टीम चुनें।",
+ "transfer-website": "वेबसाइट का स्वामित्व अपने खाते या किसी अन्य टीम में स्थानांतरित करें।",
+ "triggered-event": "ट्रिगर किया गया ईवेंट",
+ "unauthorized": "अनधिकृत",
+ "user-deleted": "उपयोगकर्ता हटाया गया।",
+ "viewed-page": "देखा गया पेज",
+ "visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर"
+ }
}
diff --git a/public/intl/messages/hr-HR.json b/public/intl/messages/hr-HR.json
index 4718f0c2f..e21f32fda 100644
--- a/public/intl/messages/hr-HR.json
+++ b/public/intl/messages/hr-HR.json
@@ -1,1882 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Dodaj web stranicu"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Sve"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Svo vrijeme"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Natrag "
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Odustani"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Promijeni lozinku"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potvrdi lozinku"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Countries"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Trenutna lozinka"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Prilagođeni raspon"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Nadzorna ploča"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Raspon datuma"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Zadani datumski raspon"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Obriši"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Obriši web stranicu"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Devices"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Odbaci"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domena"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Uredi"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Omogući dijeljenje poveznice"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Podaci događaja"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Events"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combined"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Jezik"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dana"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " sati"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Prijava"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Odjava"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Više"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Ime"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nova lozinka"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Ništa"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Vlasnik"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Page views"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Lozinka"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Stvarno vrijeme"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Osvježi"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Potrebna"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Resetirati"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Resetirati web stranicu"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Spremi"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Postavke"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Podijeli poveznicu"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Jedan dan"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Ovaj mjesec"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Ovaj tjedan"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Ova godina"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Vremenska zona"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Danas"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Kod za praćenje"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unique visitors"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Nepoznato"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Korisničko ime"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Pogledaj detalje"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Views"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitors"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Web stranice"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Jučer"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " Trenutno "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "posjetitelj"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "posjetitelja"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite obrisati "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Jeste li sigurni da želite resetirati "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistiku?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All website data will be deleted."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Something went wrong."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Idi u postavke"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Neispravno korisničke ime/lozinka."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Invalid domain. Do not include http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nema dostupnih podataka."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwords do not match."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "You do not have any websites configured."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Stranica nije pronađena."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your settings will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Saved."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Ovo je javno dijeljena poveznica za "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "To track stats for this website, place the following code in the "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " section of your HTML."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Pristupni kod",
+ "account": "Račun",
+ "action": "Radnja",
+ "actions": "Akcije",
+ "activity": "Dnevnik aktivnosti",
+ "add": "Dodaj",
+ "add-board": "Dodaj ploču",
+ "add-description": "Dodaj opis",
+ "add-link": "Dodaj poveznicu",
+ "add-member": "Dodaj člana",
+ "add-pixel": "Dodaj piksel",
+ "add-step": "Dodaj korak",
+ "add-website": "Dodaj web stranicu",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Nakon",
+ "all": "Sve",
+ "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",
+ "average": "Prosjek",
+ "back": "Natrag ",
+ "before": "Prije",
+ "behavior": "Ponašanje",
+ "block-selector": "Odabir bloka",
+ "boards": "Ploče",
+ "bounce-rate": "Stopa napuštanja",
+ "breakdown": "Raspad",
+ "browser": "Preglednik",
+ "browsers": "Preglednici",
+ "campaign": "Kampanja",
+ "campaigns": "Kampanje",
+ "cancel": "Odustani",
+ "change-password": "Promijeni lozinku",
+ "channel": "Kanal",
+ "channels": "Kanali",
+ "chart": "Grafikon",
+ "cities": "Gradovi",
+ "city": "Grad",
+ "clear-all": "Očisti sve",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorte",
+ "compare": "Usporedi",
+ "compare-dates": "Usporedi datume",
+ "confirm": "Potvrdi",
+ "confirm-password": "Potvrdi lozinku",
+ "contains": "Sadrži",
+ "content": "Sadržaj",
+ "continue": "Nastavi",
+ "conversion": "Konverzija",
+ "conversion-rate": "Stopa konverzije",
+ "conversion-step": "Korak konverzije",
+ "count": "Broj",
+ "countries": "Države",
+ "country": "Država",
+ "create": "Kreiraj",
+ "create-report": "Kreiraj izvještaj",
+ "create-team": "Kreiraj tim",
+ "create-user": "Kreiraj korisnika",
+ "created": "Kreirano",
+ "created-by": "Kreirao",
+ "criteria": "Kriteriji",
+ "currency": "Valuta",
+ "current": "Trenutno",
+ "current-password": "Trenutna lozinka",
+ "custom-range": "Prilagođeni raspon",
+ "dashboard": "Nadzorna ploča",
+ "data": "Podaci",
+ "date": "Datum",
+ "date-range": "Raspon datuma",
+ "day": "Dan",
+ "default-date-range": "Zadani datumski raspon",
+ "delete": "Obriši",
+ "delete-report": "Obriši izvještaj",
+ "delete-team": "Obriši tim",
+ "delete-user": "Obriši korisnika",
+ "delete-website": "Obriši web stranicu",
+ "description": "Opis",
+ "desktop": "Stolno računalo",
+ "destination-url": "Odredišni URL",
+ "details": "Detalji",
+ "device": "Uređaj",
+ "devices": "Uređaji",
+ "direct": "Direktno",
+ "dismiss": "Odbaci",
+ "distinct-id": "Jedinstveni ID",
+ "documentation": "Dokumentacija",
+ "does-not-contain": "Ne sadrži",
+ "does-not-include": "Ne uključuje",
+ "doest-not-exist": "Ne postoji",
+ "domain": "Domena",
+ "download": "Preuzmi",
+ "dropoff": "Odlazak",
+ "duration": "Trajanje",
+ "edit": "Uredi",
+ "edit-member": "Uredi člana",
+ "email": "E-mail",
+ "enable-share-url": "Omogući dijeljenje poveznice",
+ "end-step": "Završni korak",
+ "entry": "Ulazni URL",
+ "environment": "Okruženje",
+ "event": "Događaj",
+ "event-data": "Podaci događaja",
+ "event-name": "Naziv događaja",
+ "events": "Događaji",
+ "exclude-bounce": "Isključi odbijanja",
+ "exists": "Postoji",
+ "exit": "Izlazni URL",
+ "false": "Netočno",
+ "fcp": "FCP",
+ "field": "Polje",
+ "fields": "Polja",
+ "filter": "Filter",
+ "filter-combined": "Kombinirano",
+ "filter-raw": "Neobrađeno",
+ "filters": "Filteri",
+ "first-click": "Prvi klik",
+ "first-seen": "Prvi put viđeno",
+ "funnel": "Lijevak",
+ "funnel-description": "Razumite stopu konverzije i odlaska korisnika.",
+ "funnels": "Ljevci",
+ "goal": "Cilj",
+ "goals": "Ciljevi",
+ "goals-description": "Pratite svoje ciljeve za prikaze stranica i događaje.",
+ "good": "Dobro",
+ "greater-than": "Veće od",
+ "greater-than-equals": "Veće ili jednako",
+ "grouped": "Grupirano",
+ "growth": "Rast",
+ "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.",
+ "invalid-url": "Nevaljani URL",
+ "is": "Je",
+ "is-false": "Je netočno",
+ "is-not": "Nije",
+ "is-not-set": "Nije postavljeno",
+ "is-set": "Postavljeno",
+ "is-true": "Je točno",
+ "join": "Pridruži se",
+ "join-team": "Pridruži se timu",
+ "journey": "Putovanje",
+ "journey-description": "Razumite kako korisnici navigiraju vašom web stranicom.",
+ "journeys": "Putovanja",
+ "language": "Jezik",
+ "languages": "Jezici",
+ "laptop": "Laptop",
+ "last-click": "Zadnji klik",
+ "last-days": "Zadnjih {x} dana",
+ "last-hours": "Zadnjih {x} sati",
+ "last-months": "Zadnjih {x} mjeseci",
+ "last-seen": "Zadnji put viđeno",
+ "lcp": "LCP",
+ "leave": "Napusti",
+ "leave-team": "Napusti tim",
+ "less-than": "Manje od",
+ "less-than-equals": "Manje ili jednako",
+ "link": "Poveznica",
+ "links": "Poveznice",
+ "location": "Lokacija",
+ "login": "Prijava",
+ "logout": "Odjava",
+ "manage": "Upravljaj",
+ "manager": "Upravitelj",
+ "mask-level": "Razina maske",
+ "match": "Podudaranje",
+ "match-all": "Sve",
+ "match-any": "Bilo koje",
+ "max": "Maksimum",
+ "max-duration": "Maksimalno trajanje",
+ "maximize": "Proširi",
+ "medium": "Srednje",
+ "member": "Član",
+ "members": "Članovi",
+ "min": "Minimum",
+ "minute": "Minuta",
+ "mobile": "Mobilni",
+ "model": "Model",
+ "month": "Mjesec",
+ "more": "Više",
+ "my-account": "Moj račun",
+ "my-websites": "Moje web stranice",
+ "name": "Ime",
+ "needs-improvement": "Treba poboljšanje",
+ "new-password": "Nova lozinka",
+ "none": "Nijedan",
+ "number-of-records": "{x} {x, plural, one {zapis} other {zapisa}}",
+ "ok": "U redu",
+ "online": "Na mreži",
+ "organic-search": "Organsko pretraživanje",
+ "organic-shopping": "Organska kupovina",
+ "organic-social": "Organska društvena mreža",
+ "organic-video": "Organski videozapis",
+ "os": "OS",
+ "other": "Ostalo",
+ "overview": "Pregled",
+ "owner": "Vlasnik",
+ "page": "Stranica",
+ "page-of": "Stranica {current} od {total}",
+ "page-views": "Pregledi stranica",
+ "pages": "Stranice",
+ "pageTitle": "Naslov stranice",
+ "paid-ads": "Plaćeni oglasi",
+ "paid-search": "Plaćeno pretraživanje",
+ "paid-shopping": "Plaćena kupovina",
+ "paid-social": "Plaćena društvena mreža",
+ "paid-video": "Plaćeni videozapis",
+ "password": "Lozinka",
+ "path": "Putanja",
+ "paths": "Putanje",
+ "performance": "Performanse",
+ "pixel": "Piksel",
+ "pixels": "Pikseli",
+ "play": "Reproduciraj",
+ "poor": "Loše",
+ "powered-by": "Pokreće {name}",
+ "preferences": "Postavke",
+ "previous": "Prethodno",
+ "previous-period": "Prethodno razdoblje",
+ "previous-year": "Prethodna godina",
+ "profile": "Profil",
+ "profiles": "Profili",
+ "properties": "Svojstva",
+ "property": "Svojstvo",
+ "queries": "Upiti",
+ "query": "Upit",
+ "query-parameters": "Parametri upita",
+ "realtime": "Stvarno vrijeme",
+ "recorded": "Snimljeno u",
+ "referral": "Preporuka",
+ "referrer": "Izvor preporuke",
+ "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",
+ "replay": "Ponovna reprodukcija",
+ "replay-enabled": "Ponovna reprodukcija omogućena",
+ "replay-id": "Replay ID",
+ "replays": "Ponovne reprodukcije",
+ "reports": "Izvješća",
+ "required": "Potrebna",
+ "reset": "Resetirati",
+ "reset-website": "Resetirati web stranicu",
+ "retention": "Zadržavanje",
+ "retention-days": "Dani zadržavanja",
+ "retention-description": "Izmjerite koliko je vaša stranica privlačna praćenjem koliko se često korisnici vraćaju.",
+ "revenue": "Prihod",
+ "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-segment": "Spremi segment",
+ "screen": "Zaslon",
+ "screens": "Ekrani",
+ "search": "Pretraži",
+ "segment": "Segment",
+ "segments": "Segmenti",
+ "select": "Odaberi",
+ "select-component": "Odaberite komponentu",
+ "select-date": "Odaberi datum",
+ "select-filter": "Odaberi filter",
+ "select-role": "Odaberi ulogu",
+ "select-website": "Odaberi web stranicu",
+ "session": "Sesija",
+ "session-data": "Podaci sesije",
+ "sessions": "Sesije",
+ "settings": "Postavke",
+ "share": "Podijeli",
+ "share-url": "Podijeli poveznicu",
+ "single-day": "Jedan dan",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Izvor",
+ "sources": "Izvori",
+ "start-step": "Početni korak",
+ "steps": "Koraci",
+ "sum": "Zbroj",
+ "support": "Podrška",
+ "switch-account": "Promijeni račun",
+ "table": "Tablica",
+ "tablet": "Tablet",
+ "tag": "Oznaka",
+ "tags": "Oznake",
+ "team": "Tim",
+ "team-id": "ID tima",
+ "team-manager": "Upravitelj tima",
+ "team-member": "Član tima",
+ "team-name": "Naziv tima",
+ "team-owner": "Vlasnik tima",
+ "team-settings": "Postavke tima",
+ "team-view-only": "Samo pregled za tim",
+ "team-websites": "Web stranice tima",
+ "teams": "Timovi",
+ "term": "Pojam pretrage",
+ "terms": "Pojmovi",
+ "theme": "Tema",
+ "this-month": "Ovaj mjesec",
+ "this-week": "Ovaj tjedan",
+ "this-year": "Ova godina",
+ "timezone": "Vremenska zona",
+ "title": "Naslov",
+ "today": "Danas",
+ "toggle-charts": "Prikaži/sakrij grafikone",
+ "total": "Ukupno",
+ "total-records": "Ukupno zapisa",
+ "tracking-code": "Kod za praćenje",
+ "traffic": "Promet",
+ "transactions": "Transakcije",
+ "transfer": "Prenesi",
+ "transfer-website": "Prenesi web stranicu",
+ "true": "Istina",
+ "ttfb": "TTFB",
+ "type": "Vrsta",
+ "unique": "Jedinstveni",
+ "unique-events": "Jedinstveni događaji",
+ "unique-visitors": "Jedinstveni posjetitelji",
+ "uniqueCustomers": "Jedinstveni kupci",
+ "unknown": "Nepoznato",
+ "untitled": "Bez naslova",
+ "update": "Ažuriraj",
+ "url": "URL",
+ "user": "Korisnik",
+ "username": "Korisničko ime",
+ "users": "Korisnici",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampanja",
+ "utm-content": "UTM sadržaj",
+ "utm-description": "Pratite svoje kampanje pomoću UTM parametara.",
+ "utm-medium": "UTM medij",
+ "utm-source": "UTM izvor",
+ "utm-term": "UTM pojam",
+ "value": "Vrijednost",
+ "version": "Verzija",
+ "view": "Pregledaj",
+ "view-details": "Pogledaj detalje",
+ "view-only": "Samo pregled",
+ "views": "Pregledi",
+ "views-per-visit": "Pregledi po posjetu",
+ "visit-duration": "Trajanje posjeta",
+ "visitors": "Posjetitelji",
+ "visits": "Posjeti",
+ "website": "Web stranica",
+ "website-id": "ID web stranice",
+ "websites": "Web stranice",
+ "window": "Prozor",
+ "yesterday": "Jučer"
+ },
+ "message": {
+ "action-confirmation": "Upišite {confirmation} u polje ispod za potvrdu.",
+ "active-users": "{x} Trenutno {x, plural, one {posjetitelj} other {posjetitelja}}",
+ "bad-request": "Neispravan zahtjev",
+ "collected-data": "Prikupljeni podaci",
+ "confirm-delete": "Jeste li sigurni da želite obrisati {target}?",
+ "confirm-leave": "Jeste li sigurni da želite napustiti {target} ?",
+ "confirm-remove": "Jeste li sigurni da želite ukloniti {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Zabranjeno",
+ "go-to-settings": "Idi u postavke",
+ "incorrect-username-password": "Neispravno korisničke ime/lozinka.",
+ "invalid-domain": "Nevaljana domena. Ne uključujte http/https.",
+ "min-password-length": "Minimalna duljina od {n} znakova",
+ "new-version-available": "Dostupna je nova verzija Umami {version}!",
+ "no-data-available": "Nema dostupnih podataka.",
+ "no-event-data": "Nema dostupnih podataka o događajima.",
+ "no-match-password": "Lozinke se ne podudaraju.",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Ovaj tim nema web stranica.",
+ "no-teams": "Niste stvorili nijedan tim.",
+ "no-users": "Nema korisnika.",
+ "no-websites-configured": "Nemate konfigurirane web stranice.",
+ "not-found": "Nije pronađeno",
+ "nothing-selected": "Ništa nije odabrano.",
+ "page-not-found": "Stranica nije pronađena.",
+ "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-component-preview": "Odaberite komponentu za pregled",
+ "select-website-first": "Prvo odaberite web stranicu",
+ "sever-error": "Greška poslužitelja",
+ "share-url": "Ovo je javno dijeljena poveznica za {target}.",
+ "team-already-member": "Već ste član tima.",
+ "team-not-found": "Tim nije pronađen.",
+ "team-websites-info": "Web stranice može pregledati svatko u timu.",
+ "tracking-code": "Za praćenje statistike ove web stranice, postavite sljedeći kod u ... odjeljak vašeg HTML-a.",
+ "transfer-team-website-to-user": "Prenijeti ovu web stranicu na vaš račun?",
+ "transfer-user-website-to-team": "Odaberite tim na koji želite prenijeti ovu web stranicu.",
+ "transfer-website": "Prenesite vlasništvo web stranice na svoj račun ili drugi tim.",
+ "triggered-event": "Pokrenuti događaj",
+ "unauthorized": "Neautorizirano",
+ "user-deleted": "Korisnik izbrisan.",
+ "viewed-page": "Pregledana stranica",
+ "visitor-log": "Posjetitelj iz {country} koristi {browser} na {os} {device} "
+ }
}
diff --git a/public/intl/messages/hu-HU.json b/public/intl/messages/hu-HU.json
index 6c51c3dc3..5315d3e72 100644
--- a/public/intl/messages/hu-HU.json
+++ b/public/intl/messages/hu-HU.json
@@ -1,1872 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Műveletek"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Weboldal hozzáadása"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Adminisztrátor"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Összes"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Vissza"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Visszafordulási arány"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Böngészők"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Mégsem"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Jelszó módosítása"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Jelszó megerősítése"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Országok"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Jelenlegi jelszó"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Egyedi tartomány"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Áttekintés"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Időintervallum"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Alapértelmezett időintervallum"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Eltávolítás"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Weboldal eltávolítása"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Asztali számítógép"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Eszközök"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Mellőzés"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Módosítás"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "URL-megosztás engedélyezése"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Események"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Összevont"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Nyers"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Legutóbbi "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " nap"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Legutóbbi "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " óra"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Bejelentkezés"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Kijelentkezés"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Telefon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Bővebben"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Név"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Új jelszó"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Oldalmegtekintések"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Oldalak"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Jelszó"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Működteti az "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Valós idejű"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Hivatkozók"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Frissítés"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Kötelező"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Visszaállítás"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Mentés"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Beállítások"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "URL megosztása"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Egy nap"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Táblagép"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Ezen hónap"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Ezen hét"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Ezen év"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Időzóna"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Ma"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Követési kód"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Egyedi látogatók"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Ismeretlen"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Felhasználónév"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Részletek"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Megtekintések"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Átlagos látogatási idő"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Látogatók"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Weboldalak"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "látogató"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "latógató"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " jelenleg"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Biztos, hogy törölni szeretnéd "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " elemet?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Minden társított adat törlésre kerül."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Valami baj történt."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Tovább a beállításokhoz"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Érvénytelen felhasználónév/jelszó."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Érvénytelen domain"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nincs rendelkezésre álló adat."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "A jelszavak nem egyeznek"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Még nem állítottál be egyetlen weboldalt sem."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Oldal nem található."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Sikeres mentés."
- }
- ],
- "message.share-url": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " nyilvánosan megosztott URL címe."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Követési kód"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Látógató "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " területéről, "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " eszközön, "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " böngészőből."
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Hozzáférési kód",
+ "account": "Fiók",
+ "action": "Művelet",
+ "actions": "Műveletek",
+ "activity": "Tevékenységnapló",
+ "add": "Hozzáadás",
+ "add-board": "Tábla hozzáadása",
+ "add-description": "Leírás hozzáadása",
+ "add-link": "Link hozzáadása",
+ "add-member": "Tag hozzáadása",
+ "add-pixel": "Pixel hozzáadása",
+ "add-step": "Lépés hozzáadása",
+ "add-website": "Weboldal hozzáadása",
+ "admin": "Adminisztrátor",
+ "affiliate": "Partner",
+ "after": "Után",
+ "all": "Összes",
+ "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",
+ "average": "Átlag",
+ "back": "Vissza",
+ "before": "Előtt",
+ "behavior": "Viselkedés",
+ "block-selector": "Blokk kiválasztó",
+ "boards": "Táblák",
+ "bounce-rate": "Visszafordulási arány",
+ "breakdown": "Bontás",
+ "browser": "Böngésző",
+ "browsers": "Böngészők",
+ "campaign": "Kampány",
+ "campaigns": "Kampányok",
+ "cancel": "Mégsem",
+ "change-password": "Jelszó módosítása",
+ "channel": "Csatorna",
+ "channels": "Csatornák",
+ "chart": "Diagram",
+ "cities": "Városok",
+ "city": "Város",
+ "clear-all": "Összes törlése",
+ "cls": "CLS",
+ "cohort": "Kohorsz",
+ "cohorts": "Kohorszok",
+ "compare": "Összehasonlít",
+ "compare-dates": "Dátumok összehasonlítása",
+ "confirm": "Megerősít",
+ "confirm-password": "Jelszó megerősítése",
+ "contains": "Tartalmazza",
+ "content": "Tartalom",
+ "continue": "Folytatás",
+ "conversion": "Konverzió",
+ "conversion-rate": "Konverziós arány",
+ "conversion-step": "Konverziós lépés",
+ "count": "Darabszám",
+ "countries": "Országok",
+ "country": "Ország",
+ "create": "Létrehozás",
+ "create-report": "Jelentés létrehozása",
+ "create-team": "Csapat létrehozása",
+ "create-user": "Felhasználó létrehozása",
+ "created": "Létrehozva",
+ "created-by": "Létrehozta",
+ "criteria": "Feltételek",
+ "currency": "Pénznem",
+ "current": "Jelenlegi",
+ "current-password": "Jelenlegi jelszó",
+ "custom-range": "Egyedi tartomány",
+ "dashboard": "Áttekintés",
+ "data": "Adat",
+ "date": "Dátum",
+ "date-range": "Időintervallum",
+ "day": "Nap",
+ "default-date-range": "Alapértelmezett időintervallum",
+ "delete": "Eltávolítás",
+ "delete-report": "Jelentés törlése",
+ "delete-team": "Csapat törlése",
+ "delete-user": "Felhasználó törlése",
+ "delete-website": "Weboldal eltávolítása",
+ "description": "Leírás",
+ "desktop": "Asztali számítógép",
+ "destination-url": "Cél URL",
+ "details": "Részletek",
+ "device": "Eszköz",
+ "devices": "Eszközök",
+ "direct": "Közvetlen",
+ "dismiss": "Mellőzés",
+ "distinct-id": "Egyedi azonosító",
+ "documentation": "Dokumentáció",
+ "does-not-contain": "Nem tartalmazza",
+ "does-not-include": "Nem tartalmazza",
+ "doest-not-exist": "Nem létezik",
+ "domain": "Domain",
+ "download": "Letöltés",
+ "dropoff": "Lemorzsolódás",
+ "duration": "Időtartam",
+ "edit": "Módosítás",
+ "edit-member": "Tag szerkesztése",
+ "email": "E-mail",
+ "enable-share-url": "URL-megosztás engedélyezése",
+ "end-step": "Befejező lépés",
+ "entry": "Belépési URL",
+ "environment": "Környezet",
+ "event": "Esemény",
+ "event-data": "Eseményadatok",
+ "event-name": "Esemény neve",
+ "events": "Események",
+ "exclude-bounce": "Visszafordulás kizárása",
+ "exists": "Létezik",
+ "exit": "Kilépési URL",
+ "false": "Hamis",
+ "fcp": "FCP",
+ "field": "Mező",
+ "fields": "Mezők",
+ "filter": "Szűrő",
+ "filter-combined": "Összevont",
+ "filter-raw": "Nyers",
+ "filters": "Szűrők",
+ "first-click": "Első kattintás",
+ "first-seen": "Első megtekintés",
+ "funnel": "Tölcsér",
+ "funnel-description": "Értse meg a felhasználók konverziós és lemorzsolódási arányát.",
+ "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ó",
+ "greater-than": "Nagyobb mint",
+ "greater-than-equals": "Nagyobb vagy egyenlő",
+ "grouped": "Csoportosítva",
+ "growth": "Növekedés",
+ "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.",
+ "invalid-url": "Érvénytelen URL",
+ "is": "Az",
+ "is-false": "Hamis",
+ "is-not": "Nem az",
+ "is-not-set": "Nincs beállítva",
+ "is-set": "Beállítva",
+ "is-true": "Igaz",
+ "join": "Csatlakozás",
+ "join-team": "Csatlakozás a csapathoz",
+ "journey": "Út",
+ "journey-description": "Értse meg, hogyan navigálnak a felhasználók a weboldalán.",
+ "journeys": "Utak",
+ "language": "Nyelv",
+ "languages": "Nyelvek",
+ "laptop": "Laptop",
+ "last-click": "Utolsó kattintás",
+ "last-days": "Legutóbbi {x} nap",
+ "last-hours": "Legutóbbi {x} óra",
+ "last-months": "Utolsó {x} hónap",
+ "last-seen": "Utoljára látva",
+ "lcp": "LCP",
+ "leave": "Kilépés",
+ "leave-team": "Csapat elhagyása",
+ "less-than": "Kevesebb mint",
+ "less-than-equals": "Kevesebb vagy egyenlő",
+ "link": "Link",
+ "links": "Linkek",
+ "location": "Helyszín",
+ "login": "Bejelentkezés",
+ "logout": "Kijelentkezés",
+ "manage": "Kezelés",
+ "manager": "Menedzser",
+ "mask-level": "Maszkolási szint",
+ "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",
+ "members": "Tagok",
+ "min": "Minimum",
+ "minute": "Perc",
+ "mobile": "Telefon",
+ "model": "Modell",
+ "month": "Hónap",
+ "more": "Bővebben",
+ "my-account": "Saját fiók",
+ "my-websites": "Saját weboldalak",
+ "name": "Név",
+ "needs-improvement": "Fejlesztésre szorul",
+ "new-password": "Új jelszó",
+ "none": "Nincs",
+ "number-of-records": "{x} {x, plural, one {rekord} other {rekord}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organikus keresés",
+ "organic-shopping": "Organikus vásárlás",
+ "organic-social": "Organikus közösségi",
+ "organic-video": "Organikus videó",
+ "os": "Operációs rendszer",
+ "other": "Egyéb",
+ "overview": "Áttekintés",
+ "owner": "Tulajdonos",
+ "page": "Oldal",
+ "page-of": "Oldal {current} / {total}",
+ "page-views": "Oldalmegtekintések",
+ "pages": "Oldalak",
+ "pageTitle": "Oldal címe",
+ "paid-ads": "Fizetett hirdetések",
+ "paid-search": "Fizetett keresés",
+ "paid-shopping": "Fizetett vásárlás",
+ "paid-social": "Fizetett közösségi",
+ "paid-video": "Fizetett videó",
+ "password": "Jelszó",
+ "path": "Útvonal",
+ "paths": "Útvonalak",
+ "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",
+ "previous": "Előző",
+ "previous-period": "Előző időszak",
+ "previous-year": "Előző év",
+ "profile": "Profil",
+ "profiles": "Profilok",
+ "properties": "Tulajdonságok",
+ "property": "Tulajdonság",
+ "queries": "Lekérdezések",
+ "query": "Lekérdezés",
+ "query-parameters": "Lekérdezési paraméterek",
+ "realtime": "Valós idejű",
+ "recorded": "Rögzítve",
+ "referral": "Hivatkozás",
+ "referrer": "Hivatkozó",
+ "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",
+ "replay": "Visszajátszás",
+ "replay-enabled": "Visszajátszás engedélyezve",
+ "replay-id": "Replay ID",
+ "replays": "Visszajátszások",
+ "reports": "Jelentések",
+ "required": "Kötelező",
+ "reset": "Visszaállítás",
+ "reset-website": "Reset statistics",
+ "retention": "Megtartás",
+ "retention-days": "Megőrzési napok",
+ "retention-description": "Mérje weboldalának megtartó erejét annak nyomon követésével, hogy milyen gyakran térnek vissza a felhasználók.",
+ "revenue": "Bevétel",
+ "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-segment": "Szegmens mentése",
+ "screen": "Képernyő",
+ "screens": "Képernyők",
+ "search": "Keresés",
+ "segment": "Szegmens",
+ "segments": "Szegmensek",
+ "select": "Kiválasztás",
+ "select-component": "Válasszon komponenst",
+ "select-date": "Dátum kiválasztása",
+ "select-filter": "Szűrő kiválasztása",
+ "select-role": "Szerep kiválasztása",
+ "select-website": "Weboldal kiválasztása",
+ "session": "Munkamenet",
+ "session-data": "Munkamenet adatai",
+ "sessions": "Munkamenetek",
+ "settings": "Beállítások",
+ "share": "Megosztás",
+ "share-url": "URL megosztása",
+ "single-day": "Egy nap",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Forrás",
+ "sources": "Források",
+ "start-step": "Kezdő lépés",
+ "steps": "Lépések",
+ "sum": "Összeg",
+ "support": "Támogatás",
+ "switch-account": "Fiók váltása",
+ "table": "Táblázat",
+ "tablet": "Táblagép",
+ "tag": "Címke",
+ "tags": "Címkék",
+ "team": "Csapat",
+ "team-id": "Csapat-ID",
+ "team-manager": "Csapatmenedzser",
+ "team-member": "Csapattag",
+ "team-name": "Csapat neve",
+ "team-owner": "Csapat tulajdonosa",
+ "team-settings": "Csapat beállításai",
+ "team-view-only": "Csak csapat megtekintés",
+ "team-websites": "Csapat weboldalai",
+ "teams": "Csapatok",
+ "term": "Keresőkifejezés",
+ "terms": "Kifejezések",
+ "theme": "Téma",
+ "this-month": "Ezen hónap",
+ "this-week": "Ezen hét",
+ "this-year": "Ezen év",
+ "timezone": "Időzóna",
+ "title": "Cím",
+ "today": "Ma",
+ "toggle-charts": "Diagramok megjelenítése",
+ "total": "Összesen",
+ "total-records": "Összes rekord",
+ "tracking-code": "Követési kód",
+ "traffic": "Forgalom",
+ "transactions": "Tranzakciók",
+ "transfer": "Átvitel",
+ "transfer-website": "Weboldal átvitele",
+ "true": "Igaz",
+ "ttfb": "TTFB",
+ "type": "Típus",
+ "unique": "Egyedi",
+ "unique-events": "Egyedi események",
+ "unique-visitors": "Egyedi látogatók",
+ "uniqueCustomers": "Egyedi ügyfelek",
+ "unknown": "Ismeretlen",
+ "untitled": "Névtelen",
+ "update": "Frissítés",
+ "url": "URL",
+ "user": "Felhasználó",
+ "username": "Felhasználónév",
+ "users": "Felhasználók",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampány",
+ "utm-content": "UTM-tartalom",
+ "utm-description": "Kövesse nyomon kampányait UTM-paraméterekkel.",
+ "utm-medium": "UTM-médium",
+ "utm-source": "UTM-forrás",
+ "utm-term": "UTM-kifejezés",
+ "value": "Érték",
+ "version": "Verzió",
+ "view": "Megtekintés",
+ "view-details": "Részletek",
+ "view-only": "Csak megtekintés",
+ "views": "Megtekintések",
+ "views-per-visit": "Megtekintés/látogatás",
+ "visit-duration": "Átlagos látogatási idő",
+ "visitors": "Látogatók",
+ "visits": "Látogatások",
+ "website": "Weboldal",
+ "website-id": "Weboldal-ID",
+ "websites": "Weboldalak",
+ "window": "Ablak",
+ "yesterday": "Tegnap"
+ },
+ "message": {
+ "action-confirmation": "Írja be a(z) {confirmation} szót az alábbi mezőbe a megerősítéshez.",
+ "active-users": "{x} {x, plural, one {látogató} other {latógató}} jelenleg",
+ "bad-request": "Hibás kérés",
+ "collected-data": "Gyűjtött adatok",
+ "confirm-delete": "Biztos, hogy törölni szeretnéd {target} elemet?",
+ "confirm-leave": "Biztosan el szeretné hagyni a(z) {target} csapatot?",
+ "confirm-remove": "Biztosan el szeretné távolítani a(z) {target} elemet?",
+ "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.",
+ "event-log": "{event} itt: {url} ",
+ "forbidden": "Tiltott",
+ "go-to-settings": "Tovább a beállításokhoz",
+ "incorrect-username-password": "Érvénytelen felhasználónév/jelszó.",
+ "invalid-domain": "Érvénytelen domain",
+ "min-password-length": "Minimum {n} karakter hosszúság",
+ "new-version-available": "Elérhető az Umami {version} új verziója!",
+ "no-data-available": "Nincs rendelkezésre álló adat.",
+ "no-event-data": "Nincs elérhető eseményadat.",
+ "no-match-password": "A jelszavak nem egyeznek",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Ennek a csapatnak nincsenek weboldalai.",
+ "no-teams": "Még nem hozott létre csapatot.",
+ "no-users": "Nincsenek felhasználók.",
+ "no-websites-configured": "Még nem állítottál be egyetlen weboldalt sem.",
+ "not-found": "Nem található",
+ "nothing-selected": "Semmi nincs kijelölve.",
+ "page-not-found": "Oldal nem található.",
+ "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-component-preview": "Válasszon egy komponenst az előnézethez",
+ "select-website-first": "Először válasszon egy webhelyet",
+ "sever-error": "Szerverhiba",
+ "share-url": "{target} nyilvánosan megosztott URL címe.",
+ "team-already-member": "Ön már tagja a csapatnak.",
+ "team-not-found": "Csapat nem található.",
+ "team-websites-info": "A weboldalakat a csapat bármely tagja megtekintheti.",
+ "tracking-code": "Követési kód",
+ "transfer-team-website-to-user": "Átvinni ezt a weboldalt a fiókjába?",
+ "transfer-user-website-to-team": "Válassza ki a csapatot, amelyre át kívánja vinni a weboldalt.",
+ "transfer-website": "Vigye át a weboldal tulajdonjogát a fiókjába vagy egy másik csapatba.",
+ "triggered-event": "Kiváltott esemény",
+ "unauthorized": "Nincs jogosultság",
+ "user-deleted": "Felhasználó törölve.",
+ "viewed-page": "Megtekintett oldal",
+ "visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből."
+ }
}
diff --git a/public/intl/messages/id-ID.json b/public/intl/messages/id-ID.json
index b0fd0239f..99a95553a 100644
--- a/public/intl/messages/id-ID.json
+++ b/public/intl/messages/id-ID.json
@@ -1,1832 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Kode akses"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Aksi"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Catatan aktivitas"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Tambah"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Tambah deskripsi"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Tambah anggota"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Tambah langkah"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Tambah situs web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Pengelola"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Setelah"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Semua"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Semua waktu"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analitik"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Rata-rata"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Kembali"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Sebelum"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Rasio pentalan"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Rincian"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Peramban"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Peramban"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Batal"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Ganti kata sandi"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Kota"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Kota"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Hapus semua"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Bandingkan"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Konfirmasi"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Konfirmasi kata sandi"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Mengandung"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Lanjutkan"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Jumlah"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Negara"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Negara"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Buat"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Buat laporan"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Buat tim"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Buat pengguna"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Dibuat"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Dibuat oleh"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Saat ini"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Kata sandi sekarang"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Rentang khusus"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dasbor"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Tanggal"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Rentang tanggal"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Hari"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Rentang tanggal bawaan"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Hapus"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Hapus laporan"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Hapus tim"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Hapus pengguna"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Hapus situs web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Deskripsi"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detail"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Perangkat"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Perangkat"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Tutup"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Tidak mengandung"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Penurunan"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Sunting"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Sunting dasbor"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Sunting anggota"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Aktifkan URL berbagi"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Langkah akhir"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL masuk"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Peristiwa"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Data peristiwa"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Peristiwa"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Salah"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Kolom"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Kolom"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Gabungan"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Mentah"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Pertama kali dilihat"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Pahami tingkat konversi dan penurunan pengguna."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Tujuan"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Tujuan"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Lebih dari"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Lebih dari atau sama dengan"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Wawasan"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Jelajahi data Anda lebih dalam dengan menggunakan segmen dan filter."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Adalah"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Bukan"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Tidak diatur"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Diatur"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Gabung"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Gabung tim"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Perjalanan"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Pahami bagaimana pengguna menavigasi situs web Anda."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Bahasa"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Bahasa"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hari terakhir"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " jam terakhir"
- }
- ],
- "label.last-months": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " bulan terakhir"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Terakhir kali dilihat"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Keluar"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Keluar dari tim"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Kurang dari"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Kurang dari atau sama dengan"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Masuk"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Keluar"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Kelola"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Pengelola"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Maks"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Anggota"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Anggota"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Ponsel"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Lebih banyak"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Akun saya"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Situs web saya"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nama"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Kata sandi baru"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Tidak ada"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Tinjauan umum"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Pemilik"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Halaman "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " dari "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Tampilan halaman"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Judul halaman"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Halaman"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Kata sandi"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Didukung oleh "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Sebelumnya"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Periode sebelumnya"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Tahun lalu"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Waktu nyata"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Perujuk"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Perujuk"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Segarkan"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Buat ulang"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Wilayah"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Wilayah"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Hapus"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Hapus anggota"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Laporan"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Wajib"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Atur ulang"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Atur ulang statistik"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retensi"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Ukur daya tarik situs web Anda dengan melacak seberapa sering pengguna kembali."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Pendapatan"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Lihat pendapatan Anda seiring waktu."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Properti pendapatan"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Simpan"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Layar"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Cari"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Pilih"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Pilih tanggal"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Pilih role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Pilih situs web"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sesi"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesi"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Pengaturan"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Bagikan URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Sehari"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Langkah awal"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Langkah"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Tim"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID tim"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Pengelola tim"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Anggota tim"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nama tim"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Pemilik tim"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Situs web tim"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Tim"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Bulan ini"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Minggu ini"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Tahun ini"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zona waktu"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Judul"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hari ini"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Buka grafik"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total baris"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Kode lacak"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaksi"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer situs web"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Benar"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tipe"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unik"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Pengunjung unik"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Kustomer unik"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Tidak diketahui"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Tanpa judul"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Perbarui"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Pengguna"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nama pengguna"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Pengguna"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Lacak kampanye Anda melalui parameter UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Nilai"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Lihat"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Lihat Detil"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Hanya melihat"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Tampilan"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Tampilan per kunjungan"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Waktu kunjungan rata-rata"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Pengunjung"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Kunjungan"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Situs web"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID situs web"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Situs web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Kemarin"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Ketik "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " pada kotak di bawah untuk mengonfirmasi."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " pengunjung saat ini"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Data dikumpulkan"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Apakah kamu yakin ingin menghapus "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Apakah Anda yakin ingin meninggalkan "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Apakah Anda yakin ingin menghapus "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Anda yakin ingin mengatur ulang statistik "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Menghapus tim juga akan menghapus semua situs web yang terkait."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Semua data terkait juga akan dihapus."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ada yang salah."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Pergi ke pengaturan"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nama pengguna/kata sandi salah."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domain tidak valid"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimal "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " karakter"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Versi baru dari Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " telah tersedia!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Tidak ada data."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Tidak ada data peristiwa"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Kata sandi tidak cocok"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Tidak ada hasil yang ditemukan."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Tim ini tidak memiliki situs web."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Anda belum membuat tim."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Tidak ada pengguna."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Anda tidak memiliki situs web yang dikonfigurasi."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Halaman tidak ditemukan."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Untuk mengatur ulang situs web ini, ketik "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " pada kotak di bawah untuk mengonfirmasi."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Semua statistik pada situs web ini akan dihapus, tetapi kode lacak akan tetap terpasang"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Berhasil disimpan."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Ini adalah URL yang dibagikan secara publik untuk "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Anda sudah menjadi anggota tim ini."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Tim tidak ditemukan."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Situs web dapat dilihat oleh semua anggota tim."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Kode lacak"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer situs web ini ke akun Anda?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Pilih tim tujuan untuk mentransfer situs web ini."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer kepemilikan situs web ke akun Anda atau tim lain"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Peristiwa terjadi"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Pengguna telah dihapus."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Halaman dilihat"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Pengunjung dari "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " dengan "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " di "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "os"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Pengunjung yang meninggalkan situs web"
- }
- ]
+ "label": {
+ "access-code": "Kode akses",
+ "account": "Akun",
+ "action": "Tindakan",
+ "actions": "Aksi",
+ "activity": "Catatan aktivitas",
+ "add": "Tambah",
+ "add-board": "Tambah papan",
+ "add-description": "Tambah deskripsi",
+ "add-link": "Tambah tautan",
+ "add-member": "Tambah anggota",
+ "add-pixel": "Tambah piksel",
+ "add-step": "Tambah langkah",
+ "add-website": "Tambah situs web",
+ "admin": "Pengelola",
+ "affiliate": "Afiliasi",
+ "after": "Setelah",
+ "all": "Semua",
+ "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",
+ "average": "Rata-rata",
+ "back": "Kembali",
+ "before": "Sebelum",
+ "behavior": "Perilaku",
+ "block-selector": "Pemilih blok",
+ "boards": "Papan",
+ "bounce-rate": "Rasio pentalan",
+ "breakdown": "Rincian",
+ "browser": "Peramban",
+ "browsers": "Peramban",
+ "campaign": "Kampanye",
+ "campaigns": "Kampanye",
+ "cancel": "Batal",
+ "change-password": "Ganti kata sandi",
+ "channel": "Saluran",
+ "channels": "Saluran",
+ "chart": "Grafik",
+ "cities": "Kota",
+ "city": "Kota",
+ "clear-all": "Hapus semua",
+ "cls": "CLS",
+ "cohort": "Kelompok",
+ "cohorts": "Kohort",
+ "compare": "Bandingkan",
+ "compare-dates": "Bandingkan tanggal",
+ "confirm": "Konfirmasi",
+ "confirm-password": "Konfirmasi kata sandi",
+ "contains": "Mengandung",
+ "content": "Konten",
+ "continue": "Lanjutkan",
+ "conversion": "Konversi",
+ "conversion-rate": "Tingkat konversi",
+ "conversion-step": "Langkah konversi",
+ "count": "Jumlah",
+ "countries": "Negara",
+ "country": "Negara",
+ "create": "Buat",
+ "create-report": "Buat laporan",
+ "create-team": "Buat tim",
+ "create-user": "Buat pengguna",
+ "created": "Dibuat",
+ "created-by": "Dibuat oleh",
+ "criteria": "Kriteria",
+ "currency": "Mata uang",
+ "current": "Saat ini",
+ "current-password": "Kata sandi sekarang",
+ "custom-range": "Rentang khusus",
+ "dashboard": "Dasbor",
+ "data": "Data",
+ "date": "Tanggal",
+ "date-range": "Rentang tanggal",
+ "day": "Hari",
+ "default-date-range": "Rentang tanggal bawaan",
+ "delete": "Hapus",
+ "delete-report": "Hapus laporan",
+ "delete-team": "Hapus tim",
+ "delete-user": "Hapus pengguna",
+ "delete-website": "Hapus situs web",
+ "description": "Deskripsi",
+ "desktop": "Desktop",
+ "destination-url": "URL tujuan",
+ "details": "Detail",
+ "device": "Perangkat",
+ "devices": "Perangkat",
+ "direct": "Langsung",
+ "dismiss": "Tutup",
+ "distinct-id": "ID unik",
+ "documentation": "Dokumentasi",
+ "does-not-contain": "Tidak mengandung",
+ "does-not-include": "Tidak termasuk",
+ "doest-not-exist": "Tidak ada",
+ "domain": "Domain",
+ "download": "Unduh",
+ "dropoff": "Penurunan",
+ "duration": "Durasi",
+ "edit": "Sunting",
+ "edit-member": "Sunting anggota",
+ "email": "Email",
+ "enable-share-url": "Aktifkan URL berbagi",
+ "end-step": "Langkah akhir",
+ "entry": "URL masuk",
+ "environment": "Lingkungan",
+ "event": "Peristiwa",
+ "event-data": "Data peristiwa",
+ "event-name": "Nama peristiwa",
+ "events": "Peristiwa",
+ "exclude-bounce": "Kecualikan pantulan",
+ "exists": "Ada",
+ "exit": "Exit URL",
+ "false": "Salah",
+ "fcp": "FCP",
+ "field": "Kolom",
+ "fields": "Kolom",
+ "filter": "Filter",
+ "filter-combined": "Gabungan",
+ "filter-raw": "Mentah",
+ "filters": "Filter",
+ "first-click": "Klik pertama",
+ "first-seen": "Pertama kali dilihat",
+ "funnel": "Corong",
+ "funnel-description": "Pahami tingkat konversi dan penurunan pengguna.",
+ "funnels": "Corong",
+ "goal": "Tujuan",
+ "goals": "Tujuan",
+ "goals-description": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa.",
+ "good": "Baik",
+ "greater-than": "Lebih dari",
+ "greater-than-equals": "Lebih dari atau sama dengan",
+ "grouped": "Dikelompokkan",
+ "growth": "Pertumbuhan",
+ "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.",
+ "invalid-url": "URL tidak valid",
+ "is": "Adalah",
+ "is-false": "Salah",
+ "is-not": "Bukan",
+ "is-not-set": "Tidak diatur",
+ "is-set": "Diatur",
+ "is-true": "Benar",
+ "join": "Gabung",
+ "join-team": "Gabung tim",
+ "journey": "Perjalanan",
+ "journey-description": "Pahami bagaimana pengguna menavigasi situs web Anda.",
+ "journeys": "Perjalanan",
+ "language": "Bahasa",
+ "languages": "Bahasa",
+ "laptop": "Laptop",
+ "last-click": "Klik terakhir",
+ "last-days": "{x} hari terakhir",
+ "last-hours": "{x} jam terakhir",
+ "last-months": "{x} bulan terakhir",
+ "last-seen": "Terakhir kali dilihat",
+ "lcp": "LCP",
+ "leave": "Keluar",
+ "leave-team": "Keluar dari tim",
+ "less-than": "Kurang dari",
+ "less-than-equals": "Kurang dari atau sama dengan",
+ "link": "Tautan",
+ "links": "Tautan",
+ "location": "Lokasi",
+ "login": "Masuk",
+ "logout": "Keluar",
+ "manage": "Kelola",
+ "manager": "Manajer",
+ "mask-level": "Tingkat masker",
+ "match": "Cocok",
+ "match-all": "Semua",
+ "match-any": "Salah satu",
+ "max": "Maksimum",
+ "max-duration": "Durasi maksimal",
+ "maximize": "Perluas",
+ "medium": "Sedang",
+ "member": "Anggota",
+ "members": "Anggota",
+ "min": "Minimum",
+ "minute": "Menit",
+ "mobile": "Ponsel",
+ "model": "Model",
+ "month": "Bulan",
+ "more": "Lebih banyak",
+ "my-account": "Akun saya",
+ "my-websites": "Situs web saya",
+ "name": "Nama",
+ "needs-improvement": "Perlu perbaikan",
+ "new-password": "Kata sandi baru",
+ "none": "Tidak ada",
+ "number-of-records": "{x} {x, plural, one {catatan} other {catatan}}",
+ "ok": "OK",
+ "online": "Daring",
+ "organic-search": "Pencarian organik",
+ "organic-shopping": "Belanja organik",
+ "organic-social": "Sosial organik",
+ "organic-video": "Video organik",
+ "os": "OS",
+ "other": "Lainnya",
+ "overview": "Tinjauan umum",
+ "owner": "Pemilik",
+ "page": "Halaman",
+ "page-of": "Halaman {current} dari {total}",
+ "page-views": "Tampilan halaman",
+ "pages": "Halaman",
+ "pageTitle": "Judul halaman",
+ "paid-ads": "Iklan berbayar",
+ "paid-search": "Pencarian berbayar",
+ "paid-shopping": "Belanja berbayar",
+ "paid-social": "Sosial berbayar",
+ "paid-video": "Video berbayar",
+ "password": "Kata sandi",
+ "path": "Jalur",
+ "paths": "Jalur",
+ "performance": "Kinerja",
+ "pixel": "Piksel",
+ "pixels": "Piksel",
+ "play": "Putar",
+ "poor": "Buruk",
+ "powered-by": "Didukung oleh {name}",
+ "preferences": "Preferensi",
+ "previous": "Sebelumnya",
+ "previous-period": "Periode sebelumnya",
+ "previous-year": "Tahun lalu",
+ "profile": "Profil",
+ "profiles": "Profil",
+ "properties": "Properti",
+ "property": "Properti",
+ "queries": "Kueri",
+ "query": "Kueri",
+ "query-parameters": "Parameter kueri",
+ "realtime": "Waktu nyata",
+ "recorded": "Direkam pada",
+ "referral": "Rujukan",
+ "referrer": "Perujuk",
+ "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",
+ "replay": "Pemutaran ulang",
+ "replay-enabled": "Pemutaran ulang diaktifkan",
+ "replay-id": "Replay ID",
+ "replays": "Pemutaran ulang",
+ "reports": "Laporan",
+ "required": "Wajib",
+ "reset": "Atur ulang",
+ "reset-website": "Atur ulang statistik",
+ "retention": "Retensi",
+ "retention-days": "Hari penyimpanan",
+ "retention-description": "Ukur daya tarik situs web Anda dengan melacak seberapa sering pengguna kembali.",
+ "revenue": "Pendapatan",
+ "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-segment": "Simpan segmen",
+ "screen": "Layar",
+ "screens": "Layar",
+ "search": "Cari",
+ "segment": "Segmen",
+ "segments": "Segmen",
+ "select": "Pilih",
+ "select-component": "Pilih komponen",
+ "select-date": "Pilih tanggal",
+ "select-filter": "Pilih filter",
+ "select-role": "Pilih role",
+ "select-website": "Pilih situs web",
+ "session": "Sesi",
+ "session-data": "Data sesi",
+ "sessions": "Sesi",
+ "settings": "Pengaturan",
+ "share": "Bagikan",
+ "share-url": "Bagikan URL",
+ "single-day": "Sehari",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Sumber",
+ "sources": "Sumber",
+ "start-step": "Langkah awal",
+ "steps": "Langkah",
+ "sum": "Jumlah",
+ "support": "Dukungan",
+ "switch-account": "Ganti akun",
+ "table": "Tabel",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tag",
+ "team": "Tim",
+ "team-id": "ID tim",
+ "team-manager": "Pengelola tim",
+ "team-member": "Anggota tim",
+ "team-name": "Nama tim",
+ "team-owner": "Pemilik tim",
+ "team-settings": "Pengaturan tim",
+ "team-view-only": "Hanya lihat tim",
+ "team-websites": "Situs web tim",
+ "teams": "Tim",
+ "term": "Kata kunci",
+ "terms": "Ketentuan",
+ "theme": "Tema",
+ "this-month": "Bulan ini",
+ "this-week": "Minggu ini",
+ "this-year": "Tahun ini",
+ "timezone": "Zona waktu",
+ "title": "Judul",
+ "today": "Hari ini",
+ "toggle-charts": "Buka grafik",
+ "total": "Total",
+ "total-records": "Total baris",
+ "tracking-code": "Kode lacak",
+ "traffic": "Lalu lintas",
+ "transactions": "Transaksi",
+ "transfer": "Transfer",
+ "transfer-website": "Transfer situs web",
+ "true": "Benar",
+ "ttfb": "TTFB",
+ "type": "Tipe",
+ "unique": "Unik",
+ "unique-events": "Event unik",
+ "unique-visitors": "Pengunjung unik",
+ "uniqueCustomers": "Kustomer unik",
+ "unknown": "Tidak diketahui",
+ "untitled": "Tanpa judul",
+ "update": "Perbarui",
+ "url": "URL",
+ "user": "Pengguna",
+ "username": "Nama pengguna",
+ "users": "Pengguna",
+ "utm": "UTM",
+ "utm-campaign": "UTM Kampanye",
+ "utm-content": "UTM Konten",
+ "utm-description": "Lacak kampanye Anda melalui parameter UTM.",
+ "utm-medium": "UTM Media",
+ "utm-source": "UTM Sumber",
+ "utm-term": "UTM Kata Kunci",
+ "value": "Nilai",
+ "version": "Versi",
+ "view": "Lihat",
+ "view-details": "Lihat Detil",
+ "view-only": "Hanya melihat",
+ "views": "Tampilan",
+ "views-per-visit": "Tampilan per kunjungan",
+ "visit-duration": "Waktu kunjungan rata-rata",
+ "visitors": "Pengunjung",
+ "visits": "Kunjungan",
+ "website": "Situs web",
+ "website-id": "ID situs web",
+ "websites": "Situs web",
+ "window": "Jendela",
+ "yesterday": "Kemarin"
+ },
+ "message": {
+ "action-confirmation": "Ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
+ "active-users": "{x} pengunjung saat ini",
+ "bad-request": "Permintaan tidak valid",
+ "collected-data": "Data dikumpulkan",
+ "confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
+ "confirm-leave": "Apakah Anda yakin ingin meninggalkan {target} ?",
+ "confirm-remove": "Apakah Anda yakin ingin menghapus {target} ?",
+ "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.",
+ "event-log": "{event} di {url} ",
+ "forbidden": "Dilarang",
+ "go-to-settings": "Pergi ke pengaturan",
+ "incorrect-username-password": "Nama pengguna/kata sandi salah.",
+ "invalid-domain": "Domain tidak valid",
+ "min-password-length": "Minimal {n} karakter",
+ "new-version-available": "Versi baru dari Umami {version} telah tersedia!",
+ "no-data-available": "Tidak ada data.",
+ "no-event-data": "Tidak ada data peristiwa",
+ "no-match-password": "Kata sandi tidak cocok",
+ "no-results-found": "Tidak ada hasil yang ditemukan.",
+ "no-team-websites": "Tim ini tidak memiliki situs web.",
+ "no-teams": "Anda belum membuat tim.",
+ "no-users": "Tidak ada pengguna.",
+ "no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
+ "not-found": "Tidak ditemukan",
+ "nothing-selected": "Tidak ada yang dipilih.",
+ "page-not-found": "Halaman tidak ditemukan.",
+ "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-component-preview": "Pilih komponen untuk pratinjau",
+ "select-website-first": "Pilih situs web terlebih dahulu",
+ "sever-error": "Kesalahan server",
+ "share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.",
+ "team-already-member": "Anda sudah menjadi anggota tim ini.",
+ "team-not-found": "Tim tidak ditemukan.",
+ "team-websites-info": "Situs web dapat dilihat oleh semua anggota tim.",
+ "tracking-code": "Kode lacak",
+ "transfer-team-website-to-user": "Transfer situs web ini ke akun Anda?",
+ "transfer-user-website-to-team": "Pilih tim tujuan untuk mentransfer situs web ini.",
+ "transfer-website": "Transfer kepemilikan situs web ke akun Anda atau tim lain",
+ "triggered-event": "Peristiwa terjadi",
+ "unauthorized": "Tidak diotorisasi",
+ "user-deleted": "Pengguna telah dihapus.",
+ "viewed-page": "Halaman dilihat",
+ "visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os} "
+ }
}
diff --git a/public/intl/messages/it-IT.json b/public/intl/messages/it-IT.json
index 38e611363..5f902f3e2 100644
--- a/public/intl/messages/it-IT.json
+++ b/public/intl/messages/it-IT.json
@@ -1,1872 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Azioni"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Aggiungi sito"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Amministratore"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Tutto"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Sempre"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Indietro"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Frequenza di rimbalzo"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Annulla"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Modifica password"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Conferma password"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Nazioni"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Password attuale"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Personalizzato"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Pannello di Controllo"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Periodo"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Periodo standard"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Elimina"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Elimina sito"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivi"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Scarta"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Dominio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Modifica"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Abilita URL di condivisione"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Eventi"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Aggregati"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Lingua"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Lingue"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portatile"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Ultimi "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " giorni"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Ultime "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ore"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Accedi"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Esci"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Cellulare"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Dettagli"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nome"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nuova password"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Proprietario"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Visualizzazioni di pagina"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pagine"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Password"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profilo"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Tempo reale"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Ricarica"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obbligatorio"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Resetta le statistiche"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Salva"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Impostazioni"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Condividi link"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Singolo giorno"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Questo mese"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Questa settimana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Quest'anno"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Fuso orario"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Oggi"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Apri/Chiudi i grafici"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Codice di tracking"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitatori unici"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Sconosciuto"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nome utente"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Vedi dettagli"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visualizzazioni"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tempo medio di visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitatori"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Siti web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ieri"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitatore"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitatori"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " online"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Sei sicuro di voler eliminare "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Sei sicuro di voler azzerare le statistiche di "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Saranno eliminati anche tutti i dati associati."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Si è verificato un errore."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Vai alle impostazioni"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Username o password non corretti."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Dominio non valido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nessun dato disponibile."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Le password non corrispondono"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Non hai ancora configurato alcun sito."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Pagina non trovata"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Tutte le statistiche verranno cancellate per questo sito, ma il tuo codice di tracciamento rimarrà invariato."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Salvato!"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Questo è l'URL di condivisione per "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Codice di tracking"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Utenti da "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " tramite "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " su "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Codice di accesso",
+ "account": "Account",
+ "action": "Azione",
+ "actions": "Azioni",
+ "activity": "Registro attività",
+ "add": "Aggiungi",
+ "add-board": "Aggiungi bacheca",
+ "add-description": "Aggiungi descrizione",
+ "add-link": "Aggiungi link",
+ "add-member": "Aggiungi membro",
+ "add-pixel": "Aggiungi pixel",
+ "add-step": "Aggiungi passaggio",
+ "add-website": "Aggiungi sito",
+ "admin": "Amministratore",
+ "affiliate": "Affiliato",
+ "after": "Dopo",
+ "all": "Tutto",
+ "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",
+ "average": "Media",
+ "back": "Indietro",
+ "before": "Prima",
+ "behavior": "Comportamento",
+ "block-selector": "Selettore di blocco",
+ "boards": "Bacheche",
+ "bounce-rate": "Frequenza di rimbalzo",
+ "breakdown": "Dettaglio",
+ "browser": "Browser",
+ "browsers": "Browser",
+ "campaign": "Campagna",
+ "campaigns": "Campagne",
+ "cancel": "Annulla",
+ "change-password": "Modifica password",
+ "channel": "Canale",
+ "channels": "Canali",
+ "chart": "Grafico",
+ "cities": "Città",
+ "city": "Città",
+ "clear-all": "Cancella tutto",
+ "cls": "CLS",
+ "cohort": "Coorte",
+ "cohorts": "Coorti",
+ "compare": "Confronta",
+ "compare-dates": "Confronta date",
+ "confirm": "Conferma",
+ "confirm-password": "Conferma password",
+ "contains": "Contiene",
+ "content": "Contenuto",
+ "continue": "Continua",
+ "conversion": "Conversione",
+ "conversion-rate": "Tasso di conversione",
+ "conversion-step": "Passaggio di conversione",
+ "count": "Conteggio",
+ "countries": "Nazioni",
+ "country": "Paese",
+ "create": "Crea",
+ "create-report": "Crea rapporto",
+ "create-team": "Crea team",
+ "create-user": "Crea utente",
+ "created": "Creato",
+ "created-by": "Creato da",
+ "criteria": "Criteri",
+ "currency": "Valuta",
+ "current": "Attuale",
+ "current-password": "Password attuale",
+ "custom-range": "Personalizzato",
+ "dashboard": "Pannello di Controllo",
+ "data": "Dati",
+ "date": "Data",
+ "date-range": "Periodo",
+ "day": "Giorno",
+ "default-date-range": "Periodo standard",
+ "delete": "Elimina",
+ "delete-report": "Elimina rapporto",
+ "delete-team": "Elimina team",
+ "delete-user": "Elimina utente",
+ "delete-website": "Elimina sito",
+ "description": "Descrizione",
+ "desktop": "Desktop",
+ "destination-url": "URL di destinazione",
+ "details": "Dettagli",
+ "device": "Dispositivo",
+ "devices": "Dispositivi",
+ "direct": "Diretto",
+ "dismiss": "Scarta",
+ "distinct-id": "ID distinto",
+ "documentation": "Documentazione",
+ "does-not-contain": "Non contiene",
+ "does-not-include": "Non include",
+ "doest-not-exist": "Non esiste",
+ "domain": "Dominio",
+ "download": "Scarica",
+ "dropoff": "Abbandono",
+ "duration": "Durata",
+ "edit": "Modifica",
+ "edit-member": "Modifica membro",
+ "email": "Email",
+ "enable-share-url": "Abilita URL di condivisione",
+ "end-step": "Passaggio finale",
+ "entry": "URL di ingresso",
+ "environment": "Ambiente",
+ "event": "Evento",
+ "event-data": "Dati evento",
+ "event-name": "Nome evento",
+ "events": "Eventi",
+ "exclude-bounce": "Escludi rimbalzo",
+ "exists": "Esiste",
+ "exit": "URL di uscita",
+ "false": "Falso",
+ "fcp": "FCP",
+ "field": "Campo",
+ "fields": "Campi",
+ "filter": "Filtro",
+ "filter-combined": "Aggregati",
+ "filter-raw": "Grezzo",
+ "filters": "Filtri",
+ "first-click": "Primo clic",
+ "first-seen": "Prima visualizzazione",
+ "funnel": "Funnel",
+ "funnel-description": "Comprendi il tasso di conversione e di abbandono degli utenti.",
+ "funnels": "Funnel",
+ "goal": "Obiettivo",
+ "goals": "Obiettivi",
+ "goals-description": "Tieni traccia dei tuoi obiettivi per visualizzazioni di pagina ed eventi.",
+ "good": "Buono",
+ "greater-than": "Maggiore di",
+ "greater-than-equals": "Maggiore o uguale a",
+ "grouped": "Raggruppato",
+ "growth": "Crescita",
+ "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.",
+ "invalid-url": "URL non valido",
+ "is": "È",
+ "is-false": "È falso",
+ "is-not": "Non è",
+ "is-not-set": "Non impostato",
+ "is-set": "Impostato",
+ "is-true": "È vero",
+ "join": "Unisciti",
+ "join-team": "Unisciti al team",
+ "journey": "Percorso",
+ "journey-description": "Comprendi come gli utenti navigano nel tuo sito web.",
+ "journeys": "Percorsi",
+ "language": "Lingua",
+ "languages": "Lingue",
+ "laptop": "Portatile",
+ "last-click": "Ultimo clic",
+ "last-days": "Ultimi {x} giorni",
+ "last-hours": "Ultime {x} ore",
+ "last-months": "Ultimi {x} mesi",
+ "last-seen": "Ultima visualizzazione",
+ "lcp": "LCP",
+ "leave": "Lascia",
+ "leave-team": "Lascia il team",
+ "less-than": "Meno di",
+ "less-than-equals": "Meno o uguale a",
+ "link": "Link",
+ "links": "Link",
+ "location": "Posizione",
+ "login": "Accedi",
+ "logout": "Esci",
+ "manage": "Gestisci",
+ "manager": "Gestore",
+ "mask-level": "Livello di maschera",
+ "match": "Corrispondenza",
+ "match-all": "Tutti",
+ "match-any": "Qualsiasi",
+ "max": "Massimo",
+ "max-duration": "Durata massima",
+ "maximize": "Espandi",
+ "medium": "Medio",
+ "member": "Membro",
+ "members": "Membri",
+ "min": "Minimo",
+ "minute": "Minuto",
+ "mobile": "Cellulare",
+ "model": "Modello",
+ "month": "Mese",
+ "more": "Dettagli",
+ "my-account": "Il mio account",
+ "my-websites": "I miei siti",
+ "name": "Nome",
+ "needs-improvement": "Necessita miglioramento",
+ "new-password": "Nuova password",
+ "none": "Nessuno",
+ "number-of-records": "{x} {x, plural, one {record} other {record}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Ricerca organica",
+ "organic-shopping": "Acquisto organico",
+ "organic-social": "Social organico",
+ "organic-video": "Video organico",
+ "os": "SO",
+ "other": "Altro",
+ "overview": "Panoramica",
+ "owner": "Proprietario",
+ "page": "Pagina",
+ "page-of": "Pagina {current} di {total}",
+ "page-views": "Visualizzazioni di pagina",
+ "pages": "Pagine",
+ "pageTitle": "Titolo pagina",
+ "paid-ads": "Annunci a pagamento",
+ "paid-search": "Ricerca a pagamento",
+ "paid-shopping": "Acquisto a pagamento",
+ "paid-social": "Social a pagamento",
+ "paid-video": "Video a pagamento",
+ "password": "Password",
+ "path": "Percorso",
+ "paths": "Percorsi",
+ "performance": "Prestazioni",
+ "pixel": "Pixel",
+ "pixels": "Pixel",
+ "play": "Riproduci",
+ "poor": "Scarso",
+ "powered-by": "Fornito da {name}",
+ "preferences": "Preferenze",
+ "previous": "Precedente",
+ "previous-period": "Periodo precedente",
+ "previous-year": "Anno precedente",
+ "profile": "Profilo",
+ "profiles": "Profili",
+ "properties": "Proprietà",
+ "property": "Proprietà",
+ "queries": "Query",
+ "query": "Query",
+ "query-parameters": "Parametri query",
+ "realtime": "Tempo reale",
+ "recorded": "Registrato il",
+ "referral": "Referente",
+ "referrer": "Referente",
+ "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",
+ "replay": "Replay",
+ "replay-enabled": "Replay abilitato",
+ "replay-id": "Replay ID",
+ "replays": "Replay",
+ "reports": "Report",
+ "required": "Obbligatorio",
+ "reset": "Reimposta",
+ "reset-website": "Resetta le statistiche",
+ "retention": "Fidelizzazione",
+ "retention-days": "Giorni di conservazione",
+ "retention-description": "Misura la fidelizzazione del tuo sito monitorando la frequenza con cui gli utenti ritornano.",
+ "revenue": "Ricavi",
+ "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-segment": "Salva segmento",
+ "screen": "Schermo",
+ "screens": "Schermi",
+ "search": "Cerca",
+ "segment": "Segmento",
+ "segments": "Segmenti",
+ "select": "Seleziona",
+ "select-component": "Seleziona componente",
+ "select-date": "Seleziona data",
+ "select-filter": "Seleziona filtro",
+ "select-role": "Seleziona ruolo",
+ "select-website": "Seleziona sito web",
+ "session": "Sessione",
+ "session-data": "Dati sessione",
+ "sessions": "Sessioni",
+ "settings": "Impostazioni",
+ "share": "Condividi",
+ "share-url": "Condividi link",
+ "single-day": "Singolo giorno",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Fonte",
+ "sources": "Fonti",
+ "start-step": "Passaggio iniziale",
+ "steps": "Passaggi",
+ "sum": "Somma",
+ "support": "Supporto",
+ "switch-account": "Cambia account",
+ "table": "Tabella",
+ "tablet": "Tablet",
+ "tag": "Etichetta",
+ "tags": "Etichette",
+ "team": "Team",
+ "team-id": "ID Team",
+ "team-manager": "Manager del team",
+ "team-member": "Membro del team",
+ "team-name": "Nome del team",
+ "team-owner": "Proprietario del team",
+ "team-settings": "Impostazioni team",
+ "team-view-only": "Solo visualizzazione team",
+ "team-websites": "Siti web del team",
+ "teams": "Team",
+ "term": "Termine",
+ "terms": "Termini",
+ "theme": "Tema",
+ "this-month": "Questo mese",
+ "this-week": "Questa settimana",
+ "this-year": "Quest'anno",
+ "timezone": "Fuso orario",
+ "title": "Titolo",
+ "today": "Oggi",
+ "toggle-charts": "Apri/Chiudi i grafici",
+ "total": "Totale",
+ "total-records": "Record totali",
+ "tracking-code": "Codice di tracking",
+ "traffic": "Traffico",
+ "transactions": "Transazioni",
+ "transfer": "Trasferisci",
+ "transfer-website": "Trasferisci sito web",
+ "true": "Vero",
+ "ttfb": "TTFB",
+ "type": "Tipo",
+ "unique": "Unico",
+ "unique-events": "Eventi unici",
+ "unique-visitors": "Visitatori unici",
+ "uniqueCustomers": "Clienti unici",
+ "unknown": "Sconosciuto",
+ "untitled": "Senza titolo",
+ "update": "Aggiorna",
+ "url": "URL",
+ "user": "Utente",
+ "username": "Nome utente",
+ "users": "Utenti",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campagna",
+ "utm-content": "UTM Contenuto",
+ "utm-description": "Monitora le tue campagne attraverso i parametri UTM.",
+ "utm-medium": "UTM Mezzo",
+ "utm-source": "UTM Fonte",
+ "utm-term": "UTM Termine",
+ "value": "Valore",
+ "version": "Versione",
+ "view": "Visualizza",
+ "view-details": "Vedi dettagli",
+ "view-only": "Solo visualizzazione",
+ "views": "Visualizzazioni",
+ "views-per-visit": "Visualizzazioni per visita",
+ "visit-duration": "Tempo medio di visita",
+ "visitors": "Visitatori",
+ "visits": "Visite",
+ "website": "Sito web",
+ "website-id": "ID sito web",
+ "websites": "Siti web",
+ "window": "Finestra",
+ "yesterday": "Ieri"
+ },
+ "message": {
+ "action-confirmation": "Digita {confirmation} nella casella sottostante per confermare.",
+ "active-users": "{x} {x, plural, one {visitatore} other {visitatori}} online",
+ "bad-request": "Richiesta non valida",
+ "collected-data": "Dati raccolti",
+ "confirm-delete": "Sei sicuro di voler eliminare {target}?",
+ "confirm-leave": "Sei sicuro di voler lasciare {target} ?",
+ "confirm-remove": "Sei sicuro di voler rimuovere {target} ?",
+ "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.",
+ "event-log": "{event} su {url} ",
+ "forbidden": "Vietato",
+ "go-to-settings": "Vai alle impostazioni",
+ "incorrect-username-password": "Username o password non corretti.",
+ "invalid-domain": "Dominio non valido",
+ "min-password-length": "Lunghezza minima di {n} caratteri",
+ "new-version-available": "È disponibile una nuova versione di Umami {version}!",
+ "no-data-available": "Nessun dato disponibile.",
+ "no-event-data": "Nessun dato evento disponibile.",
+ "no-match-password": "Le password non corrispondono",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Questo team non ha siti web.",
+ "no-teams": "Non hai creato nessun team.",
+ "no-users": "Non ci sono utenti.",
+ "no-websites-configured": "Non hai ancora configurato alcun sito.",
+ "not-found": "Non trovato",
+ "nothing-selected": "Nessuna selezione.",
+ "page-not-found": "Pagina non trovata",
+ "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-component-preview": "Seleziona un componente per l'anteprima",
+ "select-website-first": "Seleziona prima un sito web",
+ "sever-error": "Errore del server",
+ "share-url": "Questo è l'URL di condivisione per {target}.",
+ "team-already-member": "Sei già membro del team.",
+ "team-not-found": "Team non trovato.",
+ "team-websites-info": "I siti web possono essere visualizzati da chiunque nel team.",
+ "tracking-code": "Codice di tracking",
+ "transfer-team-website-to-user": "Trasferire questo sito web al tuo account?",
+ "transfer-user-website-to-team": "Seleziona il team a cui trasferire questo sito web.",
+ "transfer-website": "Trasferisci la proprietà del sito web al tuo account o a un altro team.",
+ "triggered-event": "Evento attivato",
+ "unauthorized": "Non autorizzato",
+ "user-deleted": "Utente eliminato.",
+ "viewed-page": "Pagina visualizzata",
+ "visitor-log": "Utenti da {country} tramite {browser} su {os} {device} "
+ }
}
diff --git a/public/intl/messages/ja-JP.json b/public/intl/messages/ja-JP.json
index abb2c27c3..bcf304f8e 100644
--- a/public/intl/messages/ja-JP.json
+++ b/public/intl/messages/ja-JP.json
@@ -1,1858 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "アクセスコード"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "アクション"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "アクティビティログ"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "追加"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "説明を追加"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "メンバーの追加"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "ステップを追加"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Webサイトの追加"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "管理者"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "直後"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "すべて"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "すべての時間帯"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "アナリティクス"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "平均"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "戻る"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "直前"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "直帰率"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "故障"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "ブラウザ"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "ブラウザ"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "キャンセル"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "パスワードの変更"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "都市"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "都市"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "すべてクリア"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "比較"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "確認"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "パスワード(確認)"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "コンテンツ"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "続ける"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "回数"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "国名"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "国"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "作成"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "レポートの作成"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "チームの作成"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "ユーザーの作成"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "作成されました"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "作成者"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "現在"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "現在のパスワード"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "範囲指定"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "ダッシュボード"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "データ"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "日付"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "期間"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "日"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "デフォルトの期間"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "削除"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "レポートの削除"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "チームの削除"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "ユーザーの削除"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Webサイトの削除"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "説明"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "デスクトップ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "詳細情報"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "デバイス"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "デバイス"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "却下"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "を含まない"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "ドメイン"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "切り捨て"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "編集"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "ダッシュボードの編集"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "メンバーの編集"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "共有URLを有効にする"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "最終ステップ"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "訪問時のURL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "イベント"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "イベントデータ"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "イベント"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "退出時のURL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "偽"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "フィールド"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "フィールド"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "フィルター"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "結合"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "RAW"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "フィルター"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "初回ログイン"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "ファネル"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "ユーザーのコンバージョン率と離脱率を分析します。"
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "目標"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "目標"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "ページビューとイベントの目標を追跡します。"
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "超過"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "以上"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "ホスト"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "ホスト"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "インサイト"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "セグメントとフィルタを使用して、データをさらに詳しく分析します。"
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "に等しい"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "に等しくない"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "未設定"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "設定済み"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "参加"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "チームに参加"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "ジャーニー"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "ユーザーがWebサイト内をどのように移動するかを把握します。"
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "言語"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "言語"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "ノートPC"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "過去"
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "日間"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "過去"
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "時間"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "過去"
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "月間"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "最終ログイン"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "離脱"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "チームを離脱"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "未満"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "以下"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "ログイン"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "ログアウト"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "管理"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "管理者"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "最大"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "メンバー"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "メンバー"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "最小"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "携帯電話"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "もっと見る"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "マイアカウント"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "マイWebサイト"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "名前"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "新しいパスワード"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "なし"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "概要"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "所有者"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "ページ "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": "/"
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "閲覧数"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "ページタイトル"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "ページ"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "パスワード"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "パス"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "パス"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "以前"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "前期"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "前年"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "プロフィール"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "プロパティ"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "プロパティ"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "クエリ"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "クエリ"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "クエリパラメーター"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "リアルタイム"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "リファラー"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "リファラー"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "更新"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "再生成"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "地域"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "地域"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "削除"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "メンバーの削除"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "レポート"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "必須"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "リセット"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Webサイトをリセットする"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "リテンション"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "ユーザーの再訪問回数を記録して、Webサイトのリテンション率を計測します。"
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "レベニュー"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "時間あたりの売上高を確認します。"
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "レベニュープロパティ"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "ロール"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "クエリ実行"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "保存"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "画面サイズ"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "検索"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "選択"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "日付を選択"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "ロールを選択"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Webサイトを選択"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "セッション"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "セッション"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "設定"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "共有URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "一日"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "最初のステップ"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "ステップ"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "合計"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "タブレット"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "チーム"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "チームID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "チーム管理者"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "チームメンバー"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "チーム名"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "チームオーナー"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "チーム表示のみ"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "チームのWebサイト"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "チーム"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "テーマ"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "今月"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "今週"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "今年"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "タイムゾーン"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "タイトル"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "今日"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "グラフを切り替える"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "累計"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "総記録数"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "トラッキングコード"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "トランザクション"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "移管"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Webサイトの移管"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "真"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "種別"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "ユニーク"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "ユニーク訪問者数"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "ユニーク顧客数"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "不明"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "無題"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "更新"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "ユーザー"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "ユーザープロパティ"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "ユーザー名"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "ユーザー"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "UTMパラメーターを使用してキャンペーンを追跡します。"
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "値"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "表示"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "詳細を表示"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "表示のみ"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "表示"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "訪問あたりの閲覧数"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "平均滞在時間"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "訪問者"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "訪問数"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Webサイト"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "WebサイトID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Webサイト"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "ウィンドウ"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "昨日"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "承認する場合は、下のフォームに「"
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": "」と入力してください。"
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "アクティブな訪問者"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "アクティブな訪問者"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "収集されたデータ"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "を削除してもよろしいですか?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "から離脱してもよろしいですか?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "を削除してもよろしいですか?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "をリセットしてもよろしいですか?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "チームを削除すると、そのチームが管理しているWebサイトもすべて削除されます。"
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Webサイトのデータがすべて削除されます。"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "未知のエラーが発生しました。"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "url"
- },
- {
- "type": 0,
- "value": "の"
- },
- {
- "type": 1,
- "value": "event"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "設定に移動する"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "ユーザー名またはパスワードが間違っています。"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "無効なドメインです。http/httpsを含めないでください。"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "最小文字数は"
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": "文字です"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Umamiの新しいバージョン"
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "が利用可能です!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "データがありません。"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "イベントデータがありません。"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "パスワードが一致しません。"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "結果が見つかりません。"
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "このチームにはWebサイトがありません。"
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "チームを作成していません。"
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "ユーザーが存在しません。"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Webサイトが設定されていません。"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "ページが見つかりません"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "このWebサイトをリセットするには、下のフォームに「"
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": "」と入力してください。"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "このWebサイトの統計情報はすべて削除されますが、設定はそのまま残ります。"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "保存されました。"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "あなたのWebサイトの統計情報は次のURLで公開されています:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "あなたはすでにチームのメンバーです。"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "チームが見つかりません。"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Webサイトはチーム内の誰でも見ることができます。"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "このWebサイトの統計情報を追跡するには、HTMLの"
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": "セクションに以下のコードを記述します。"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "このWebサイトをあなたのアカウントに移管しますか?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "このWebサイトを移管するチームを選択してください。"
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Webサイトの所有権を自分のアカウントまたは別のチームへ移管します。"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "トリガーされたイベント"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "ユーザーが削除されました。"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "閲覧されたページ"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": "("
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": ")で"
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": "を使用している"
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": "からの訪問者"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "訪問者の離脱率"
- }
- ]
+ "label": {
+ "access-code": "アクセスコード",
+ "account": "アカウント",
+ "action": "アクション",
+ "actions": "アクション",
+ "activity": "アクティビティログ",
+ "add": "追加",
+ "add-board": "ボードを追加",
+ "add-description": "説明を追加",
+ "add-link": "リンクを追加",
+ "add-member": "メンバーの追加",
+ "add-pixel": "ピクセルを追加",
+ "add-step": "ステップを追加",
+ "add-website": "Webサイトの追加",
+ "admin": "管理者",
+ "affiliate": "アフィリエイト",
+ "after": "直後",
+ "all": "すべて",
+ "all-time": "すべての時間帯",
+ "analysis": "分析",
+ "analytics": "アナリティクス",
+ "aov": "AOV",
+ "application": "アプリケーション",
+ "apply": "適用",
+ "arpu": "ARPU",
+ "attribution": "アトリビューション",
+ "attribution-description": "ユーザーがあなたのマーケティングにどのように関与し、何がコンバージョンを促進するかを確認します。",
+ "audience": "オーディエンス",
+ "average": "平均",
+ "back": "戻る",
+ "before": "直前",
+ "behavior": "行動",
+ "block-selector": "ブロックセレクター",
+ "boards": "ボード",
+ "bounce-rate": "直帰率",
+ "breakdown": "内訳",
+ "browser": "ブラウザ",
+ "browsers": "ブラウザ",
+ "campaign": "キャンペーン",
+ "campaigns": "キャンペーン",
+ "cancel": "キャンセル",
+ "change-password": "パスワードの変更",
+ "channel": "チャネル",
+ "channels": "チャンネル",
+ "chart": "チャート",
+ "cities": "都市",
+ "city": "都市",
+ "clear-all": "すべてクリア",
+ "cls": "CLS",
+ "cohort": "コホート",
+ "cohorts": "コホート",
+ "compare": "比較",
+ "compare-dates": "日付を比較",
+ "confirm": "確認",
+ "confirm-password": "パスワード(確認)",
+ "contains": "コンテンツ",
+ "content": "コンテンツ",
+ "continue": "続ける",
+ "conversion": "コンバージョン",
+ "conversion-rate": "コンバージョン率",
+ "conversion-step": "コンバージョンステップ",
+ "count": "回数",
+ "countries": "国名",
+ "country": "国",
+ "create": "作成",
+ "create-report": "レポートの作成",
+ "create-team": "チームの作成",
+ "create-user": "ユーザーの作成",
+ "created": "作成されました",
+ "created-by": "作成者",
+ "criteria": "条件",
+ "currency": "通貨",
+ "current": "現在",
+ "current-password": "現在のパスワード",
+ "custom-range": "範囲指定",
+ "dashboard": "ダッシュボード",
+ "data": "データ",
+ "date": "日付",
+ "date-range": "期間",
+ "day": "日",
+ "default-date-range": "デフォルトの期間",
+ "delete": "削除",
+ "delete-report": "レポートの削除",
+ "delete-team": "チームの削除",
+ "delete-user": "ユーザーの削除",
+ "delete-website": "Webサイトの削除",
+ "description": "説明",
+ "desktop": "デスクトップ",
+ "destination-url": "遷移先URL",
+ "details": "詳細情報",
+ "device": "デバイス",
+ "devices": "デバイス",
+ "direct": "ダイレクト",
+ "dismiss": "却下",
+ "distinct-id": "識別ID",
+ "documentation": "ドキュメント",
+ "does-not-contain": "を含まない",
+ "does-not-include": "含まない",
+ "doest-not-exist": "存在しない",
+ "domain": "ドメイン",
+ "download": "ダウンロード",
+ "dropoff": "切り捨て",
+ "duration": "継続時間",
+ "edit": "編集",
+ "edit-member": "メンバーの編集",
+ "email": "メール",
+ "enable-share-url": "共有URLを有効にする",
+ "end-step": "最終ステップ",
+ "entry": "訪問時のURL",
+ "environment": "環境",
+ "event": "イベント",
+ "event-data": "イベントデータ",
+ "event-name": "イベント名",
+ "events": "イベント",
+ "exclude-bounce": "直帰を除外",
+ "exists": "存在する",
+ "exit": "退出時のURL",
+ "false": "偽",
+ "fcp": "FCP",
+ "field": "フィールド",
+ "fields": "フィールド",
+ "filter": "フィルター",
+ "filter-combined": "結合",
+ "filter-raw": "RAW",
+ "filters": "フィルター",
+ "first-click": "最初のクリック",
+ "first-seen": "初回ログイン",
+ "funnel": "ファネル",
+ "funnel-description": "ユーザーのコンバージョン率と離脱率を分析します。",
+ "funnels": "ファネル",
+ "goal": "目標",
+ "goals": "目標",
+ "goals-description": "ページビューとイベントの目標を追跡します。",
+ "good": "良好",
+ "greater-than": "超過",
+ "greater-than-equals": "以上",
+ "grouped": "グループ化",
+ "growth": "成長",
+ "hostname": "ホスト名",
+ "hour": "時間",
+ "includes": "含む",
+ "inp": "INP",
+ "insight": "インサイト",
+ "insights": "インサイト",
+ "insights-description": "セグメントとフィルタを使用して、データをさらに詳しく分析します。",
+ "invalid-url": "無効なURL",
+ "is": "に等しい",
+ "is-false": "偽である",
+ "is-not": "に等しくない",
+ "is-not-set": "未設定",
+ "is-set": "設定済み",
+ "is-true": "真である",
+ "join": "参加",
+ "join-team": "チームに参加",
+ "journey": "ジャーニー",
+ "journey-description": "ユーザーがWebサイト内をどのように移動するかを把握します。",
+ "journeys": "ジャーニー",
+ "language": "言語",
+ "languages": "言語",
+ "laptop": "ノートPC",
+ "last-click": "最後のクリック",
+ "last-days": "過去{x}日間",
+ "last-hours": "過去{x}時間",
+ "last-months": "過去{x}月間",
+ "last-seen": "最終ログイン",
+ "lcp": "LCP",
+ "leave": "離脱",
+ "leave-team": "チームを離脱",
+ "less-than": "未満",
+ "less-than-equals": "以下",
+ "link": "リンク",
+ "links": "リンク",
+ "location": "場所",
+ "login": "ログイン",
+ "logout": "ログアウト",
+ "manage": "管理",
+ "manager": "管理者",
+ "mask-level": "マスクレベル",
+ "match": "一致",
+ "match-all": "すべて",
+ "match-any": "いずれか",
+ "max": "最大",
+ "max-duration": "最大継続時間",
+ "maximize": "展開",
+ "medium": "メディア",
+ "member": "メンバー",
+ "members": "メンバー",
+ "min": "最小",
+ "minute": "分",
+ "mobile": "携帯電話",
+ "model": "モデル",
+ "month": "月",
+ "more": "もっと見る",
+ "my-account": "マイアカウント",
+ "my-websites": "マイWebサイト",
+ "name": "名前",
+ "needs-improvement": "改善が必要",
+ "new-password": "新しいパスワード",
+ "none": "なし",
+ "number-of-records": "{x} {x, plural, one {件} other {件}}",
+ "ok": "OK",
+ "online": "オンライン",
+ "organic-search": "オーガニック検索",
+ "organic-shopping": "オーガニックショッピング",
+ "organic-social": "オーガニックソーシャル",
+ "organic-video": "オーガニックビデオ",
+ "os": "OS",
+ "other": "その他",
+ "overview": "概要",
+ "owner": "所有者",
+ "page": "ページ",
+ "page-of": "ページ {current}/{total}",
+ "page-views": "閲覧数",
+ "pages": "ページ",
+ "pageTitle": "ページタイトル",
+ "paid-ads": "有料広告",
+ "paid-search": "有料検索",
+ "paid-shopping": "有料ショッピング",
+ "paid-social": "有料ソーシャル",
+ "paid-video": "有料ビデオ",
+ "password": "パスワード",
+ "path": "パス",
+ "paths": "パス",
+ "performance": "パフォーマンス",
+ "pixel": "ピクセル",
+ "pixels": "ピクセル",
+ "play": "再生",
+ "poor": "不良",
+ "powered-by": "{name} 提供",
+ "preferences": "環境設定",
+ "previous": "以前",
+ "previous-period": "前期",
+ "previous-year": "前年",
+ "profile": "プロフィール",
+ "profiles": "プロフィール",
+ "properties": "プロパティ",
+ "property": "プロパティ",
+ "queries": "クエリ",
+ "query": "クエリ",
+ "query-parameters": "クエリパラメーター",
+ "realtime": "リアルタイム",
+ "recorded": "記録日時",
+ "referral": "リファラル",
+ "referrer": "リファラー",
+ "referrers": "リファラー",
+ "refresh": "更新",
+ "regenerate": "再生成",
+ "regex-match": "正規表現に一致",
+ "regex-not-match": "正規表現に一致しない",
+ "region": "地域",
+ "regions": "地域",
+ "remaining": "残り",
+ "remove": "削除",
+ "remove-member": "メンバーの削除",
+ "replay": "リプレイ",
+ "replay-enabled": "リプレイを有効化",
+ "replay-id": "Replay ID",
+ "replays": "リプレイ",
+ "reports": "レポート",
+ "required": "必須",
+ "reset": "リセット",
+ "reset-website": "Webサイトをリセットする",
+ "retention": "リテンション",
+ "retention-days": "保存期間",
+ "retention-description": "ユーザーの再訪問回数を記録して、Webサイトのリテンション率を計測します。",
+ "revenue": "レベニュー",
+ "revenue-description": "時間あたりの売上高を確認します。",
+ "role": "ロール",
+ "run-query": "クエリ実行",
+ "sample-rate": "サンプリングレート",
+ "sample-size": "サンプルサイズ",
+ "save": "保存",
+ "save-cohort": "コホートを保存",
+ "save-segment": "セグメントを保存",
+ "screen": "スクリーン",
+ "screens": "画面サイズ",
+ "search": "検索",
+ "segment": "セグメント",
+ "segments": "セグメント",
+ "select": "選択",
+ "select-component": "コンポーネントを選択",
+ "select-date": "日付を選択",
+ "select-filter": "フィルターを選択",
+ "select-role": "ロールを選択",
+ "select-website": "Webサイトを選択",
+ "session": "セッション",
+ "session-data": "セッションデータ",
+ "sessions": "セッション",
+ "settings": "設定",
+ "share": "共有",
+ "share-url": "共有URL",
+ "single-day": "一日",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "ソース",
+ "sources": "ソース",
+ "start-step": "最初のステップ",
+ "steps": "ステップ",
+ "sum": "合計",
+ "support": "サポート",
+ "switch-account": "アカウントを切り替え",
+ "table": "テーブル",
+ "tablet": "タブレット",
+ "tag": "タグ",
+ "tags": "タグ",
+ "team": "チーム",
+ "team-id": "チームID",
+ "team-manager": "チーム管理者",
+ "team-member": "チームメンバー",
+ "team-name": "チーム名",
+ "team-owner": "チームオーナー",
+ "team-settings": "チーム設定",
+ "team-view-only": "チーム表示のみ",
+ "team-websites": "チームのWebサイト",
+ "teams": "チーム",
+ "term": "検索語句",
+ "terms": "利用規約",
+ "theme": "テーマ",
+ "this-month": "今月",
+ "this-week": "今週",
+ "this-year": "今年",
+ "timezone": "タイムゾーン",
+ "title": "タイトル",
+ "today": "今日",
+ "toggle-charts": "グラフを切り替える",
+ "total": "累計",
+ "total-records": "総記録数",
+ "tracking-code": "トラッキングコード",
+ "traffic": "トラフィック",
+ "transactions": "トランザクション",
+ "transfer": "移管",
+ "transfer-website": "Webサイトの移管",
+ "true": "真",
+ "ttfb": "TTFB",
+ "type": "種別",
+ "unique": "ユニーク",
+ "unique-events": "ユニークイベント",
+ "unique-visitors": "ユニーク訪問者数",
+ "uniqueCustomers": "ユニーク顧客数",
+ "unknown": "不明",
+ "untitled": "無題",
+ "update": "更新",
+ "url": "URL",
+ "user": "ユーザー",
+ "username": "ユーザー名",
+ "users": "ユーザー",
+ "utm": "UTM",
+ "utm-campaign": "UTM キャンペーン",
+ "utm-content": "UTM コンテンツ",
+ "utm-description": "UTMパラメーターを使用してキャンペーンを追跡します。",
+ "utm-medium": "UTM メディア",
+ "utm-source": "UTM ソース",
+ "utm-term": "UTM ターム",
+ "value": "値",
+ "version": "バージョン",
+ "view": "表示",
+ "view-details": "詳細を表示",
+ "view-only": "表示のみ",
+ "views": "表示",
+ "views-per-visit": "訪問あたりの閲覧数",
+ "visit-duration": "平均滞在時間",
+ "visitors": "訪問者",
+ "visits": "訪問数",
+ "website": "Webサイト",
+ "website-id": "WebサイトID",
+ "websites": "Webサイト",
+ "window": "ウィンドウ",
+ "yesterday": "昨日"
+ },
+ "message": {
+ "action-confirmation": "承認する場合は、下のフォームに「{confirmation}」と入力してください。",
+ "active-users": "{x} {x, plural, one {アクティブな訪問者} other {アクティブな訪問者}}",
+ "bad-request": "不正なリクエスト",
+ "collected-data": "収集されたデータ",
+ "confirm-delete": "{target}を削除してもよろしいですか?",
+ "confirm-leave": "{target} から離脱してもよろしいですか?",
+ "confirm-remove": "{target} を削除してもよろしいですか?",
+ "confirm-reset": "{target}をリセットしてもよろしいですか?",
+ "delete-team-warning": "チームを削除すると、そのチームが管理しているWebサイトもすべて削除されます。",
+ "delete-website-warning": "Webサイトのデータがすべて削除されます。",
+ "empty-dashboard": "ダッシュボードは空です。編集をクリックして最初のコンポーネントを追加してください。",
+ "error": "未知のエラーが発生しました。",
+ "event-log": "{url} の{event} ",
+ "forbidden": "アクセス禁止",
+ "go-to-settings": "設定に移動する",
+ "incorrect-username-password": "ユーザー名またはパスワードが間違っています。",
+ "invalid-domain": "無効なドメインです。http/httpsを含めないでください。",
+ "min-password-length": "最小文字数は{n}文字です",
+ "new-version-available": "Umamiの新しいバージョン{version}が利用可能です!",
+ "no-data-available": "データがありません。",
+ "no-event-data": "イベントデータがありません。",
+ "no-match-password": "パスワードが一致しません。",
+ "no-results-found": "結果が見つかりません。",
+ "no-team-websites": "このチームにはWebサイトがありません。",
+ "no-teams": "チームを作成していません。",
+ "no-users": "ユーザーが存在しません。",
+ "no-websites-configured": "Webサイトが設定されていません。",
+ "not-found": "見つかりません",
+ "nothing-selected": "何も選択されていません。",
+ "page-not-found": "ページが見つかりません",
+ "reset-website": "このWebサイトをリセットするには、下のフォームに「{confirmation}」と入力してください。",
+ "reset-website-warning": "このWebサイトの統計情報はすべて削除されますが、設定はそのまま残ります。",
+ "saved": "保存されました。",
+ "select-component-preview": "プレビューするコンポーネントを選択してください",
+ "select-website-first": "最初にウェブサイトを選択してください",
+ "sever-error": "サーバーエラー",
+ "share-url": "あなたのWebサイトの統計情報は次のURLで公開されています:",
+ "team-already-member": "あなたはすでにチームのメンバーです。",
+ "team-not-found": "チームが見つかりません。",
+ "team-websites-info": "Webサイトはチーム内の誰でも見ることができます。",
+ "tracking-code": "このWebサイトの統計情報を追跡するには、HTMLの...セクションに以下のコードを記述します。",
+ "transfer-team-website-to-user": "このWebサイトをあなたのアカウントに移管しますか?",
+ "transfer-user-website-to-team": "このWebサイトを移管するチームを選択してください。",
+ "transfer-website": "Webサイトの所有権を自分のアカウントまたは別のチームへ移管します。",
+ "triggered-event": "トリガーされたイベント",
+ "unauthorized": "認証が必要です",
+ "user-deleted": "ユーザーが削除されました。",
+ "viewed-page": "閲覧されたページ",
+ "visitor-log": "{os} ({device} )で{browser} を使用している{country} からの訪問者"
+ }
}
diff --git a/public/intl/messages/km-KH.json b/public/intl/messages/km-KH.json
index ca8a40a93..9fb936623 100644
--- a/public/intl/messages/km-KH.json
+++ b/public/intl/messages/km-KH.json
@@ -1,1850 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "សកម្មភាព"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "កំណត់ហេតុសកម្មភាព"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "បង្កើតបន្ថែម"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "បន្ថែមពិពណ៌នា"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "បន្ថែមសមាជិក"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "បន្ថែមជំហាន"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "បន្ថែមគេហទំព័រ"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "អ្នកគ្រប់គ្រង"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "បន្ទាប់"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "ទាំងអស់"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "គ្រប់ពេល"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "ជាមធ្យម"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "ថយក្រោយ"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "មុន"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "ចំនួនវិលត្រឡប់"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "កម្មវិធី"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "បោះបង់"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "ផ្លាស់ប្តូរពាក្យសម្ងាត់"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "ទីក្រុង"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "ទីក្រុង"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "លុបទាំងអស់"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "ប្រៀបធៀប"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "បញ្ជាក់"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "បញ្ជាក់ពាក្យសម្ងាត់"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "មាន"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "បន្ត"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "ចំនួន"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "ប្រទេស"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "ប្រទេស"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "បង្កើត"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "បង្កើតរបាយការណ៍"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "បង្កើតក្រុម"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "បង្កើតអ្នកប្រើប្រាស់"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "បង្កើតនៅ"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "បង្កើតដោយ"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "បច្ចុប្បន្ន"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "ពាក្យសម្ងាត់បច្ចុប្បន្ន"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "កំណត់ដោយខ្លួនឯង"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "ផ្ទាំងគ្រប់គ្រង"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "ទិន្នន័យ"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "កាលបរិច្ឆេទ"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "ចន្លោះកាលបរិច្ឆេទ"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "ថ្ងៃ"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "ចន្លោះកាលបរិច្ឆេទដើម"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "លុប"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "លុបរបាយការណ៍"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "លុបក្រុម"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "លុបអ្នកប្រើប្រាស់"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "លុបគេហទំព័រ"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "ការពិពណ៌នា"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "កុំព្យូទ័រលើតុ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "ព័ត៌មានលម្អិត"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "ឧបករណ៍"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "ឧបករណ៍"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "រំសាយ"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "មិនមាន"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "កែប្រែ"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "កែផ្ទាំងគ្រប់គ្រង"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "កែព័ត៌មានសមាជិក"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "បើកការចែករំលែក URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "បញ្ចប់ជំហាន"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL ចូល"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "ព្រឹត្តិការណ៍"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "ទិន្នន័យព្រឹត្តិការណ៍"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "ព្រឹត្តិការណ៍"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL ចេញ"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "មិនពិត"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "ចម្រោះ"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "រួមបញ្ចូលគ្នា"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "ដើម"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "ចម្រោះ"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "គោលដៅ"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "គោលដៅ"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "តាមដានគោលដៅរបស់អ្នកសម្រាប់ pageviews និង events។"
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "ធំជាង"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "ធំជាងឬស្មើ"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "គឺ"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "មិនមែន"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "មិនបានកំណត់"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "បានកំណត់"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "ចូលរួម"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "ចូលក្រុម"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "ដំណើរ"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "ស្វែងយល់ពីការប្រើប្រាស់គេហទំព័ររបស់អតិថិជនអ្នក។"
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "ភាសា"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "ភាសា"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "កុំព្យូទ័រយួរដៃ"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ថ្ងៃចុងក្រោយ"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ម៉ោងចុងក្រោយ"
- }
- ],
- "label.last-months": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ខែចុងក្រោយ"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "ចាកចេញ"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "ចេញពីក្រុម"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "តិចជាង"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "តិចជាង ឬស្មើ"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Login"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logout"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "គ្រប់គ្រង"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "អ្នកគ្រប់គ្រង"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "សមាជិក"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "សមាជិក"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "ទូរស័ព្ទចល័ត"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "បន្ថែម"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "គណនីរបស់ខ្ញុំ"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "គេហទំព័ររបស់ខ្ញុំ"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "ឈ្មោះ"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "ពាក្យសម្ងាត់ថ្មី"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "មិនមាន"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "ទិដ្ឋភាពរួម"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "ម្ចាស់"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "ទំព័រទី "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " នៃ "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "អ្នកមើលទំព័រ"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "ចំណងជើងទំព័រ"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "ទំព័រ"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "ពាក្យសម្ងាត់"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "ដំណើរការដោយ "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "មុន"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "មួយរយៈពេលមុន"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "ឆ្នាំមុន"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "គណនី"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "ប៉ារ៉ាម៉ែត្រ Query"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "ឥលូវនេះ"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "អ្នកណែនាំ"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "អ្នកណែនាំ"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "ផ្ទុកឡើងវិញ"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "តំបន់"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "តំបន់"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "លុប"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "លុបសមាជិកក្រុម"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "របាយការណ៍"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "ទាមទារ"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "កែសម្រួល"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "កំណត់ស្ថិតិឡើងវិញ"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "ការរក្សាទុក"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "មុខងារ"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "រក្សាទុក"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "ប្រភេទឧបករណ៍"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "ស្វែងរក"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "ជ្រើសរើស"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "ជ្រើសរើសកាលបរិច្ឆេទ"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "ជ្រើសរើសមុខងារ"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "ជ្រើសរើសគេហទំព័រ"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "ការកំណត់"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "ចែករំលែក URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "ថ្ងៃតែមួយ"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "ជំហានចាប់ផ្តើម"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "ជំហាន"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "ថេប្លេត"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "ក្រុម"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID ក្រុម"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "អ្នកគ្រប់គ្រងក្រុម"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "សមាជិកក្រុម"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "ឈ្មោះក្រុម"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "ម្ចាស់ក្រុម"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "គេហទំព័ររបស់ក្រុម"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "ក្រុម"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "រូបរាង"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "ខែនេះ"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "សប្តាហ៍នេះ"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "ឆ្នាំនេះ"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "តំបន់ម៉ោង"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "ចំណងជើង"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "ថ្ងៃនេះ"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "បិទ/បើកតារាង"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "សរុប"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "កំណត់ត្រាសរុប"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "លេខកូដតាមដាន"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "ការផ្ទេរ"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "ការផ្ទេរគេហទំព័រ"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "ពិត"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "អ្នកចូលមើលម្នាក់ៗ"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "មិនស្គាល់"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "គ្មានចំណងជើង"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "អ្នកប្រើប្រាស់"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "ឈ្មោះអ្នកប្រើប្រាស់"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "អ្នកប្រើប្រាស់"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "តាមដានយុទ្ធនាការរបស់អ្នកតាមរយៈប៉ារ៉ាម៉ែត្រ UTM។"
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "មើលព័ត៌មានលម្អិត"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "បានតែមើលប៉ុណ្ណោះ"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "អ្នកចូលមើល"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "រយៈពេលទស្សនា"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "អ្នកទស្សនា"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "ទស្សនា"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "គេហទំព័រ"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID គេហទំព័រ"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "គេហទំព័រ"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "ម្សិលមិញ"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "សសេរ "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។"
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "មានអ្នកមើល "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " នាក់ ឥលូវនេះ"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "ទិន្នន័យដែលបានប្រមូលទុក"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "តើអ្នកប្រាកដថាចង់លុប "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ទេ?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "តើអ្នកប្រាកដថាចង់ចាកចេញ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ទេ?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "តើអ្នកប្រាកដថាចង់លុប "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ទេ?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "តើអ្នកប្រាកដថាចង់កំណត់ស្ថិតិរបស់ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ឡើងវិញទេ?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "ពេលលុបក្រុម គេហទំព័ររបស់ក្រុមក៏នឹងត្រូវលប់ចោលទាំងអស់ផងដែរ។"
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "ទិន្នន័យរបស់គេហទំព័រទាំងអស់នឹងត្រូវលុបចោល។"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "មានអ្វីមួយមិនប្រក្រតី។"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "ការកំណត់"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "ឈ្មោះអ្នកប្រើឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domain មិនត្រឹមត្រូវ"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "តិចបំផុតដែលមានអក្សរ "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " តួអក្សរ"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Version ថ្មីនៃ Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " អាចប្រើប្រាស់បានហើយ!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "មិនមានទិន្នន័យ។"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "មិនមានទិន្នន័យព្រឹត្តិការណ៍ទេ។"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "ពាក្យសម្ងាត់មិនត្រូវគ្នាទេ។"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "មិនមានលទ្ធផល។"
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "ក្រុមនេះមិនមានគេហទំព័រទេ។"
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "អ្នកមិនទាន់បានបង្កើតក្រុមណាមួយទេ។"
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "មិនមានអ្នកប្រើប្រាស់ទេ។"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "អ្នកមិនទាន់បានដាក់គេហទំព័រណាមួយចូលទេ។"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "រកមិនឃើញទំព័រ។"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "ដើម្បីកែគេហទំព័រនេះឡើងវិញ សូមសរសេរ "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "ស្ថិតិទាំងអស់សម្រាប់គេហទំព័រនេះនឹងត្រូវបានលុប ប៉ុន្តែកូដតាមដានរបស់អ្នកនឹងនៅដដែល។"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "រក្សាទុកដោយជោគជ័យ។"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "នេះគឺជា URL ដែលអាចចែករំលែកជាសាធារណៈបានសម្រាប់ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "។"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "អ្នកគឺជាសមាជិកនៃក្រុមរួចហើយ។"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "រកក្រុមមិនឃើញទេ។"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "គេហទំព័រនេះអាចមើលបានតែសមាជិកក្រុមតែប៉ុណ្ណោះ"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "ដើម្បីតាមដានស្ថិតិសម្រាប់គេហទំព័រអ្នក សូមដាក់កូដខាងក្រោមទៅក្នុងផ្នែក "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " នៃ HTML របស់អ្នក។"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "ផ្ទេរគេហទំព័រនេះទៅគណនីរបស់អ្នក។?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "ជ្រើសក្រុមដែរត្រូវផ្ទេរគេហទំព័រនេះទៅ។"
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "ផ្ទេរកម្មសិទ្ធិគេហទំព័រទៅគណនីរបស់អ្នក ឬក្រុមផ្សេងទៀត។"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "អ្នកប្រើប្រាស់ត្រូវបានលុបចោល។"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "ទំព័រដែលបានមើល"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "អ្នកមើលពីប្រទេស "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " ប្រើប្រាស់កម្មវិធី "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " លើឧបករណ៍ "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "ចំនួនអ្នកទស្សនាធ្លាក់ចុះ"
- }
- ]
+ "label": {
+ "access-code": "កូដចូលប្រើ",
+ "account": "គណនី",
+ "action": "សកម្មភាព",
+ "actions": "សកម្មភាព",
+ "activity": "កំណត់ហេតុសកម្មភាព",
+ "add": "បង្កើតបន្ថែម",
+ "add-board": "បន្ថែមក្តារ",
+ "add-description": "បន្ថែមពិពណ៌នា",
+ "add-link": "បន្ថែមតំណ",
+ "add-member": "បន្ថែមសមាជិក",
+ "add-pixel": "បន្ថែមភីកសែល",
+ "add-step": "បន្ថែមជំហាន",
+ "add-website": "បន្ថែមគេហទំព័រ",
+ "admin": "អ្នកគ្រប់គ្រង",
+ "affiliate": "ដៃគូ",
+ "after": "បន្ទាប់",
+ "all": "ទាំងអស់",
+ "all-time": "គ្រប់ពេល",
+ "analysis": "ការវិភាគ",
+ "analytics": "វិភាគ",
+ "aov": "AOV",
+ "application": "កម្មវិធី",
+ "apply": "អនុវត្ត",
+ "arpu": "ARPU",
+ "attribution": "ការបញ្ជាក់",
+ "attribution-description": "មើលថាប្រើប្រាស់របស់អ្នកធ្វើអ្វីជាមួយទីផ្សាររបស់អ្នក និងអ្វីជាហេតុបណ្តាលឲ្យមានការបម្លែង។",
+ "audience": "ទស្សនិកជន",
+ "average": "ជាមធ្យម",
+ "back": "ថយក្រោយ",
+ "before": "មុន",
+ "behavior": "អាកប្បកិរិយា",
+ "block-selector": "ឧបករណ៍ជ្រើសរើសប្លុក",
+ "boards": "ក្តារ",
+ "bounce-rate": "ចំនួនវិលត្រឡប់",
+ "breakdown": "បំបែកលម្អិត",
+ "browser": "កម្មវិធីរុករក",
+ "browsers": "កម្មវិធី",
+ "campaign": "យុទ្ធនាការ",
+ "campaigns": "យុទ្ធនាការ",
+ "cancel": "បោះបង់",
+ "change-password": "ផ្លាស់ប្តូរពាក្យសម្ងាត់",
+ "channel": "ឆានែល",
+ "channels": "ឆានែល",
+ "chart": "តារាង",
+ "cities": "ទីក្រុង",
+ "city": "ទីក្រុង",
+ "clear-all": "លុបចេញទាំងអស់",
+ "cls": "CLS",
+ "cohort": "ក្រុម",
+ "cohorts": "ក្រុមកូហ៊ត",
+ "compare": "ប្រៀបធៀប",
+ "compare-dates": "ប្រៀបធៀបទិន្នន័យថ្ងៃខែ",
+ "confirm": "បញ្ជាក់",
+ "confirm-password": "បញ្ជាក់ពាក្យសម្ងាត់",
+ "contains": "មាន",
+ "content": "មាតិកា",
+ "continue": "បន្ត",
+ "conversion": "ការបម្លែង",
+ "conversion-rate": "អត្រាបម្លែង",
+ "conversion-step": "ជំហានបម្លែង",
+ "count": "ចំនួន",
+ "countries": "ប្រទេស",
+ "country": "ប្រទេស",
+ "create": "បង្កើត",
+ "create-report": "បង្កើតរបាយការណ៍",
+ "create-team": "បង្កើតក្រុម",
+ "create-user": "បង្កើតអ្នកប្រើប្រាស់",
+ "created": "បង្កើតនៅ",
+ "created-by": "បង្កើតដោយ",
+ "criteria": "លក្ខណវិនិច្ឆ័យ",
+ "currency": "រូបិយប័ណ្ណ",
+ "current": "បច្ចុប្បន្ន",
+ "current-password": "ពាក្យសម្ងាត់បច្ចុប្បន្ន",
+ "custom-range": "កំណត់ដោយខ្លួនឯង",
+ "dashboard": "ផ្ទាំងគ្រប់គ្រង",
+ "data": "ទិន្នន័យ",
+ "date": "កាលបរិច្ឆេទ",
+ "date-range": "ចន្លោះកាលបរិច្ឆេទ",
+ "day": "ថ្ងៃ",
+ "default-date-range": "ចន្លោះកាលបរិច្ឆេទដើម",
+ "delete": "លុប",
+ "delete-report": "លុបរបាយការណ៍",
+ "delete-team": "លុបក្រុម",
+ "delete-user": "លុបអ្នកប្រើប្រាស់",
+ "delete-website": "លុបគេហទំព័រ",
+ "description": "ការពិពណ៌នា",
+ "desktop": "កុំព្យូទ័រលើតុ",
+ "destination-url": "URL គោលដៅ",
+ "details": "ព័ត៌មានលម្អិត",
+ "device": "ឧបករណ៍",
+ "devices": "ឧបករណ៍",
+ "direct": "ផ្ទាល់",
+ "dismiss": "រំសាយ",
+ "distinct-id": "លេខសម្គាល់ពិសេស",
+ "documentation": "ឯកសារ",
+ "does-not-contain": "មិនមាន",
+ "does-not-include": "មិនរួមបញ្ចូល",
+ "doest-not-exist": "មិនមានទេ",
+ "domain": "ដូមែន",
+ "download": "ទាញយក",
+ "dropoff": "ការចាកចេញ",
+ "duration": "រយៈពេល",
+ "edit": "កែប្រែ",
+ "edit-member": "កែព័ត៌មានសមាជិក",
+ "email": "អ៊ីមែល",
+ "enable-share-url": "បើកការចែករំលែក URL",
+ "end-step": "បញ្ចប់ជំហាន",
+ "entry": "URL ចូល",
+ "environment": "បរិស្ថាន",
+ "event": "ព្រឹត្តិការណ៍",
+ "event-data": "ទិន្នន័យព្រឹត្តិការណ៍",
+ "event-name": "ឈ្មោះព្រឹត្តិការណ៍",
+ "events": "ព្រឹត្តិការណ៍",
+ "exclude-bounce": "មិនរាប់បញ្ចូលការលោតចេញ",
+ "exists": "មាន",
+ "exit": "URL ចេញ",
+ "false": "មិនពិត",
+ "fcp": "FCP",
+ "field": "វាល",
+ "fields": "វាល",
+ "filter": "ចម្រោះ",
+ "filter-combined": "រួមបញ្ចូលគ្នា",
+ "filter-raw": "ដើម",
+ "filters": "ចម្រោះ",
+ "first-click": "ចុចដំបូង",
+ "first-seen": "ឃើញដំបូង",
+ "funnel": "ផ្លូវបង្ហាញ",
+ "funnel-description": "យល់ពីអត្រាបំលែងនិងការចាកចេញរបស់អ្នកប្រើ។",
+ "funnels": "ផ្លូវបង្ហាញ",
+ "goal": "គោលដៅ",
+ "goals": "គោលដៅ",
+ "goals-description": "តាមដានគោលដៅរបស់អ្នកសម្រាប់ pageviews និង events។",
+ "good": "ល្អ",
+ "greater-than": "ធំជាង",
+ "greater-than-equals": "ធំជាងឬស្មើ",
+ "grouped": "បានដាក់ជាក្រុម",
+ "growth": "កំណើន",
+ "hostname": "ឈ្មោះម៉ាស៊ីន",
+ "hour": "ម៉ោង",
+ "includes": "រួមបញ្ចូល",
+ "inp": "INP",
+ "insight": "ការយល់ដឹង",
+ "insights": "ការយល់ដឹង",
+ "insights-description": "ស្វែងរកឱ្យកាន់តែស៊ីជម្រៅក្នុងទិន្នន័យរបស់អ្នកដោយប្រើផ្នែកនិងតម្រង។",
+ "invalid-url": "URL មិនត្រឹមត្រូវ",
+ "is": "គឺ",
+ "is-false": "មិនពិត",
+ "is-not": "មិនមែន",
+ "is-not-set": "មិនបានកំណត់",
+ "is-set": "បានកំណត់",
+ "is-true": "ពិត",
+ "join": "ចូលរួម",
+ "join-team": "ចូលក្រុម",
+ "journey": "ដំណើរ",
+ "journey-description": "ស្វែងយល់ពីការប្រើប្រាស់គេហទំព័ររបស់អតិថិជនអ្នក។",
+ "journeys": "ដំណើរ",
+ "language": "ភាសា",
+ "languages": "ភាសា",
+ "laptop": "កុំព្យូទ័រយួរដៃ",
+ "last-click": "ចុចចុងក្រោយ",
+ "last-days": "{x} ថ្ងៃចុងក្រោយ",
+ "last-hours": "{x} ម៉ោងចុងក្រោយ",
+ "last-months": "{x} ខែចុងក្រោយ",
+ "last-seen": "ឃើញចុងក្រោយ",
+ "lcp": "LCP",
+ "leave": "ចាកចេញ",
+ "leave-team": "ចេញពីក្រុម",
+ "less-than": "តិចជាង",
+ "less-than-equals": "តិចជាង ឬស្មើ",
+ "link": "តំណ",
+ "links": "តំណភ្ជាប់",
+ "location": "ទីតាំង",
+ "login": "ចូល",
+ "logout": "ចេញ",
+ "manage": "គ្រប់គ្រង",
+ "manager": "អ្នកគ្រប់គ្រង",
+ "mask-level": "កម្រិតម៉ាស",
+ "match": "ត្រូវគ្នា",
+ "match-all": "ទាំងអស់",
+ "match-any": "ណាមួយ",
+ "max": "អតិបរមា",
+ "max-duration": "រយៈពេលអតិបរមា",
+ "maximize": "ពង្រីក",
+ "medium": "មធ្យម",
+ "member": "សមាជិក",
+ "members": "សមាជិក",
+ "min": "អប្បបរមា",
+ "minute": "នាទី",
+ "mobile": "ទូរស័ព្ទចល័ត",
+ "model": "ម៉ូដែល",
+ "month": "ខែ",
+ "more": "បន្ថែម",
+ "my-account": "គណនីរបស់ខ្ញុំ",
+ "my-websites": "គេហទំព័ររបស់ខ្ញុំ",
+ "name": "ឈ្មោះ",
+ "needs-improvement": "ត្រូវការកែប្រែ",
+ "new-password": "ពាក្យសម្ងាត់ថ្មី",
+ "none": "គ្មាន",
+ "number-of-records": "{x} {x, plural, one {កំណត់ត្រា} other {កំណត់ត្រា}}",
+ "ok": "យល់ព្រម",
+ "online": "អនឡាញ",
+ "organic-search": "ស្វែងរកធម្មជាតិ",
+ "organic-shopping": "ការទិញធម្មជាតិ",
+ "organic-social": "សង្គមធម្មជាតិ",
+ "organic-video": "វីដេអូធម្មជាតិ",
+ "os": "ប្រព័ន្ធប្រតិបត្តិការ",
+ "other": "ផ្សេងទៀត",
+ "overview": "ទិដ្ឋភាពរួម",
+ "owner": "ម្ចាស់",
+ "page": "ទំព័រ",
+ "page-of": "ទំព័រទី {current} នៃ {total}",
+ "page-views": "អ្នកមើលទំព័រ",
+ "pages": "ទំព័រ",
+ "pageTitle": "ចំណងជើងទំព័រ",
+ "paid-ads": "ផ្សាយពាណិជ្ជកម្មបង់ប្រាក់",
+ "paid-search": "ស្វែងរកបង់ប្រាក់",
+ "paid-shopping": "ទិញបង់ប្រាក់",
+ "paid-social": "សង្គមបង់ប្រាក់",
+ "paid-video": "វីដេអូបង់ប្រាក់",
+ "password": "ពាក្យសម្ងាត់",
+ "path": "ផ្លូវ",
+ "paths": "ផ្លូវ",
+ "performance": "ប្រសិទ្ធភាព",
+ "pixel": "ភីកសែល",
+ "pixels": "ភីកសែល",
+ "play": "លេង",
+ "poor": "ខ្សោយ",
+ "powered-by": "ដំណើរការដោយ {name}",
+ "preferences": "ចំណង់ចំណូលចិត្ត",
+ "previous": "មុន",
+ "previous-period": "មួយរយៈពេលមុន",
+ "previous-year": "ឆ្នាំមុន",
+ "profile": "គណនី",
+ "profiles": "ប្រវត្តិរូប",
+ "properties": "លក្ខណៈពិសេស",
+ "property": "លក្ខណៈពិសេស",
+ "queries": "សំណួរ",
+ "query": "សំណួរ",
+ "query-parameters": "ប៉ារ៉ាម៉ែត្រ Query",
+ "realtime": "ឥលូវនេះ",
+ "recorded": "ថតនៅ",
+ "referral": "ការបញ្ជូន",
+ "referrer": "អ្នកណែនាំ",
+ "referrers": "អ្នកណែនាំ",
+ "refresh": "ផ្ទុកឡើងវិញ",
+ "regenerate": "បង្កើតឡើងវិញ",
+ "regex-match": "ត្រូវនឹងកន្សោមធម្មតា",
+ "regex-not-match": "មិនត្រូវនឹងកន្សោមធម្មតា",
+ "region": "តំបន់",
+ "regions": "តំបន់",
+ "remaining": "នៅសល់",
+ "remove": "លុប",
+ "remove-member": "លុបសមាជិកក្រុម",
+ "replay": "ចាក់ឡើងវិញ",
+ "replay-enabled": "បើកការចាក់ឡើងវិញ",
+ "replay-id": "Replay ID",
+ "replays": "ការចាក់ឡើងវិញ",
+ "reports": "របាយការណ៍",
+ "required": "ទាមទារ",
+ "reset": "កែសម្រួល",
+ "reset-website": "ដើម្បីកែគេហទំព័រនេះឡើងវិញ សូមសរសេរ {confirmation} នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។",
+ "retention": "ការរក្សាទុក",
+ "retention-days": "ថ្ងៃរក្សាទុក",
+ "retention-description": "វាស់ស្ទង់ភាពស្អិតនៃគេហទំព័រដោយតាមដានថាអ្នកប្រើត្រលប់មកវិញញឹកញាប់ប៉ុណ្ណា។",
+ "revenue": "ចំណូល",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "មុខងារ",
+ "run-query": "ដំណើរការសំណួរ",
+ "sample-rate": "អត្រាគំរូ",
+ "sample-size": "ទំហំគំរូ",
+ "save": "រក្សាទុក",
+ "save-cohort": "រក្សាទុកក្រុមកូហ៊ត",
+ "save-segment": "រក្សាទុកផ្នែក",
+ "screen": "អេក្រង់",
+ "screens": "ប្រភេទឧបករណ៍",
+ "search": "ស្វែងរក",
+ "segment": "ផ្នែក",
+ "segments": "ផ្នែក",
+ "select": "ជ្រើសរើស",
+ "select-component": "ជ្រើសរើសធាតុ",
+ "select-date": "ជ្រើសរើសកាលបរិច្ឆេទ",
+ "select-filter": "ជ្រើសរើសតម្រង",
+ "select-role": "ជ្រើសរើសមុខងារ",
+ "select-website": "ជ្រើសរើសគេហទំព័រ",
+ "session": "វគ្គ",
+ "session-data": "ទិន្នន័យសម័យ",
+ "sessions": "វគ្គ",
+ "settings": "ការកំណត់",
+ "share": "ចែករំលែក",
+ "share-url": "ចែករំលែក URL",
+ "single-day": "ថ្ងៃតែមួយ",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "ប្រភព",
+ "sources": "ប្រភព",
+ "start-step": "ជំហានចាប់ផ្តើម",
+ "steps": "ជំហាន",
+ "sum": "ផលបូក",
+ "support": "ជំនួយ",
+ "switch-account": "ប្ដូរគណនី",
+ "table": "តារាង",
+ "tablet": "ថេប្លេត",
+ "tag": "ស្លាក",
+ "tags": "ស្លាក",
+ "team": "ក្រុម",
+ "team-id": "ID ក្រុម",
+ "team-manager": "អ្នកគ្រប់គ្រងក្រុម",
+ "team-member": "សមាជិកក្រុម",
+ "team-name": "ឈ្មោះក្រុម",
+ "team-owner": "ម្ចាស់ក្រុម",
+ "team-settings": "ការកំណត់ក្រុម",
+ "team-view-only": "មើលក្រុមតែប៉ុណ្ណោះ",
+ "team-websites": "គេហទំព័ររបស់ក្រុម",
+ "teams": "ក្រុម",
+ "term": "ពាក្យស្វែងរក",
+ "terms": "លក្ខខណ្ឌ",
+ "theme": "រូបរាង",
+ "this-month": "ខែនេះ",
+ "this-week": "សប្តាហ៍នេះ",
+ "this-year": "ឆ្នាំនេះ",
+ "timezone": "តំបន់ម៉ោង",
+ "title": "ចំណងជើង",
+ "today": "ថ្ងៃនេះ",
+ "toggle-charts": "បិទ/បើកតារាង",
+ "total": "សរុប",
+ "total-records": "កំណត់ត្រាសរុប",
+ "tracking-code": "លេខកូដតាមដាន",
+ "traffic": "ចរាចរណ៍",
+ "transactions": "ប្រតិបត្តិការ",
+ "transfer": "ការផ្ទេរ",
+ "transfer-website": "ការផ្ទេរគេហទំព័រ",
+ "true": "ពិត",
+ "ttfb": "TTFB",
+ "type": "ប្រភេទ",
+ "unique": "តែមួយ",
+ "unique-events": "ព្រឹត្តិការណ៍តែមួយ",
+ "unique-visitors": "អ្នកចូលមើលម្នាក់ៗ",
+ "uniqueCustomers": "អតិថិជនតែមួយ",
+ "unknown": "មិនស្គាល់",
+ "untitled": "គ្មានចំណងជើង",
+ "update": "ធ្វើបច្ចុប្បន្នភាព",
+ "url": "URL",
+ "user": "អ្នកប្រើប្រាស់",
+ "username": "ឈ្មោះអ្នកប្រើប្រាស់",
+ "users": "អ្នកប្រើប្រាស់",
+ "utm": "UTM",
+ "utm-campaign": "UTM យុទ្ធនាការ",
+ "utm-content": "UTM មាតិកា",
+ "utm-description": "តាមដានយុទ្ធនាការរបស់អ្នកតាមរយៈប៉ារ៉ាម៉ែត្រ UTM។",
+ "utm-medium": "UTM មធ្យម",
+ "utm-source": "UTM ប្រភព",
+ "utm-term": "UTM ពាក្យ",
+ "value": "តម្លៃ",
+ "version": "កំណែ",
+ "view": "មើល",
+ "view-details": "មើលព័ត៌មានលម្អិត",
+ "view-only": "បានតែមើលប៉ុណ្ណោះ",
+ "views": "អ្នកចូលមើល",
+ "views-per-visit": "ការមើលក្នុងមួយដង",
+ "visit-duration": "រយៈពេលទស្សនា",
+ "visitors": "អ្នកទស្សនា",
+ "visits": "ទស្សនា",
+ "website": "គេហទំព័រ",
+ "website-id": "ID គេហទំព័រ",
+ "websites": "គេហទំព័រ",
+ "window": "បង្អួច",
+ "yesterday": "ម្សិលមិញ"
+ },
+ "message": {
+ "action-confirmation": "សសេរ {confirmation} នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។",
+ "active-users": "មានអ្នកមើល {x} នាក់ ឥលូវនេះ",
+ "bad-request": "សំណើមិនត្រឹមត្រូវ",
+ "collected-data": "ទិន្នន័យដែលបានប្រមូលទុក",
+ "confirm-delete": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?",
+ "confirm-leave": "តើអ្នកប្រាកដថាចង់ចាកចេញ {target} ទេ?",
+ "confirm-remove": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?",
+ "confirm-reset": "តើអ្នកប្រាកដថាចង់កំណត់ស្ថិតិរបស់ {target} ឡើងវិញទេ?",
+ "delete-team-warning": "ពេលលុបក្រុម គេហទំព័ររបស់ក្រុមក៏នឹងត្រូវលប់ចោលទាំងអស់ផងដែរ។",
+ "delete-website-warning": "ទិន្នន័យរបស់គេហទំព័រទាំងអស់នឹងត្រូវលុបចោល។",
+ "empty-dashboard": "ផ្ទាំងគ្រប់គ្រងរបស់អ្នកទទេ។ ចុចកែសម្រួលដើម្បីបន្ថែមធាតុដំបូងរបស់អ្នក។",
+ "error": "មានអ្វីមួយមិនប្រក្រតី។",
+ "event-log": "{event} នៅ {url} ",
+ "forbidden": "ហាមឃាត់",
+ "go-to-settings": "ការកំណត់",
+ "incorrect-username-password": "ឈ្មោះអ្នកប្រើឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។",
+ "invalid-domain": "Domain មិនត្រឹមត្រូវ",
+ "min-password-length": "តិចបំផុតដែលមានអក្សរ {n} តួអក្សរ",
+ "new-version-available": "Version ថ្មីនៃ Umami {version} អាចប្រើប្រាស់បានហើយ!",
+ "no-data-available": "មិនមានទិន្នន័យ។",
+ "no-event-data": "មិនមានទិន្នន័យព្រឹត្តិការណ៍ទេ។",
+ "no-match-password": "ពាក្យសម្ងាត់មិនត្រូវគ្នាទេ។",
+ "no-results-found": "មិនមានលទ្ធផល។",
+ "no-team-websites": "ក្រុមនេះមិនមានគេហទំព័រទេ។",
+ "no-teams": "អ្នកមិនទាន់បានបង្កើតក្រុមណាមួយទេ។",
+ "no-users": "មិនមានអ្នកប្រើប្រាស់ទេ។",
+ "no-websites-configured": "អ្នកមិនទាន់បានដាក់គេហទំព័រណាមួយចូលទេ។",
+ "not-found": "រកមិនឃើញ",
+ "nothing-selected": "មិនបានជ្រើសអ្វីទេ។",
+ "page-not-found": "រកមិនឃើញទំព័រ។",
+ "reset-website": "ដើម្បីកែគេហទំព័រនេះឡើងវិញ សូមសរសេរ {confirmation} នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។",
+ "reset-website-warning": "ស្ថិតិទាំងអស់សម្រាប់គេហទំព័រនេះនឹងត្រូវបានលុប ប៉ុន្តែកូដតាមដានរបស់អ្នកនឹងនៅដដែល។",
+ "saved": "រក្សាទុកដោយជោគជ័យ។",
+ "select-component-preview": "ជ្រើសរើសធាតុមួយដើម្បីមើលជាមុន",
+ "select-website-first": "ជ្រើសរើសគេហទំព័រជាមុន",
+ "sever-error": "កំហុសម៉ាស៊ីនមេ",
+ "share-url": "នេះគឺជា URL ដែលអាចចែករំលែកជាសាធារណៈបានសម្រាប់ {target}។",
+ "team-already-member": "អ្នកគឺជាសមាជិកនៃក្រុមរួចហើយ។",
+ "team-not-found": "រកក្រុមមិនឃើញទេ។",
+ "team-websites-info": "គេហទំព័រនេះអាចមើលបានតែសមាជិកក្រុមតែប៉ុណ្ណោះ",
+ "tracking-code": "ដើម្បីតាមដានស្ថិតិសម្រាប់គេហទំព័រអ្នក សូមដាក់កូដខាងក្រោមទៅក្នុងផ្នែក ... នៃ HTML របស់អ្នក។",
+ "transfer-team-website-to-user": "ផ្ទេរគេហទំព័រនេះទៅគណនីរបស់អ្នក។?",
+ "transfer-user-website-to-team": "ជ្រើសក្រុមដែរត្រូវផ្ទេរគេហទំព័រនេះទៅ។",
+ "transfer-website": "ផ្ទេរកម្មសិទ្ធិគេហទំព័រទៅគណនីរបស់អ្នក ឬក្រុមផ្សេងទៀត។",
+ "triggered-event": "ព្រឹត្តិការណ៍ដែលបានដំណើរការ",
+ "unauthorized": "មិនមានសិទ្ធិ",
+ "user-deleted": "អ្នកប្រើប្រាស់ត្រូវបានលុបចោល។",
+ "viewed-page": "ទំព័រដែលបានមើល",
+ "visitor-log": "អ្នកមើលពីប្រទេស {country} ប្រើប្រាស់កម្មវិធី {browser} លើឧបករណ៍ {os} {device} "
+ }
}
diff --git a/public/intl/messages/ko-KR.json b/public/intl/messages/ko-KR.json
index 6fa360c15..579b9b625 100644
--- a/public/intl/messages/ko-KR.json
+++ b/public/intl/messages/ko-KR.json
@@ -1,1814 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "액세스 코드"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "동작"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "활동"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "추가"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "설명 추가"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "멤버 추가"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "단계 추가"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "웹사이트 추가"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "관리자"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "이후"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "전체"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "전체 시간"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "분석"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "평균"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "뒤로"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "이전"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "이탈률"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "세부 사항"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "브라우저"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "브라우저"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "취소"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "비밀번호 변경"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "도시"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "도시"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "모두 지우기"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "비교"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "확인"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "비밀번호 확인"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "포함"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "계속"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "수"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "국가"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "국가"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "만들기"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "보고서 만들기"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "팀 만들기"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "사용자 만들기"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "생성됨"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "작성자"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "현재"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "현재 비밀번호"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "범위 지정"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "대시보드"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "데이터"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "날짜"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "날짜 범위"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "일"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "기본 날짜 범위"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "삭제"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "보고서 삭제"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "팀 삭제"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "사용자 삭제"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "웹사이트 삭제"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "설명"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "데스크톱"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "세부 정보"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "기기"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "기기"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "무시하기"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "포함하지 않음"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "도메인"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "이탈"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "편집"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "대시보드 편집"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "멤버 편집"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "URL 공유 활성화"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "마지막 단계"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "입장 URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "이벤트"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "이벤트 데이터"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "이벤트"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "퇴장 URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "거짓"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "필드"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "필드"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "필터"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "합쳐 보기"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "전체 보기"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "필터"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "첫 접속"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "퍼널"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "사용자 전환율 및 이탈률을 살펴보세요."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "목표"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "목표"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "페이지 조회 및 이벤트 목표를 추적합니다."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "이상"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "이상"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "호스트"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "호스트"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "인사이트"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "세그먼트 및 필터를 사용하여 데이터를 더 자세히 살펴보세요."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "해당"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "해당하지 않음"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "설정되지 않음"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "설정됨"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "가입하기"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "팀 가입하기"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "여정"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "사용자가 웹사이트를 탐색하는 경로를 살펴보세요."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "언어"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "언어"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "노트북"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "지난 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "일"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "지난 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "시간"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "지난 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "개월"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "마지막 접속"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "떠나기"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "팀 떠나기"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "미만"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "이하"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "로그인"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "로그아웃"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "관리"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "관리자"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "최대"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "멤버"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "멤버"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "최소"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "모바일"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "더 보기"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "내 계정"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "내 웹사이트"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "이름"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "새 비밀번호"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "없음"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "개 레코드"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "확인"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "운영 체제"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "개요"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "소유자"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "페이지 "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": "/"
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "페이지 조회"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "페이지 제목"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "페이지"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "비밀번호"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "패스"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "패스"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "이전"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "이전 기간"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "이전 연도"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "프로필"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "속성"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "속성"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "쿼리"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "쿼리"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "쿼리 매개 변수"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "실시간"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "리퍼러"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "리퍼러"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "새로 고침"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "다시 생성"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "지역"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "지역"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "제거"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "멤버 제거"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "보고서"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "필수"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "초기화"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "웹사이트 초기화"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "리텐션"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "사용자가 얼마나 자주 돌아오는지를 추적하여 웹사이트의 리텐션을 측정하세요."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "수익"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "시간대별 수익을 살펴보세요."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "수익 속성"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "역할"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "쿼리 실행"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "저장"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "화면"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "검색"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "선택"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "날짜 선택"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "역할 선택"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "웹사이트 선택"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "세션"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "세션"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "설정"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "공유 URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "하루"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "시작 단계"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "단계"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "합계"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "태블릿"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "팀"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "팀 ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "팀 관리자"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "팀 멤버"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "팀 이름"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "팀 소유자"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "팀 보기 전용"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "팀 웹사이트"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "팀"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "테마"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "이번 달"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "이번 주"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "올해"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "표준 시간대"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "제목"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "오늘"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "차트 전환"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "합계"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "전체 레코드"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "추적 코드"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "거래"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "전송"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "웹사이트 전송"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "참"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "유형"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "고유"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "고유 방문자"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "고유 고객"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "알 수 없음"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "제목 없음"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "업데이트"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "사용자"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "사용자 속성"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "사용자 이름"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "사용자"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "UTM 매개변수를 통해 캠페인을 추적하세요."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "값"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "보기"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "자세히 보기"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "보기 전용"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "조회"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "방문당 조회"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "방문 시간"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "방문자"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "방문"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "웹사이트"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "웹사이트 ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "웹사이트"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "창"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "어제"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "확인을 위해 아래 상자에 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": "을(를) 입력하세요."
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "현재 방문자 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": "명"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "수집된 데이터"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "을(를) 삭제하시겠습니까?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "을(를) 떠나시겠습니까?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "을(를) 제거하시겠습니까?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "을(를) 초기화하시겠습니까?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "관련된 모든 데이터가 삭제됩니다."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "문제가 발생했습니다."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " - "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "설정으로 이동"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "사용자 이름 또는 비밀번호를 잘못 입력했습니다."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "잘못된 도메인입니다. http/https를 포함하지 마세요."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "최소 "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": "자여야 합니다"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Umami의 새 버전 "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "을(를) 사용할 수 있습니다!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "사용할 수 있는 데이터가 없습니다."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "사용할 수 있는 이벤트 데이터가 없습니다."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "비밀번호가 일치하지 않습니다."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "결과를 찾을 수 없습니다."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "팀에 웹사이트가 없습니다."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "만든 팀이 없습니다."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "사용자가 없습니다."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "설정된 웹사이트가 없습니다."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "페이지를 찾을 수 없음"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "이 웹사이트를 초기화하려면 아래 상자에 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": "을(를) 입력하세요."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "이 웹사이트의 모든 통계가 삭제되지만 설정은 그대로 유지됩니다."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "저장했습니다."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "아래 링크를 통해 웹사이트의 통계를 누구나 볼 수 있습니다."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "이미 팀 멤버입니다."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "팀을 찾을 수 없습니다."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "웹사이트는 팀 멤버 누구나 볼 수 있습니다."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "이 웹사이트의 통계를 추적하려면 다음 코드를 HTML의 "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " 부분에 추가하세요."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "이 웹사이트를 당신의 계정으로 전송하시겠습니까?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "이 웹사이트를 전송받을 팀을 선택하세요."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "웹사이트 소유권을 계정이나 다른 팀으로 전송합니다."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "트리거된 이벤트"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "사용자를 삭제했습니다."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "조회한 페이지"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": "에서 "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": "을(를) 사용하는 "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": "의 방문자"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "방문자 이탈함"
- }
- ]
+ "label": {
+ "access-code": "액세스 코드",
+ "account": "계정",
+ "action": "작업",
+ "actions": "동작",
+ "activity": "활동",
+ "add": "추가",
+ "add-board": "보드 추가",
+ "add-description": "설명 추가",
+ "add-link": "링크 추가",
+ "add-member": "멤버 추가",
+ "add-pixel": "픽셀 추가",
+ "add-step": "단계 추가",
+ "add-website": "웹사이트 추가",
+ "admin": "관리자",
+ "affiliate": "제휴사",
+ "after": "이후",
+ "all": "전체",
+ "all-time": "전체 시간",
+ "analysis": "분석",
+ "analytics": "분석",
+ "aov": "AOV",
+ "application": "애플리케이션",
+ "apply": "적용",
+ "arpu": "ARPU",
+ "attribution": "기여도",
+ "attribution-description": "사용자가 마케팅에 어떻게 반응하고 전환을 유도하는지 확인하세요.",
+ "audience": "잠재고객",
+ "average": "평균",
+ "back": "뒤로",
+ "before": "이전",
+ "behavior": "행동",
+ "block-selector": "블록 선택기",
+ "boards": "보드",
+ "bounce-rate": "이탈률",
+ "breakdown": "세부 사항",
+ "browser": "브라우저",
+ "browsers": "브라우저",
+ "campaign": "캠페인",
+ "campaigns": "캠페인",
+ "cancel": "취소",
+ "change-password": "비밀번호 변경",
+ "channel": "채널",
+ "channels": "채널",
+ "chart": "차트",
+ "cities": "도시",
+ "city": "도시",
+ "clear-all": "모두 지우기",
+ "cls": "CLS",
+ "cohort": "코호트",
+ "cohorts": "코호트",
+ "compare": "비교",
+ "compare-dates": "날짜 비교",
+ "confirm": "확인",
+ "confirm-password": "비밀번호 확인",
+ "contains": "포함",
+ "content": "콘텐츠",
+ "continue": "계속",
+ "conversion": "전환",
+ "conversion-rate": "전환율",
+ "conversion-step": "전환 단계",
+ "count": "수",
+ "countries": "국가",
+ "country": "국가",
+ "create": "만들기",
+ "create-report": "보고서 만들기",
+ "create-team": "팀 만들기",
+ "create-user": "사용자 만들기",
+ "created": "생성됨",
+ "created-by": "작성자",
+ "criteria": "기준",
+ "currency": "통화",
+ "current": "현재",
+ "current-password": "현재 비밀번호",
+ "custom-range": "범위 지정",
+ "dashboard": "대시보드",
+ "data": "데이터",
+ "date": "날짜",
+ "date-range": "날짜 범위",
+ "day": "일",
+ "default-date-range": "기본 날짜 범위",
+ "delete": "삭제",
+ "delete-report": "보고서 삭제",
+ "delete-team": "팀 삭제",
+ "delete-user": "사용자 삭제",
+ "delete-website": "웹사이트 삭제",
+ "description": "설명",
+ "desktop": "데스크톱",
+ "destination-url": "도착 URL",
+ "details": "세부 정보",
+ "device": "기기",
+ "devices": "기기",
+ "direct": "직접",
+ "dismiss": "무시하기",
+ "distinct-id": "고유 ID",
+ "documentation": "문서",
+ "does-not-contain": "포함하지 않음",
+ "does-not-include": "포함하지 않음",
+ "doest-not-exist": "존재하지 않음",
+ "domain": "도메인",
+ "download": "다운로드",
+ "dropoff": "이탈",
+ "duration": "재생 시간",
+ "edit": "편집",
+ "edit-member": "멤버 편집",
+ "email": "이메일",
+ "enable-share-url": "URL 공유 활성화",
+ "end-step": "마지막 단계",
+ "entry": "입장 URL",
+ "environment": "환경",
+ "event": "이벤트",
+ "event-data": "이벤트 데이터",
+ "event-name": "이벤트 이름",
+ "events": "이벤트",
+ "exclude-bounce": "이탈 제외",
+ "exists": "존재함",
+ "exit": "퇴장 URL",
+ "false": "거짓",
+ "fcp": "FCP",
+ "field": "필드",
+ "fields": "필드",
+ "filter": "필터",
+ "filter-combined": "합쳐 보기",
+ "filter-raw": "전체 보기",
+ "filters": "필터",
+ "first-click": "첫 클릭",
+ "first-seen": "첫 접속",
+ "funnel": "퍼널",
+ "funnel-description": "사용자 전환율 및 이탈률을 살펴보세요.",
+ "funnels": "퍼널",
+ "goal": "목표",
+ "goals": "목표",
+ "goals-description": "페이지 조회 및 이벤트 목표를 추적합니다.",
+ "good": "좋음",
+ "greater-than": "이상",
+ "greater-than-equals": "이상",
+ "grouped": "그룹화됨",
+ "growth": "성장",
+ "hostname": "호스트명",
+ "hour": "시간",
+ "includes": "포함",
+ "inp": "INP",
+ "insight": "인사이트",
+ "insights": "인사이트",
+ "insights-description": "세그먼트 및 필터를 사용하여 데이터를 더 자세히 살펴보세요.",
+ "invalid-url": "잘못된 URL",
+ "is": "해당",
+ "is-false": "거짓임",
+ "is-not": "해당하지 않음",
+ "is-not-set": "설정되지 않음",
+ "is-set": "설정됨",
+ "is-true": "참임",
+ "join": "가입하기",
+ "join-team": "팀 가입하기",
+ "journey": "여정",
+ "journey-description": "사용자가 웹사이트를 탐색하는 경로를 살펴보세요.",
+ "journeys": "여정",
+ "language": "언어",
+ "languages": "언어",
+ "laptop": "노트북",
+ "last-click": "마지막 클릭",
+ "last-days": "지난 {x}일",
+ "last-hours": "지난 {x}시간",
+ "last-months": "지난 {x}개월",
+ "last-seen": "마지막 접속",
+ "lcp": "LCP",
+ "leave": "떠나기",
+ "leave-team": "팀 떠나기",
+ "less-than": "미만",
+ "less-than-equals": "이하",
+ "link": "링크",
+ "links": "링크",
+ "location": "위치",
+ "login": "로그인",
+ "logout": "로그아웃",
+ "manage": "관리",
+ "manager": "관리자",
+ "mask-level": "마스크 수준",
+ "match": "일치",
+ "match-all": "전체",
+ "match-any": "일부",
+ "max": "최대",
+ "max-duration": "최대 재생 시간",
+ "maximize": "확장",
+ "medium": "미디엄",
+ "member": "멤버",
+ "members": "멤버",
+ "min": "최소",
+ "minute": "분",
+ "mobile": "모바일",
+ "model": "모델",
+ "month": "월",
+ "more": "더 보기",
+ "my-account": "내 계정",
+ "my-websites": "내 웹사이트",
+ "name": "이름",
+ "needs-improvement": "개선 필요",
+ "new-password": "새 비밀번호",
+ "none": "없음",
+ "number-of-records": "{x}개 레코드",
+ "ok": "확인",
+ "online": "온라인",
+ "organic-search": "자연 검색",
+ "organic-shopping": "자연 쇼핑",
+ "organic-social": "자연 소셜",
+ "organic-video": "자연 비디오",
+ "os": "운영 체제",
+ "other": "기타",
+ "overview": "개요",
+ "owner": "소유자",
+ "page": "페이지",
+ "page-of": "페이지 {current}/{total}",
+ "page-views": "페이지 조회",
+ "pages": "페이지",
+ "pageTitle": "페이지 제목",
+ "paid-ads": "유료 광고",
+ "paid-search": "유료 검색",
+ "paid-shopping": "유료 쇼핑",
+ "paid-social": "유료 소셜",
+ "paid-video": "유료 비디오",
+ "password": "비밀번호",
+ "path": "패스",
+ "paths": "패스",
+ "performance": "성능",
+ "pixel": "픽셀",
+ "pixels": "픽셀",
+ "play": "재생",
+ "poor": "나쁨",
+ "powered-by": "{name} 제공",
+ "preferences": "환경설정",
+ "previous": "이전",
+ "previous-period": "이전 기간",
+ "previous-year": "이전 연도",
+ "profile": "프로필",
+ "profiles": "프로필",
+ "properties": "속성",
+ "property": "속성",
+ "queries": "쿼리",
+ "query": "쿼리",
+ "query-parameters": "쿼리 매개 변수",
+ "realtime": "실시간",
+ "recorded": "기록 시간",
+ "referral": "추천",
+ "referrer": "리퍼러",
+ "referrers": "리퍼러",
+ "refresh": "새로 고침",
+ "regenerate": "다시 생성",
+ "regex-match": "정규식과 일치",
+ "regex-not-match": "정규식과 일치하지 않음",
+ "region": "지역",
+ "regions": "지역",
+ "remaining": "남음",
+ "remove": "제거",
+ "remove-member": "멤버 제거",
+ "replay": "다시보기",
+ "replay-enabled": "다시보기 활성화",
+ "replay-id": "Replay ID",
+ "replays": "다시보기",
+ "reports": "보고서",
+ "required": "필수",
+ "reset": "초기화",
+ "reset-website": "웹사이트 초기화",
+ "retention": "리텐션",
+ "retention-days": "보존 기간",
+ "retention-description": "사용자가 얼마나 자주 돌아오는지를 추적하여 웹사이트의 리텐션을 측정하세요.",
+ "revenue": "수익",
+ "revenue-description": "시간대별 수익을 살펴보세요.",
+ "role": "역할",
+ "run-query": "쿼리 실행",
+ "sample-rate": "샘플링 비율",
+ "sample-size": "샘플 크기",
+ "save": "저장",
+ "save-cohort": "코호트 저장",
+ "save-segment": "세그먼트 저장",
+ "screen": "화면",
+ "screens": "화면",
+ "search": "검색",
+ "segment": "세그먼트",
+ "segments": "세그먼트",
+ "select": "선택",
+ "select-component": "컴포넌트 선택",
+ "select-date": "날짜 선택",
+ "select-filter": "필터 선택",
+ "select-role": "역할 선택",
+ "select-website": "웹사이트 선택",
+ "session": "세션",
+ "session-data": "세션 데이터",
+ "sessions": "세션",
+ "settings": "설정",
+ "share": "공유",
+ "share-url": "공유 URL",
+ "single-day": "하루",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "소스",
+ "sources": "소스",
+ "start-step": "시작 단계",
+ "steps": "단계",
+ "sum": "합계",
+ "support": "지원",
+ "switch-account": "계정 전환",
+ "table": "표",
+ "tablet": "태블릿",
+ "tag": "태그",
+ "tags": "태그",
+ "team": "팀",
+ "team-id": "팀 ID",
+ "team-manager": "팀 관리자",
+ "team-member": "팀 멤버",
+ "team-name": "팀 이름",
+ "team-owner": "팀 소유자",
+ "team-settings": "팀 설정",
+ "team-view-only": "팀 보기 전용",
+ "team-websites": "팀 웹사이트",
+ "teams": "팀",
+ "term": "검색어",
+ "terms": "약관",
+ "theme": "테마",
+ "this-month": "이번 달",
+ "this-week": "이번 주",
+ "this-year": "올해",
+ "timezone": "표준 시간대",
+ "title": "제목",
+ "today": "오늘",
+ "toggle-charts": "차트 전환",
+ "total": "합계",
+ "total-records": "전체 레코드",
+ "tracking-code": "추적 코드",
+ "traffic": "트래픽",
+ "transactions": "거래",
+ "transfer": "전송",
+ "transfer-website": "웹사이트 전송",
+ "true": "참",
+ "ttfb": "TTFB",
+ "type": "유형",
+ "unique": "고유",
+ "unique-events": "고유 이벤트",
+ "unique-visitors": "고유 방문자",
+ "uniqueCustomers": "고유 고객",
+ "unknown": "알 수 없음",
+ "untitled": "제목 없음",
+ "update": "업데이트",
+ "url": "URL",
+ "user": "사용자",
+ "username": "사용자 이름",
+ "users": "사용자",
+ "utm": "UTM",
+ "utm-campaign": "UTM 캠페인",
+ "utm-content": "UTM 콘텐츠",
+ "utm-description": "UTM 매개변수를 통해 캠페인을 추적하세요.",
+ "utm-medium": "UTM 매체",
+ "utm-source": "UTM 소스",
+ "utm-term": "UTM 검색어",
+ "value": "값",
+ "version": "버전",
+ "view": "보기",
+ "view-details": "자세히 보기",
+ "view-only": "보기 전용",
+ "views": "조회",
+ "views-per-visit": "방문당 조회",
+ "visit-duration": "방문 시간",
+ "visitors": "방문자",
+ "visits": "방문",
+ "website": "웹사이트",
+ "website-id": "웹사이트 ID",
+ "websites": "웹사이트",
+ "window": "창",
+ "yesterday": "어제"
+ },
+ "message": {
+ "action-confirmation": "확인을 위해 아래 상자에 {confirmation}을(를) 입력하세요.",
+ "active-users": "현재 방문자 {x}명",
+ "bad-request": "잘못된 요청",
+ "collected-data": "수집된 데이터",
+ "confirm-delete": "{target}을(를) 삭제하시겠습니까?",
+ "confirm-leave": "{target} 을(를) 떠나시겠습니까?",
+ "confirm-remove": "{target} 을(를) 제거하시겠습니까?",
+ "confirm-reset": "{target}을(를) 초기화하시겠습니까?",
+ "delete-team-warning": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다.",
+ "delete-website-warning": "관련된 모든 데이터가 삭제됩니다.",
+ "empty-dashboard": "대시보드가 비어 있습니다. 편집을 클릭하여 첫 번째 구성 요소를 추가하세요.",
+ "error": "문제가 발생했습니다.",
+ "event-log": "{event} - {url} ",
+ "forbidden": "접근 금지",
+ "go-to-settings": "설정으로 이동",
+ "incorrect-username-password": "사용자 이름 또는 비밀번호를 잘못 입력했습니다.",
+ "invalid-domain": "잘못된 도메인입니다. http/https를 포함하지 마세요.",
+ "min-password-length": "최소 {n}자여야 합니다",
+ "new-version-available": "Umami의 새 버전 {version}을(를) 사용할 수 있습니다!",
+ "no-data-available": "사용할 수 있는 데이터가 없습니다.",
+ "no-event-data": "사용할 수 있는 이벤트 데이터가 없습니다.",
+ "no-match-password": "비밀번호가 일치하지 않습니다.",
+ "no-results-found": "결과를 찾을 수 없습니다.",
+ "no-team-websites": "팀에 웹사이트가 없습니다.",
+ "no-teams": "만든 팀이 없습니다.",
+ "no-users": "사용자가 없습니다.",
+ "no-websites-configured": "설정된 웹사이트가 없습니다.",
+ "not-found": "찾을 수 없음",
+ "nothing-selected": "선택된 항목이 없습니다.",
+ "page-not-found": "페이지를 찾을 수 없음",
+ "reset-website": "이 웹사이트를 초기화하려면 아래 상자에 {confirmation}을(를) 입력하세요.",
+ "reset-website-warning": "이 웹사이트의 모든 통계가 삭제되지만 설정은 그대로 유지됩니다.",
+ "saved": "저장했습니다.",
+ "select-component-preview": "미리 볼 컴포넌트를 선택하세요",
+ "select-website-first": "먼저 웹사이트를 선택하세요",
+ "sever-error": "서버 오류",
+ "share-url": "아래 링크를 통해 웹사이트의 통계를 누구나 볼 수 있습니다.",
+ "team-already-member": "이미 팀 멤버입니다.",
+ "team-not-found": "팀을 찾을 수 없습니다.",
+ "team-websites-info": "웹사이트는 팀 멤버 누구나 볼 수 있습니다.",
+ "tracking-code": "이 웹사이트의 통계를 추적하려면 다음 코드를 HTML의 ... 부분에 추가하세요.",
+ "transfer-team-website-to-user": "이 웹사이트를 당신의 계정으로 전송하시겠습니까?",
+ "transfer-user-website-to-team": "이 웹사이트를 전송받을 팀을 선택하세요.",
+ "transfer-website": "웹사이트 소유권을 계정이나 다른 팀으로 전송합니다.",
+ "triggered-event": "트리거된 이벤트",
+ "unauthorized": "인증되지 않음",
+ "user-deleted": "사용자를 삭제했습니다.",
+ "viewed-page": "조회한 페이지",
+ "visitor-log": "{os} {device} 에서 {browser} 을(를) 사용하는 {country} 의 방문자"
+ }
}
diff --git a/public/intl/messages/lt-LT.json b/public/intl/messages/lt-LT.json
index d5eec3c81..9a9a7c92b 100644
--- a/public/intl/messages/lt-LT.json
+++ b/public/intl/messages/lt-LT.json
@@ -1,1993 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Prieigos kodas"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Veiksmai"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Veiklos žurnalas"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Pridėti"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Pridėti aprašymą"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Pridėti narį"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Pridėti svetainę"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Po"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Visi"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Visas laikotarpis"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Vidurkis"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Atgal"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Prieš"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Atmetimo rodiklis"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Naršyklė"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Naršyklės"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Atšaukti"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Pakeisti slaptažodį"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Miestai"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Miestas"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Išvalyti visus"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Patvirtinti"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Patvirtinti slaptažodį"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Šalys"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Šalis"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Sukurti"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Kurti ataskaitą"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Sukurti komandą"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Sukurti vartotoją"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Dabartinis slaptažodis"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Pasirinktinis intervalas"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Švieslentė"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Duomenys"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Laikotarpis"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Diena"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Numatytasis laikotarpis"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Ištrinti"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Ištrinti ataskaitą"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Ištrinti komandą"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Ištrinti vartotoją"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Ištrinti svetainę"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Aprašymas"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalės"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Įrenginys"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Įrenginiai"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Gerai"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domenas"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Redaguoti"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Redaguoti švieslentę"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Redaguoti narį"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Įjungti bendrinimą su nuoroda"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Įvykis"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Įvykių duomenys"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Įvykiai"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Laukelis"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Laukeliai"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtruoti"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinuoti"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Neapdoroti"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtrai"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Įžvalgos"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Pasinerkite giliau į savo duomenis naudodami segmentus ir filtrus."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Prisijungti"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Prisijungti į komandą"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Kalba"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Kalbos"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "offset": 0,
- "options": {
- "=0": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " dienų"
- }
- ]
- },
- "one": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinė diena"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " dienos"
- }
- ]
- },
- "zero": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " dienų"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.last-hours": [
- {
- "offset": 0,
- "options": {
- "=0": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " valandų"
- }
- ]
- },
- "one": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinė "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " valanda"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " valandos"
- }
- ]
- },
- "zero": {
- "value": [
- {
- "type": 0,
- "value": "Paskutinės "
- },
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " valandų"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Išeiti"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Išeiti iš komandos"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Prisijungti"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Atsijungti"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Tvarkyti"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Narys"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Nariai"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobilusis"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Daugiau"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Mano paskyra"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mano svetainės"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Pavadinimas"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Naujas slaptažodis"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Operacinės sistemos"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Apžvalga"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Savininkas"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Puslapis "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " iš "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Puslapių peržiūros"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Puslapio pavadinimas"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Puslapiai"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Slaptažodis"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profilis"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Užklausos"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Užklausa"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Užklausų parametrai"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realiuoju laiku"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Persiuntėjas"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Persiuntėjai"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Atnaujinti"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Regionas"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regionai"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Pašalinti"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Pašalinti narį"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Ataskaitos"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Reikalinga"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Atstatyti"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Atstatyti statistikos duomenis"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rolė"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Išsaugoti"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Ekranai"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Ieškoti"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Pasirinkti laikotarpį"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Pasirinkti rolę"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Pasirinkti svetainę"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesijos"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Nustatymai"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Pasidalinti nuoroda"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Viena diena"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Planšetė"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Komanda"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Komandos ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Komandos narys"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Komandos pavadinimas"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Komandos savininkas"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Komandos"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Spalvų tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Šis mėnuo"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Ši savaitė"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Šie metai"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Laiko zona"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Pavadinimas"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Šiandien"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Rodyti / slėpti grafikus"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Sekimo kodas"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Perleisti"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Perleisti svetainę"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unikalūs lankytojai"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Nežinoma"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Be pavadinimo"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Vartotojas"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Vartotojo vardas"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Vartotojai"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Atidaryti"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Peržiūrėti detaliau"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Tik peržiūrėti"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Peržiūros"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Vidutinė vizito trukmė"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Lankytojai"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Svetainė"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Svetainės ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Svetainės"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Vakar"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Įrašykite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " žemiau, kad patvirtintumėte."
- }
- ],
- "message.active-users": [
- {
- "offset": 0,
- "options": {
- "=0": {
- "value": [
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " aktyvių vartotojų"
- }
- ]
- },
- "one": {
- "value": [
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " aktyvus vartotojas"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " aktyvūs vartotojai"
- }
- ]
- },
- "zero": {
- "value": [
- {
- "type": 7
- },
- {
- "type": 0,
- "value": " aktyvių vartotojų"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Ar esate tikri, jog norite ištrinti svetainę "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Ar esate tikri, jog norite palikti "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Ar esate tikri, jog norite ištrinti "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are esate tikri, jog norite atstatyti svetainės "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " statistikos duomenis?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Ištrinant komandą bus ištrintos ir visos komandos svetainės."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Visi susiję duomenys taip pat bus ištrinti."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Kažkas įvyko ne taip."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Eiti į nustatymus"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Neteisingas vartotojo vardas/slaptažodis."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Klaidingas domenas"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Reikia bent "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " simbolių"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Išleista nauja 'Umami' "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " versija!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nėra jokių duomenų."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Jokių duomenų apie įvykius nėra."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Slaptažodžiai nesutampa"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Jokių rezultatų nerasta."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Ši komanda neturi jokių svetainių."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Jūs nesate sukūrę jokių komandų."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Nėra jokių vartotojų."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Jūs nesate susikonfiguravę jokių svetainių."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Puslapis nerastas."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Kad atstatyti šią svetainę, įrašykite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " žemiau, kad patvirtintumėte."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Visi šios svetainės statistikos duomenys bus ištrinti, bet sekimo kodas išliks nepaliestas."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Sėkmingai išsaugota."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Tai yra viešai prieinama "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " nuoroda (URL)."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Jūs jau esate šios komandos narys."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Komanda nerasta."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Svetaines gali peržiūrėti bet kas iš šios komandos."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Sekimo kodas"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Perduoti šią svetainę į jūsų paskyrą?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Pasirinkite komandą, kuriai norite perduoti šią svetainę."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Perduoti svetainės nuosavybę į savo paskyrą arba kitą komandą."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Vartotojas ištrintas."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Lankytojas iš "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": ", naudojantis "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " sistemoje "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Prieigos kodas",
+ "account": "Paskyra",
+ "action": "Veiksmas",
+ "actions": "Veiksmai",
+ "activity": "Veiklos žurnalas",
+ "add": "Pridėti",
+ "add-board": "Pridėti lentą",
+ "add-description": "Pridėti aprašymą",
+ "add-link": "Pridėti nuorodą",
+ "add-member": "Pridėti narį",
+ "add-pixel": "Pridėti pikselį",
+ "add-step": "Pridėti žingsnį",
+ "add-website": "Pridėti svetainę",
+ "admin": "Administrator",
+ "affiliate": "Partneris",
+ "after": "Po",
+ "all": "Visi",
+ "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",
+ "average": "Vidurkis",
+ "back": "Atgal",
+ "before": "Prieš",
+ "behavior": "Elgsena",
+ "block-selector": "Bloko pasirinkiklis",
+ "boards": "Lentos",
+ "bounce-rate": "Atmetimo rodiklis",
+ "breakdown": "Išskaidymas",
+ "browser": "Naršyklė",
+ "browsers": "Naršyklės",
+ "campaign": "Kampanija",
+ "campaigns": "Kampanijos",
+ "cancel": "Atšaukti",
+ "change-password": "Pakeisti slaptažodį",
+ "channel": "Kanalas",
+ "channels": "Kanalai",
+ "chart": "Diagrama",
+ "cities": "Miestai",
+ "city": "Miestas",
+ "clear-all": "Išvalyti visus",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohortos",
+ "compare": "Palyginti",
+ "compare-dates": "Palyginti datas",
+ "confirm": "Patvirtinti",
+ "confirm-password": "Patvirtinti slaptažodį",
+ "contains": "Turi",
+ "content": "Turinys",
+ "continue": "Tęsti",
+ "conversion": "Konversija",
+ "conversion-rate": "Konversijos rodiklis",
+ "conversion-step": "Konversijos žingsnis",
+ "count": "Skaičius",
+ "countries": "Šalys",
+ "country": "Šalis",
+ "create": "Sukurti",
+ "create-report": "Kurti ataskaitą",
+ "create-team": "Sukurti komandą",
+ "create-user": "Sukurti vartotoją",
+ "created": "Sukurta",
+ "created-by": "Sukūrė",
+ "criteria": "Kriterijai",
+ "currency": "Valiuta",
+ "current": "Dabartinis",
+ "current-password": "Dabartinis slaptažodis",
+ "custom-range": "Pasirinktinis intervalas",
+ "dashboard": "Švieslentė",
+ "data": "Duomenys",
+ "date": "Data",
+ "date-range": "Laikotarpis",
+ "day": "Diena",
+ "default-date-range": "Numatytasis laikotarpis",
+ "delete": "Ištrinti",
+ "delete-report": "Ištrinti ataskaitą",
+ "delete-team": "Ištrinti komandą",
+ "delete-user": "Ištrinti vartotoją",
+ "delete-website": "Ištrinti svetainę",
+ "description": "Aprašymas",
+ "desktop": "Stalinis kompiuteris",
+ "destination-url": "Paskirties URL",
+ "details": "Detalės",
+ "device": "Įrenginys",
+ "devices": "Įrenginiai",
+ "direct": "Tiesioginis",
+ "dismiss": "Gerai",
+ "distinct-id": "Unikalus ID",
+ "documentation": "Dokumentacija",
+ "does-not-contain": "Neturi",
+ "does-not-include": "Neįtraukia",
+ "doest-not-exist": "Neegzistuoja",
+ "domain": "Domenas",
+ "download": "Atsisiųsti",
+ "dropoff": "Atsitraukimas",
+ "duration": "Trukmė",
+ "edit": "Redaguoti",
+ "edit-member": "Redaguoti narį",
+ "email": "El. paštas",
+ "enable-share-url": "Įjungti bendrinimą su nuoroda",
+ "end-step": "Paskutinis žingsnis",
+ "entry": "Įėjimo URL",
+ "environment": "Aplinka",
+ "event": "Įvykis",
+ "event-data": "Įvykių duomenys",
+ "event-name": "Įvykio pavadinimas",
+ "events": "Įvykiai",
+ "exclude-bounce": "Neįtraukti atmetimų",
+ "exists": "Egzistuoja",
+ "exit": "Išėjimo URL",
+ "false": "Netiesa",
+ "fcp": "FCP",
+ "field": "Laukelis",
+ "fields": "Laukeliai",
+ "filter": "Filtruoti",
+ "filter-combined": "Kombinuoti",
+ "filter-raw": "Neapdoroti",
+ "filters": "Filtrai",
+ "first-click": "Pirmas paspaudimas",
+ "first-seen": "Pirmą kartą matyta",
+ "funnel": "Piltuvas",
+ "funnel-description": "Supraskite naudotojų konversijos ir atsitraukimo rodiklius.",
+ "funnels": "Piltuvai",
+ "goal": "Tikslas",
+ "goals": "Tikslai",
+ "goals-description": "Sekite savo tikslus puslapių peržiūroms ir įvykiams.",
+ "good": "Gerai",
+ "greater-than": "Daugiau nei",
+ "greater-than-equals": "Daugiau arba lygu",
+ "grouped": "Grupuota",
+ "growth": "Augimas",
+ "hostname": "Pagrindinis kompiuteris",
+ "hour": "Valanda",
+ "includes": "Įtraukia",
+ "inp": "INP",
+ "insight": "Įžvalga",
+ "insights": "Įžvalgos",
+ "insights-description": "Pasinerkite giliau į savo duomenis naudodami segmentus ir filtrus.",
+ "invalid-url": "Netinkamas URL",
+ "is": "Yra",
+ "is-false": "Yra netiesa",
+ "is-not": "Nėra",
+ "is-not-set": "Nenurodyta",
+ "is-set": "Nustatyta",
+ "is-true": "Yra tiesa",
+ "join": "Prisijungti",
+ "join-team": "Prisijungti į komandą",
+ "journey": "Kelionė",
+ "journey-description": "Sužinokite, kaip naudotojai naršo jūsų svetainėje.",
+ "journeys": "Kelionės",
+ "language": "Kalba",
+ "languages": "Kalbos",
+ "laptop": "Nešiojamas kompiuteris",
+ "last-click": "Paskutinis paspaudimas",
+ "last-days": "{x, plural, =0 {Paskutinės # dienų} zero {Paskutinės # dienų} one {Paskutinė diena} other {Paskutinės # dienos}}",
+ "last-hours": "{x, plural, =0 {Paskutinės # valandų} zero {Paskutinės # valandų} one {Paskutinė # valanda} other {Paskutinės # valandos}}",
+ "last-months": "Paskutiniai {x} mėnesiai",
+ "last-seen": "Paskutinį kartą matyta",
+ "lcp": "LCP",
+ "leave": "Išeiti",
+ "leave-team": "Išeiti iš komandos",
+ "less-than": "Mažiau nei",
+ "less-than-equals": "Mažiau arba lygu",
+ "link": "Nuoroda",
+ "links": "Nuorodos",
+ "location": "Vieta",
+ "login": "Prisijungti",
+ "logout": "Atsijungti",
+ "manage": "Tvarkyti",
+ "manager": "Vadovas",
+ "mask-level": "Maskavimo lygis",
+ "match": "Atitikimas",
+ "match-all": "Visi",
+ "match-any": "Bet kuris",
+ "max": "Maksimumas",
+ "max-duration": "Maksimali trukmė",
+ "maximize": "Išplėsti",
+ "medium": "Vidutinis",
+ "member": "Narys",
+ "members": "Nariai",
+ "min": "Minimumas",
+ "minute": "Minutė",
+ "mobile": "Mobilusis",
+ "model": "Modelis",
+ "month": "Mėnuo",
+ "more": "Daugiau",
+ "my-account": "Mano paskyra",
+ "my-websites": "Mano svetainės",
+ "name": "Pavadinimas",
+ "needs-improvement": "Reikia tobulinti",
+ "new-password": "Naujas slaptažodis",
+ "none": "Nėra",
+ "number-of-records": "{x} {x, plural, one {įrašas} few {įrašai} other {įrašų}}",
+ "ok": "Gerai",
+ "online": "Prisijungęs",
+ "organic-search": "Organinė paieška",
+ "organic-shopping": "Organinis apsipirkimas",
+ "organic-social": "Organinis socialinis",
+ "organic-video": "Organinis vaizdo įrašas",
+ "os": "Operacinės sistemos",
+ "other": "Kita",
+ "overview": "Apžvalga",
+ "owner": "Savininkas",
+ "page": "Puslapis",
+ "page-of": "Puslapis {current} iš {total}",
+ "page-views": "Puslapių peržiūros",
+ "pages": "Puslapiai",
+ "pageTitle": "Puslapio pavadinimas",
+ "paid-ads": "Mokama reklama",
+ "paid-search": "Mokama paieška",
+ "paid-shopping": "Mokamas apsipirkimas",
+ "paid-social": "Mokamas socialinis",
+ "paid-video": "Mokamas vaizdo įrašas",
+ "password": "Slaptažodis",
+ "path": "Kelias",
+ "paths": "Keliai",
+ "performance": "Veikimas",
+ "pixel": "Pikselis",
+ "pixels": "Pikseliai",
+ "play": "Leisti",
+ "poor": "Blogai",
+ "powered-by": "Teikia {name}",
+ "preferences": "Nuostatos",
+ "previous": "Ankstesnis",
+ "previous-period": "Ankstesnis laikotarpis",
+ "previous-year": "Ankstesni metai",
+ "profile": "Profilis",
+ "profiles": "Profiliai",
+ "properties": "Savybės",
+ "property": "Savybė",
+ "queries": "Užklausos",
+ "query": "Užklausa",
+ "query-parameters": "Užklausų parametrai",
+ "realtime": "Realiuoju laiku",
+ "recorded": "Įrašyta",
+ "referral": "Persiuntimas",
+ "referrer": "Persiuntėjas",
+ "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į",
+ "replay": "Pakartojimas",
+ "replay-enabled": "Pakartojimas įjungtas",
+ "replay-id": "Replay ID",
+ "replays": "Pakartojimai",
+ "reports": "Ataskaitos",
+ "required": "Reikalinga",
+ "reset": "Atstatyti",
+ "reset-website": "Atstatyti statistikos duomenis",
+ "retention": "Išlaikymas",
+ "retention-days": "Saugojimo dienos",
+ "retention-description": "Išmatuokite, kaip dažnai naudotojai grįžta į jūsų svetainę.",
+ "revenue": "Pajamos",
+ "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-segment": "Išsaugoti segmentą",
+ "screen": "Ekranas",
+ "screens": "Ekranai",
+ "search": "Ieškoti",
+ "segment": "Segmentas",
+ "segments": "Segmentai",
+ "select": "Pasirinkti",
+ "select-component": "Pasirinkite komponentą",
+ "select-date": "Pasirinkti laikotarpį",
+ "select-filter": "Pasirinkti filtrą",
+ "select-role": "Pasirinkti rolę",
+ "select-website": "Pasirinkti svetainę",
+ "session": "Sesija",
+ "session-data": "Sesijos duomenys",
+ "sessions": "Sesijos",
+ "settings": "Nustatymai",
+ "share": "Dalintis",
+ "share-url": "Pasidalinti nuoroda",
+ "single-day": "Viena diena",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Šaltinis",
+ "sources": "Šaltiniai",
+ "start-step": "Pradžios žingsnis",
+ "steps": "Žingsniai",
+ "sum": "Suma",
+ "support": "Palaikymas",
+ "switch-account": "Perjungti paskyrą",
+ "table": "Lentelė",
+ "tablet": "Planšetė",
+ "tag": "Žyma",
+ "tags": "Žymos",
+ "team": "Komanda",
+ "team-id": "Komandos ID",
+ "team-manager": "Komandos vadovas",
+ "team-member": "Komandos narys",
+ "team-name": "Komandos pavadinimas",
+ "team-owner": "Komandos savininkas",
+ "team-settings": "Komandos nustatymai",
+ "team-view-only": "Tik peržiūra",
+ "team-websites": "Komandos svetainės",
+ "teams": "Komandos",
+ "term": "Paieškos terminas",
+ "terms": "Sąlygos",
+ "theme": "Spalvų tema",
+ "this-month": "Šis mėnuo",
+ "this-week": "Ši savaitė",
+ "this-year": "Šie metai",
+ "timezone": "Laiko zona",
+ "title": "Pavadinimas",
+ "today": "Šiandien",
+ "toggle-charts": "Rodyti / slėpti grafikus",
+ "total": "Iš viso",
+ "total-records": "Iš viso įrašų",
+ "tracking-code": "Sekimo kodas",
+ "traffic": "Srautas",
+ "transactions": "Sandoriai",
+ "transfer": "Perleisti",
+ "transfer-website": "Perleisti svetainę",
+ "true": "Tiesa",
+ "ttfb": "TTFB",
+ "type": "Tipas",
+ "unique": "Unikalūs",
+ "unique-events": "Unikalūs įvykiai",
+ "unique-visitors": "Unikalūs lankytojai",
+ "uniqueCustomers": "Unikalūs klientai",
+ "unknown": "Nežinoma",
+ "untitled": "Be pavadinimo",
+ "update": "Atnaujinti",
+ "url": "URL",
+ "user": "Vartotojas",
+ "username": "Vartotojo vardas",
+ "users": "Vartotojai",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampanija",
+ "utm-content": "UTM turinys",
+ "utm-description": "Stebėkite savo kampanijas per UTM parametrus.",
+ "utm-medium": "UTM kanalas",
+ "utm-source": "UTM šaltinis",
+ "utm-term": "UTM terminas",
+ "value": "Reikšmė",
+ "version": "Versija",
+ "view": "Atidaryti",
+ "view-details": "Peržiūrėti detaliau",
+ "view-only": "Tik peržiūrėti",
+ "views": "Peržiūros",
+ "views-per-visit": "Peržiūros per apsilankymą",
+ "visit-duration": "Vidutinė vizito trukmė",
+ "visitors": "Lankytojai",
+ "visits": "Apsilankymai",
+ "website": "Svetainė",
+ "website-id": "Svetainės ID",
+ "websites": "Svetainės",
+ "window": "Langas",
+ "yesterday": "Vakar"
+ },
+ "message": {
+ "action-confirmation": "Įrašykite {confirmation} žemiau, kad patvirtintumėte.",
+ "active-users": "{x, plural, =0 {# aktyvių vartotojų} zero {# aktyvių vartotojų} one {# aktyvus vartotojas} other {# aktyvūs vartotojai}}",
+ "bad-request": "Netinkama užklausa",
+ "collected-data": "Surinkti duomenys",
+ "confirm-delete": "Ar esate tikri, jog norite ištrinti svetainę {target}?",
+ "confirm-leave": "Ar esate tikri, jog norite palikti {target} ?",
+ "confirm-remove": "Ar esate tikri, jog norite ištrinti {target} ?",
+ "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.",
+ "event-log": "{event} puslapyje {url} ",
+ "forbidden": "Draudžiama",
+ "go-to-settings": "Eiti į nustatymus",
+ "incorrect-username-password": "Neteisingas vartotojo vardas/slaptažodis.",
+ "invalid-domain": "Klaidingas domenas",
+ "min-password-length": "Reikia bent {n} simbolių",
+ "new-version-available": "Išleista nauja 'Umami' {version} versija!",
+ "no-data-available": "Nėra jokių duomenų.",
+ "no-event-data": "Jokių duomenų apie įvykius nėra.",
+ "no-match-password": "Slaptažodžiai nesutampa",
+ "no-results-found": "Jokių rezultatų nerasta.",
+ "no-team-websites": "Ši komanda neturi jokių svetainių.",
+ "no-teams": "Jūs nesate sukūrę jokių komandų.",
+ "no-users": "Nėra jokių vartotojų.",
+ "no-websites-configured": "Jūs nesate susikonfiguravę jokių svetainių.",
+ "not-found": "Nerasta",
+ "nothing-selected": "Nieko nepasirinkta.",
+ "page-not-found": "Puslapis nerastas.",
+ "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-component-preview": "Pasirinkite komponentą peržiūrai",
+ "select-website-first": "Pirmiausia pasirinkite svetainę",
+ "sever-error": "Serverio klaida",
+ "share-url": "Tai yra viešai prieinama {target} nuoroda (URL).",
+ "team-already-member": "Jūs jau esate šios komandos narys.",
+ "team-not-found": "Komanda nerasta.",
+ "team-websites-info": "Svetaines gali peržiūrėti bet kas iš šios komandos.",
+ "tracking-code": "Sekimo kodas",
+ "transfer-team-website-to-user": "Perduoti šią svetainę į jūsų paskyrą?",
+ "transfer-user-website-to-team": "Pasirinkite komandą, kuriai norite perduoti šią svetainę.",
+ "transfer-website": "Perduoti svetainės nuosavybę į savo paskyrą arba kitą komandą.",
+ "triggered-event": "Suaktyvintas įvykis",
+ "unauthorized": "Neautorizuota",
+ "user-deleted": "Vartotojas ištrintas.",
+ "viewed-page": "Peržiūrėtas puslapis",
+ "visitor-log": "Lankytojas iš {country} , naudojantis {browser} sistemoje {os} {device} "
+ }
}
diff --git a/public/intl/messages/mn-MN.json b/public/intl/messages/mn-MN.json
index 85527896f..a9841a278 100644
--- a/public/intl/messages/mn-MN.json
+++ b/public/intl/messages/mn-MN.json
@@ -1,1882 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Хандалтын код"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Үйлдлүүд"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Үйл ажиллагааны бүртгэл"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Нэмэх"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Тайлбар нэмэх"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Гишүүн нэмэх"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Алхам нэмэх"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Веб нэмэх"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Админ"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Хойно"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Бүх"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Бүх цаг үеийн"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Аналитик"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Дундаж"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Буцах"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Өмнө"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Нэг хуудас үзээд гарсан"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Задаргаа"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Хөтөч"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Хөтөч"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Цуцлах"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Нууц үг солих"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Хотууд"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Хот"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Бүгдийг арилгах"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Харьцуулах"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Батлах"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Шинэ нууц үгээ давтах"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Агуулах"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Үргэлжлүүлэх"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Тоо"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Улс"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Улс"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Үүсгэх"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Тайлан үүсгэх"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Баг үүсгэх"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Хэрэглэгч үүсгэх"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Үүсгэсэн"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Үүсгэсэн"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Одоогийн"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Ашиглаж буй нууц үг"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Дурын хугацаа"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Хянах самбар"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Өгөгдөл"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Огноо"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Хугацааны муж"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Өдөр"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Өгөгдмөл хугацааны муж"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Устгах"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Тайлан устгах"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Баг устгах"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Хэрэглэгч устгах"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Веб устгах"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Тайлбар"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Суурин компьютер"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Мэдээлэл"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Төхөөрөмж"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Төхөөрөмж"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Үл хэрэгсэх"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Агуулахгүй"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Домэйн"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Уналт"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Засах"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Хянах самбар засах"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Гишүүн засах"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Хуваалцах холбоос идэвхжүүлэх"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Төгсгөлийн алхам"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Орох зам"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Үйлдэл"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Үйлдлийн өгөгдөл"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Үйлдэл"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Гарах зам"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Худал"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Талбар"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Талбар"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Шүүлтүүр"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Нэгтгэсэн"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Түүхий"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Шүүлтүүр"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Анх харсан"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Цутгал"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Хэрэглэгчдийн шилжилт, уналтын хэмжээг шинжлэх."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Зорилго"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Зорилго"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Их"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Их буюу тэнцүү"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Хост"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Хост"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Шинжлэх"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Өгөгдлөө хэсэгчлэн хуваах, шүүх байдлаар задлан шинжлэх."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Бол"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Биш"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Утга оноогоогүй"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Утга оноосон"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Нэгдэх"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Багт нэгдэх"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Аялал"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Хэл"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Хэл"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Зөөврийн компьютер"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Сүүлийн "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " хоног"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Сүүлийн "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " цаг"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Сүүлийн "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " сар"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Сүүлд харагдсан"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Гарах"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Багаас гарах"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Бага"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Бага буюу тэнцүү"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Нэвтрэх"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Гарах"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Удирдах"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Удирдагч"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Гишүүн"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Гишүүд"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Утас"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Цааш"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Миний бүртгэл"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Миний вебүүд"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Нэр"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Шинэ нууц үг"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Байхгүй"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "бичлэг"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "бичлэг"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "ЗА"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Тойм"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Эзэмшигч"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Хуудас "
- },
- {
- "type": 1,
- "value": "total"
- },
- {
- "type": 0,
- "value": "-с "
- },
- {
- "type": 1,
- "value": "current"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Хуудас үзсэн"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Хуудасны гарчиг"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Хуудас"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Нууц үг"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Зам"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Зам"
- }
- ],
- "label.powered-by": [
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " дээр суурилсан"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Өмнөх"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Өмнөх үе"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Өмнөх жил"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Бүртгэл"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Шинж чанар"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Шинж чанар"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Query-нүүд"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query параметр"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Яг одоо"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Чиглүүлэгч"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Чиглүүлэгч"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Сэргээх"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Дахин үүсгэх"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Бүс"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Бүсүүд"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Устгах"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Гишүүн хасах"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Тайлан"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Шаардлагатай"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Дахин эхлүүлэх"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Тоон үзүүлэлтийг дахин эхлүүлэх"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Барилт"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Хэрэглэгчид таны веб рүү дахин хандах буюу хэрэглэгчдээ хэр тогтоож буйг хэмжих."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Орлого"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Орлогын шинж чанар"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Эрх"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Query ажиллуулах"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Хадгалах"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Дэлгэц"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Хайх"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Сонгох"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Огноо сонгох"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Веб сонгох"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Тохиргоо"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Хуваалцах холбоос"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Нэг өдөр"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Эхлэх алхам"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Алхам"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Нийлбэр"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Таблет"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Баг"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Багийн ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Багийн удирдагч"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Багийн гишүүн"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Багийн нэр"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Багийн эзэмшигч"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Багийн вебүүд"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Багууд"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Загвар"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Энэ сар"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Энэ долоо хоног"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Энэ жил"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Цагийн бүс"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Гарчиг"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Өнөөдөр"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Графикийг харуулах/нуух"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Нийт"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Нийт мөрийн тоо"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Мөрдөх код"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Шилжүүлэх"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Вебийг шилжүүлэх"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Үнэн"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Төрөл"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Давхардаагүй"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Зочин"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Давтагдаагүй зочин"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Тодорхойгүй"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Гарчиггүй"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Шинэчлэх"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL-ууд"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Хэрэглэгч"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Хэрэглэгчийн шинж"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Хэрэглэгчийн нэр"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Хэрэглэгчид"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "UTM параметраар кампанит ажлаа мөрдөх."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Утга"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Харах"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Дэлгэрүүлж харах"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Зөвхөн үзэх"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Үзсэн"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Зочдын хуудас үзсэн тоо"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Зочилсон дундаж хугацаа"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Зочин"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Зочилсон"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Веб"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Вебийн ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Вебүүд"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Цонх"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Өчигдөр"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Доорх хэсэгт "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " гэж бичин баталгаажуулна уу."
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "одоо "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "зочин"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "зочин"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " байна"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Цуглуулсан өгөгдөл"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Та "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "-г устгахдаа итгэлтэй байна уу?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Та "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "-с гарахдаа итгэлтэй байна уу?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Та "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "-г устгахдаа итгэлтэй байна уу?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Та "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ямар нэг зүйл буруу боллоо."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "url"
- },
- {
- "type": 0,
- "value": "-д "
- },
- {
- "type": 1,
- "value": "event"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Тохиргоо руу очих"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Буруу хэрэглэгчийн нэр/нууц үг."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Буруу домэйн"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Хамгийн багадаа "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " тэмдэгт"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Umami-н шинэ хувилбар "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " гарсан байна!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Өгөгдөл алга."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Үйлдлийн өгөгдөл алга."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Нууц үг тохирохгүй байна."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Ямар ч үр дүн олдсонгүй."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Энэ багт ямар ч веб алга."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Та ямар ч баг үүсгээгүй байна."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Хэрэглэгч байхгүй байна."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Та ямар нэгэн веб тохируулаагүй байна."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Хуудас олдсонгүй."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Тоон үзүүлэлтийг дахин эхлүүлэхийн тулд доорх хэсэгт "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " гэж бичиж, баталгаажуулна уу."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Энэ вебийн бүх тоон үзүүлэлтүүдийг устгах болно. Гэхдээ мөрдөх код хэвээрээ үлдэнэ."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Хадгалсан."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Таны вебийн тоон үзүүлэлтүүд доорх URL дээр нийтэд харагдах болно:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Та аль хэдийн энэ багийн гишүүн болсон байна."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Баг олдсонгүй."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Вебийг багийн бүх гишүүд үзэж болно."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Энэ вебийн хандалтуудыг мөрдөхийн тулд доорх кодыг HTML-нхээ "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " хэсэгт байрлуулна уу."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Энэ вебийг шилжүүлж авах багийг сонгоно уу."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Өдөөсөн үйлдэл"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Хэрэглэгч устсан."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Үзсэн хуудас"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " улсаас "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " дээр "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " хөтөч ашиглан орсон"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Зочдын уналт"
- }
- ]
+ "label": {
+ "access-code": "Хандалтын код",
+ "account": "Бүртгэл",
+ "action": "Үйлдэл",
+ "actions": "Үйлдлүүд",
+ "activity": "Үйл ажиллагааны бүртгэл",
+ "add": "Нэмэх",
+ "add-board": "Самбар нэмэх",
+ "add-description": "Тайлбар нэмэх",
+ "add-link": "Холбоос нэмэх",
+ "add-member": "Гишүүн нэмэх",
+ "add-pixel": "Пиксел нэмэх",
+ "add-step": "Алхам нэмэх",
+ "add-website": "Веб нэмэх",
+ "admin": "Админ",
+ "affiliate": "Харьяа",
+ "after": "Хойно",
+ "all": "Бүх",
+ "all-time": "Бүх цаг үеийн",
+ "analysis": "Шинжилгээ",
+ "analytics": "Аналитик",
+ "aov": "AOV",
+ "application": "Программ",
+ "apply": "Хэрэглэх",
+ "arpu": "ARPU",
+ "attribution": "Холбогдол",
+ "attribution-description": "Хэрэглэгчид таны маркетингт хэрхэн оролцож, ямар зүйлс хөрвүүлэлтэд нөлөөлж байгааг хараарай.",
+ "audience": "Үзэгчид",
+ "average": "Дундаж",
+ "back": "Буцах",
+ "before": "Өмнө",
+ "behavior": "Зан төлөв",
+ "block-selector": "Блок сонгогч",
+ "boards": "Самбарууд",
+ "bounce-rate": "Нэг хуудас үзээд гарсан",
+ "breakdown": "Задаргаа",
+ "browser": "Хөтөч",
+ "browsers": "Хөтөч",
+ "campaign": "Кампанит ажил",
+ "campaigns": "Аянууд",
+ "cancel": "Цуцлах",
+ "change-password": "Нууц үг солих",
+ "channel": "Суваг",
+ "channels": "Суваг",
+ "chart": "График",
+ "cities": "Хотууд",
+ "city": "Хот",
+ "clear-all": "Бүгдийг арилгах",
+ "cls": "CLS",
+ "cohort": "Бүлэг",
+ "cohorts": "Когортууд",
+ "compare": "Харьцуулах",
+ "compare-dates": "Огноо харьцуулах",
+ "confirm": "Батлах",
+ "confirm-password": "Шинэ нууц үгээ давтах",
+ "contains": "Агуулах",
+ "content": "Агуулга",
+ "continue": "Үргэлжлүүлэх",
+ "conversion": "Хөрвүүлэлт",
+ "conversion-rate": "Хөрвүүлэлтийн хувь",
+ "conversion-step": "Хөрвүүлэлтийн алхам",
+ "count": "Тоо",
+ "countries": "Улс",
+ "country": "Улс",
+ "create": "Үүсгэх",
+ "create-report": "Тайлан үүсгэх",
+ "create-team": "Баг үүсгэх",
+ "create-user": "Хэрэглэгч үүсгэх",
+ "created": "Үүсгэсэн",
+ "created-by": "Үүсгэсэн",
+ "criteria": "Шалгуур",
+ "currency": "Валют",
+ "current": "Одоогийн",
+ "current-password": "Ашиглаж буй нууц үг",
+ "custom-range": "Дурын хугацаа",
+ "dashboard": "Хянах самбар",
+ "data": "Өгөгдөл",
+ "date": "Огноо",
+ "date-range": "Хугацааны муж",
+ "day": "Өдөр",
+ "default-date-range": "Өгөгдмөл хугацааны муж",
+ "delete": "Устгах",
+ "delete-report": "Тайлан устгах",
+ "delete-team": "Баг устгах",
+ "delete-user": "Хэрэглэгч устгах",
+ "delete-website": "Веб устгах",
+ "description": "Тайлбар",
+ "desktop": "Суурин компьютер",
+ "destination-url": "Очих URL",
+ "details": "Мэдээлэл",
+ "device": "Төхөөрөмж",
+ "devices": "Төхөөрөмж",
+ "direct": "Шууд",
+ "dismiss": "Үл хэрэгсэх",
+ "distinct-id": "Ялгаатай ID",
+ "documentation": "Баримт бичиг",
+ "does-not-contain": "Агуулахгүй",
+ "does-not-include": "Агуулаагүй",
+ "doest-not-exist": "Байхгүй",
+ "domain": "Домэйн",
+ "download": "Татах",
+ "dropoff": "Уналт",
+ "duration": "Хугацаа",
+ "edit": "Засах",
+ "edit-member": "Гишүүн засах",
+ "email": "Имэйл",
+ "enable-share-url": "Хуваалцах холбоос идэвхжүүлэх",
+ "end-step": "Төгсгөлийн алхам",
+ "entry": "Орох зам",
+ "environment": "Орчин",
+ "event": "Үйлдэл",
+ "event-data": "Үйлдлийн өгөгдөл",
+ "event-name": "Үйлдлийн нэр",
+ "events": "Үйлдэл",
+ "exclude-bounce": "Буцалтыг хасах",
+ "exists": "Байгаа",
+ "exit": "Гарах зам",
+ "false": "Худал",
+ "fcp": "FCP",
+ "field": "Талбар",
+ "fields": "Талбар",
+ "filter": "Шүүлтүүр",
+ "filter-combined": "Нэгтгэсэн",
+ "filter-raw": "Түүхий",
+ "filters": "Шүүлтүүр",
+ "first-click": "Эхний даралт",
+ "first-seen": "Анх харсан",
+ "funnel": "Цутгал",
+ "funnel-description": "Хэрэглэгчдийн шилжилт, уналтын хэмжээг шинжлэх.",
+ "funnels": "Цутгалууд",
+ "goal": "Зорилго",
+ "goals": "Зорилго",
+ "goals-description": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх.",
+ "good": "Сайн",
+ "greater-than": "Их",
+ "greater-than-equals": "Их буюу тэнцүү",
+ "grouped": "Бүлэглэсэн",
+ "growth": "Өсөлт",
+ "hostname": "Хост нэр",
+ "hour": "Цаг",
+ "includes": "Агуулсан",
+ "inp": "INP",
+ "insight": "Ойлголт",
+ "insights": "Шинжлэх",
+ "insights-description": "Өгөгдлөө хэсэгчлэн хуваах, шүүх байдлаар задлан шинжлэх.",
+ "invalid-url": "Буруу URL",
+ "is": "Бол",
+ "is-false": "Худал байна",
+ "is-not": "Биш",
+ "is-not-set": "Утга оноогоогүй",
+ "is-set": "Утга оноосон",
+ "is-true": "Үнэн байна",
+ "join": "Нэгдэх",
+ "join-team": "Багт нэгдэх",
+ "journey": "Аялал",
+ "journey-description": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх.",
+ "journeys": "Аялалууд",
+ "language": "Хэл",
+ "languages": "Хэл",
+ "laptop": "Зөөврийн компьютер",
+ "last-click": "Сүүлийн даралт",
+ "last-days": "Сүүлийн {x} хоног",
+ "last-hours": "Сүүлийн {x} цаг",
+ "last-months": "Сүүлийн {x} сар",
+ "last-seen": "Сүүлд харагдсан",
+ "lcp": "LCP",
+ "leave": "Гарах",
+ "leave-team": "Багаас гарах",
+ "less-than": "Бага",
+ "less-than-equals": "Бага буюу тэнцүү",
+ "link": "Холбоос",
+ "links": "Холбоосууд",
+ "location": "Байршил",
+ "login": "Нэвтрэх",
+ "logout": "Гарах",
+ "manage": "Удирдах",
+ "manager": "Удирдагч",
+ "mask-level": "Маскийн түвшин",
+ "match": "Тохирох",
+ "match-all": "Бүгд",
+ "match-any": "Ямар ч",
+ "max": "Дээд",
+ "max-duration": "Хамгийн их хугацаа",
+ "maximize": "Өргөтгөх",
+ "medium": "Дунд",
+ "member": "Гишүүн",
+ "members": "Гишүүд",
+ "min": "Доод",
+ "minute": "Минут",
+ "mobile": "Утас",
+ "model": "Загвар",
+ "month": "Сар",
+ "more": "Цааш",
+ "my-account": "Миний бүртгэл",
+ "my-websites": "Миний вебүүд",
+ "name": "Нэр",
+ "needs-improvement": "Сайжруулалт шаардлагатай",
+ "new-password": "Шинэ нууц үг",
+ "none": "Байхгүй",
+ "number-of-records": "{x} {x, plural, one {бичлэг} other {бичлэг}}",
+ "ok": "ЗА",
+ "online": "Онлайн",
+ "organic-search": "Байгалийн хайлт",
+ "organic-shopping": "Байгалийн дэлгүүр",
+ "organic-social": "Байгалийн сошиал",
+ "organic-video": "Байгалийн видео",
+ "os": "ҮС",
+ "other": "Бусад",
+ "overview": "Тойм",
+ "owner": "Эзэмшигч",
+ "page": "Хуудас",
+ "page-of": "Хуудас {total}-с {current}",
+ "page-views": "Хуудас үзсэн",
+ "pages": "Хуудас",
+ "pageTitle": "Хуудасны гарчиг",
+ "paid-ads": "Төлбөртэй зар",
+ "paid-search": "Төлбөртэй хайлт",
+ "paid-shopping": "Төлбөртэй дэлгүүр",
+ "paid-social": "Төлбөртэй сошиал",
+ "paid-video": "Төлбөртэй видео",
+ "password": "Нууц үг",
+ "path": "Зам",
+ "paths": "Зам",
+ "performance": "Гүйцэтгэл",
+ "pixel": "Пиксел",
+ "pixels": "Пиксел",
+ "play": "Тоглуулах",
+ "poor": "Муу",
+ "powered-by": "{name} дээр суурилсан",
+ "preferences": "Тохиргоо",
+ "previous": "Өмнөх",
+ "previous-period": "Өмнөх үе",
+ "previous-year": "Өмнөх жил",
+ "profile": "Бүртгэл",
+ "profiles": "Профайлууд",
+ "properties": "Шинж чанар",
+ "property": "Шинж чанар",
+ "queries": "Query-нүүд",
+ "query": "Асуулга",
+ "query-parameters": "Query параметр",
+ "realtime": "Яг одоо",
+ "recorded": "Бичигдсэн огноо",
+ "referral": "Лавлагаа",
+ "referrer": "Чиглүүлэгч",
+ "referrers": "Чиглүүлэгч",
+ "refresh": "Сэргээх",
+ "regenerate": "Дахин үүсгэх",
+ "regex-match": "Регекс-тэй таарна",
+ "regex-not-match": "Регекс-тэй таарахгүй",
+ "region": "Бүс",
+ "regions": "Бүсүүд",
+ "remaining": "Үлдсэн",
+ "remove": "Устгах",
+ "remove-member": "Гишүүн хасах",
+ "replay": "Дахин тоглуулах",
+ "replay-enabled": "Дахин тоглуулах идэвхжүүлсэн",
+ "replay-id": "Replay ID",
+ "replays": "Дахин тоглуулах",
+ "reports": "Тайлан",
+ "required": "Шаардлагатай",
+ "reset": "Дахин эхлүүлэх",
+ "reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэх",
+ "retention": "Барилт",
+ "retention-days": "Хадгалалтын өдрүүд",
+ "retention-description": "Хэрэглэгчид таны веб рүү дахин хандах буюу хэрэглэгчдээ хэр тогтоож буйг хэмжих.",
+ "revenue": "Орлого",
+ "revenue-description": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах.",
+ "role": "Эрх",
+ "run-query": "Query ажиллуулах",
+ "sample-rate": "Дээжлэлтийн хурд",
+ "sample-size": "Дээжний хэмжээ",
+ "save": "Хадгалах",
+ "save-cohort": "Когорт хадгалах",
+ "save-segment": "Сегмент хадгалах",
+ "screen": "Дэлгэц",
+ "screens": "Дэлгэц",
+ "search": "Хайх",
+ "segment": "Сегмент",
+ "segments": "Сегментүүд",
+ "select": "Сонгох",
+ "select-component": "Бүрэлдэхүүн хэсэг сонгох",
+ "select-date": "Огноо сонгох",
+ "select-filter": "Шүүлтүүр сонгох",
+ "select-role": "Үүрэг сонгох",
+ "select-website": "Веб сонгох",
+ "session": "Сессия",
+ "session-data": "Сессийн өгөгдөл",
+ "sessions": "Сессиүд",
+ "settings": "Тохиргоо",
+ "share": "Хуваалцах",
+ "share-url": "Хуваалцах холбоос",
+ "single-day": "Нэг өдөр",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Эх сурвалж",
+ "sources": "Эх сурвалжууд",
+ "start-step": "Эхлэх алхам",
+ "steps": "Алхам",
+ "sum": "Нийлбэр",
+ "support": "Дэмжлэг",
+ "switch-account": "Бүртгэл солих",
+ "table": "Хүснэгт",
+ "tablet": "Таблет",
+ "tag": "Таг",
+ "tags": "Тагууд",
+ "team": "Баг",
+ "team-id": "Багийн ID",
+ "team-manager": "Багийн удирдагч",
+ "team-member": "Багийн гишүүн",
+ "team-name": "Багийн нэр",
+ "team-owner": "Багийн эзэмшигч",
+ "team-settings": "Багийн тохиргоо",
+ "team-view-only": "Зөвхөн багийн харагдац",
+ "team-websites": "Багийн вебүүд",
+ "teams": "Багууд",
+ "term": "Хайлтын нөхцөл",
+ "terms": "Нөхцөл",
+ "theme": "Загвар",
+ "this-month": "Энэ сар",
+ "this-week": "Энэ долоо хоног",
+ "this-year": "Энэ жил",
+ "timezone": "Цагийн бүс",
+ "title": "Гарчиг",
+ "today": "Өнөөдөр",
+ "toggle-charts": "Графикийг харуулах/нуух",
+ "total": "Нийт",
+ "total-records": "Нийт мөрийн тоо",
+ "tracking-code": "Мөрдөх код",
+ "traffic": "Урсгал",
+ "transactions": "Гүйлгээнүүд",
+ "transfer": "Шилжүүлэх",
+ "transfer-website": "Вебийг шилжүүлэх",
+ "true": "Үнэн",
+ "ttfb": "TTFB",
+ "type": "Төрөл",
+ "unique": "Давхардаагүй",
+ "unique-events": "Өвөрмөц үйл явдлууд",
+ "unique-visitors": "Зочин",
+ "uniqueCustomers": "Давтагдаагүй зочин",
+ "unknown": "Тодорхойгүй",
+ "untitled": "Гарчиггүй",
+ "update": "Шинэчлэх",
+ "url": "URL",
+ "user": "Хэрэглэгч",
+ "username": "Хэрэглэгчийн нэр",
+ "users": "Хэрэглэгчид",
+ "utm": "UTM",
+ "utm-campaign": "UTM Кампанит ажил",
+ "utm-content": "UTM Агуулга",
+ "utm-description": "UTM параметраар кампанит ажлаа мөрдөх.",
+ "utm-medium": "UTM Хэрэгсэл",
+ "utm-source": "UTM Эх сурвалж",
+ "utm-term": "UTM Нөхцөл",
+ "value": "Утга",
+ "version": "Хувилбар",
+ "view": "Харах",
+ "view-details": "Дэлгэрүүлж харах",
+ "view-only": "Зөвхөн үзэх",
+ "views": "Үзсэн",
+ "views-per-visit": "Зочдын хуудас үзсэн тоо",
+ "visit-duration": "Зочилсон дундаж хугацаа",
+ "visitors": "Зочин",
+ "visits": "Зочилсон",
+ "website": "Веб",
+ "website-id": "Вебийн ID",
+ "websites": "Вебүүд",
+ "window": "Цонх",
+ "yesterday": "Өчигдөр"
+ },
+ "message": {
+ "action-confirmation": "Доорх хэсэгт {confirmation} гэж бичин баталгаажуулна уу.",
+ "active-users": "одоо {x} {x, plural, one {зочин} other {зочин}} байна",
+ "bad-request": "Буруу хүсэлт",
+ "collected-data": "Цуглуулсан өгөгдөл",
+ "confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?",
+ "confirm-leave": "Та {target} -с гарахдаа итгэлтэй байна уу?",
+ "confirm-remove": "Та {target} -г устгахдаа итгэлтэй байна уу?",
+ "confirm-reset": "Та {target}-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?",
+ "delete-team-warning": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно.",
+ "delete-website-warning": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно.",
+ "empty-dashboard": "Таны хяналтын самбар хоосон байна. Эхний бүрэлдэхүүн хэсгийг нэмэхийн тулд Засах дарна уу.",
+ "error": "Ямар нэг зүйл буруу боллоо.",
+ "event-log": "{url} -д {event} ",
+ "forbidden": "Хориотой",
+ "go-to-settings": "Тохиргоо руу очих",
+ "incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.",
+ "invalid-domain": "Буруу домэйн",
+ "min-password-length": "Хамгийн багадаа {n} тэмдэгт",
+ "new-version-available": "Umami-н шинэ хувилбар {version} гарсан байна!",
+ "no-data-available": "Өгөгдөл алга.",
+ "no-event-data": "Үйлдлийн өгөгдөл алга.",
+ "no-match-password": "Нууц үг тохирохгүй байна.",
+ "no-results-found": "Ямар ч үр дүн олдсонгүй.",
+ "no-team-websites": "Энэ багт ямар ч веб алга.",
+ "no-teams": "Та ямар ч баг үүсгээгүй байна.",
+ "no-users": "Хэрэглэгч байхгүй байна.",
+ "no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
+ "not-found": "Олдсонгүй",
+ "nothing-selected": "Юу ч сонгоогүй байна.",
+ "page-not-found": "Хуудас олдсонгүй.",
+ "reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэхийн тулд доорх хэсэгт {confirmation} гэж бичиж, баталгаажуулна уу.",
+ "reset-website-warning": "Энэ вебийн бүх тоон үзүүлэлтүүдийг устгах болно. Гэхдээ мөрдөх код хэвээрээ үлдэнэ.",
+ "saved": "Хадгалсан.",
+ "select-component-preview": "Урьдчилан харахын тулд бүрэлдэхүүн хэсэг сонгоно уу",
+ "select-website-first": "Эхлээд вэб сайт сонгоно уу",
+ "sever-error": "Серверийн алдаа",
+ "share-url": "Таны вебийн тоон үзүүлэлтүүд доорх URL дээр нийтэд харагдах болно:",
+ "team-already-member": "Та аль хэдийн энэ багийн гишүүн болсон байна.",
+ "team-not-found": "Баг олдсонгүй.",
+ "team-websites-info": "Вебийг багийн бүх гишүүд үзэж болно.",
+ "tracking-code": "Энэ вебийн хандалтуудыг мөрдөхийн тулд доорх кодыг HTML-нхээ ... хэсэгт байрлуулна уу.",
+ "transfer-team-website-to-user": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?",
+ "transfer-user-website-to-team": "Энэ вебийг шилжүүлж авах багийг сонгоно уу.",
+ "transfer-website": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах.",
+ "triggered-event": "Өдөөсөн үйлдэл",
+ "unauthorized": "Зөвшөөрөлгүй",
+ "user-deleted": "Хэрэглэгч устсан.",
+ "viewed-page": "Үзсэн хуудас",
+ "visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон"
+ }
}
diff --git a/public/intl/messages/ms-MY.json b/public/intl/messages/ms-MY.json
index 6886b74c6..7d1db53f6 100644
--- a/public/intl/messages/ms-MY.json
+++ b/public/intl/messages/ms-MY.json
@@ -1,1860 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Aksi"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Tambah laman web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Pentadbir"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Semua"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Kembali"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Kadar lantunan"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Pelayar web"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Batal"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Tukar kata laluan"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Sahkan kata laluan"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Negara"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Kata laluan semasa"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Julat khas"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Papan pemuka"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Julat tarikh"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Julat tarikh lalai"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Padam"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Padam laman web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Peranti"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Ketepikan"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domain"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edit"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Aktifkan url berkongsi"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Peristiwa"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Digabungkan"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Mentah"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hari lepas"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " jam lepas"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Log masuk"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Log keluar"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Telefon bimbit"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Lebih banyak lagi"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nama"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Kata laluan baru"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Paparan halaman"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Halaman"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Kata laluan"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Disediakan oleh "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Siaran langsung"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Perujuk"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Muat semula"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Diperlukan"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Tetapkan semula"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Simpan"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Tetapan"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Kongsikan URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Satu hari"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Bulan ini"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Minggu ini"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Tahun ini"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zon masa"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hari ini"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Kod penjejakan"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Pelawat unik"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Tidak diketahui"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nama pengguna"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Lihat butiran"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Lawatan"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Purata tempoh masa lawatan"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Pelawat"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Laman web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " semasa "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "pelawat"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "pelawat"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Pastikah anda ingin memadam "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Semua data yang berkaitan juga akan dihapuskan."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ada yang tidak kena."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Pergi ke tetapan"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Pengguna/kata laluan tidak betul."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domain tidak sah"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Tiada data yang boleh didapati."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Kata laluan tidak sepadan"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Anda tidak ada sebarang laman web yang telah dikonfigurasikan."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Halaman tidak dijumpai."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Berjaya disimpan."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Ini adalah URL berkongsi untuk "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Kod penjejakan"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Pelawat dari "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " mengguna "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " pada "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Kod akses",
+ "account": "Akaun",
+ "action": "Tindakan",
+ "actions": "Aksi",
+ "activity": "Activity log",
+ "add": "Tambah",
+ "add-board": "Tambah papan",
+ "add-description": "Tambah penerangan",
+ "add-link": "Tambah pautan",
+ "add-member": "Tambah ahli",
+ "add-pixel": "Tambah piksel",
+ "add-step": "Tambah langkah",
+ "add-website": "Tambah laman web",
+ "admin": "Pentadbir",
+ "affiliate": "Gabungan",
+ "after": "Selepas",
+ "all": "Semua",
+ "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",
+ "average": "Purata",
+ "back": "Kembali",
+ "before": "Sebelum",
+ "behavior": "Tingkah laku",
+ "block-selector": "Pemilih blok",
+ "boards": "Papan",
+ "bounce-rate": "Kadar lantunan",
+ "breakdown": "Pecahan",
+ "browser": "Pelayar",
+ "browsers": "Pelayar web",
+ "campaign": "Kempen",
+ "campaigns": "Kempen",
+ "cancel": "Batal",
+ "change-password": "Tukar kata laluan",
+ "channel": "Saluran",
+ "channels": "Saluran",
+ "chart": "Carta",
+ "cities": "Bandar",
+ "city": "Bandar",
+ "clear-all": "Kosongkan semua",
+ "cls": "CLS",
+ "cohort": "Kohort",
+ "cohorts": "Kohort",
+ "compare": "Bandingkan",
+ "compare-dates": "Bandingkan tarikh",
+ "confirm": "Sahkan",
+ "confirm-password": "Sahkan kata laluan",
+ "contains": "Mengandungi",
+ "content": "Kandungan",
+ "continue": "Teruskan",
+ "conversion": "Penukaran",
+ "conversion-rate": "Kadar penukaran",
+ "conversion-step": "Langkah penukaran",
+ "count": "Bilangan",
+ "countries": "Negara",
+ "country": "Negara",
+ "create": "Cipta",
+ "create-report": "Cipta laporan",
+ "create-team": "Cipta pasukan",
+ "create-user": "Cipta pengguna",
+ "created": "Dicipta",
+ "created-by": "Dicipta oleh",
+ "criteria": "Kriteria",
+ "currency": "Mata wang",
+ "current": "Semasa",
+ "current-password": "Kata laluan semasa",
+ "custom-range": "Julat khas",
+ "dashboard": "Papan pemuka",
+ "data": "Data",
+ "date": "Tarikh",
+ "date-range": "Julat tarikh",
+ "day": "Hari",
+ "default-date-range": "Julat tarikh lalai",
+ "delete": "Padam",
+ "delete-report": "Padam laporan",
+ "delete-team": "Padam pasukan",
+ "delete-user": "Padam pengguna",
+ "delete-website": "Padam laman web",
+ "description": "Penerangan",
+ "desktop": "Desktop",
+ "destination-url": "URL destinasi",
+ "details": "Butiran",
+ "device": "Peranti",
+ "devices": "Peranti",
+ "direct": "Terus",
+ "dismiss": "Ketepikan",
+ "distinct-id": "ID unik",
+ "documentation": "Dokumentasi",
+ "does-not-contain": "Tidak mengandungi",
+ "does-not-include": "Tidak termasuk",
+ "doest-not-exist": "Tidak wujud",
+ "domain": "Domain",
+ "download": "Muat turun",
+ "dropoff": "Tercicir",
+ "duration": "Tempoh",
+ "edit": "Sunting",
+ "edit-member": "Sunting ahli",
+ "email": "E-mel",
+ "enable-share-url": "Aktifkan url berkongsi",
+ "end-step": "Langkah akhir",
+ "entry": "Entry URL",
+ "environment": "Persekitaran",
+ "event": "Peristiwa",
+ "event-data": "Data peristiwa",
+ "event-name": "Nama peristiwa",
+ "events": "Peristiwa",
+ "exclude-bounce": "Kecualikan lantunan",
+ "exists": "Wujud",
+ "exit": "Exit URL",
+ "false": "Palsu",
+ "fcp": "FCP",
+ "field": "Medan",
+ "fields": "Medan",
+ "filter": "Tapis",
+ "filter-combined": "Digabungkan",
+ "filter-raw": "Mentah",
+ "filters": "Tapis",
+ "first-click": "Klik pertama",
+ "first-seen": "Pertama dilihat",
+ "funnel": "Corong",
+ "funnel-description": "Fahami kadar penukaran dan tercicir pengguna.",
+ "funnels": "Corong",
+ "goal": "Matlamat",
+ "goals": "Matlamat",
+ "goals-description": "Jejaki matlamat anda untuk paparan halaman dan peristiwa.",
+ "good": "Baik",
+ "greater-than": "Lebih besar dari",
+ "greater-than-equals": "Lebih besar atau sama",
+ "grouped": "Dikumpulkan",
+ "growth": "Pertumbuhan",
+ "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.",
+ "invalid-url": "URL tidak sah",
+ "is": "Adalah",
+ "is-false": "Adalah palsu",
+ "is-not": "Bukan",
+ "is-not-set": "Tidak ditetapkan",
+ "is-set": "Ditetapkan",
+ "is-true": "Adalah benar",
+ "join": "Sertai",
+ "join-team": "Sertai pasukan",
+ "journey": "Perjalanan",
+ "journey-description": "Fahami bagaimana pengguna menavigasi laman web anda.",
+ "journeys": "Perjalanan",
+ "language": "Bahasa",
+ "languages": "Bahasa",
+ "laptop": "Komputer riba",
+ "last-click": "Klik terakhir",
+ "last-days": "{x} hari lepas",
+ "last-hours": "{x} jam lepas",
+ "last-months": "{x} bulan lepas",
+ "last-seen": "Terakhir dilihat",
+ "lcp": "LCP",
+ "leave": "Keluar",
+ "leave-team": "Keluar pasukan",
+ "less-than": "Kurang dari",
+ "less-than-equals": "Kurang atau sama",
+ "link": "Pautan",
+ "links": "Pautan",
+ "location": "Lokasi",
+ "login": "Log masuk",
+ "logout": "Log keluar",
+ "manage": "Urus",
+ "manager": "Pengurus",
+ "mask-level": "Tahap pelindung",
+ "match": "Padanan",
+ "match-all": "Semua",
+ "match-any": "Mana-mana",
+ "max": "Maks",
+ "max-duration": "Tempoh maksimum",
+ "maximize": "Expand",
+ "medium": "Medium",
+ "member": "Ahli",
+ "members": "Ahli",
+ "min": "Min",
+ "minute": "Minit",
+ "mobile": "Telefon bimbit",
+ "model": "Model",
+ "month": "Bulan",
+ "more": "Lebih banyak lagi",
+ "my-account": "Akaun saya",
+ "my-websites": "Laman web saya",
+ "name": "Nama",
+ "needs-improvement": "Perlu penambahbaikan",
+ "new-password": "Kata laluan baru",
+ "none": "Tiada",
+ "number-of-records": "{x} {x, plural, one {rekod} other {rekod}}",
+ "ok": "OK",
+ "online": "Dalam talian",
+ "organic-search": "Carian organik",
+ "organic-shopping": "Beli-belah organik",
+ "organic-social": "Sosial organik",
+ "organic-video": "Video organik",
+ "os": "OS",
+ "other": "Lain-lain",
+ "overview": "Gambaran keseluruhan",
+ "owner": "Pemilik",
+ "page": "Halaman",
+ "page-of": "Halaman {current} daripada {total}",
+ "page-views": "Paparan halaman",
+ "pages": "Halaman",
+ "pageTitle": "Tajuk halaman",
+ "paid-ads": "Iklan berbayar",
+ "paid-search": "Carian berbayar",
+ "paid-shopping": "Beli-belah berbayar",
+ "paid-social": "Sosial berbayar",
+ "paid-video": "Video berbayar",
+ "password": "Kata laluan",
+ "path": "Laluan",
+ "paths": "Laluan",
+ "performance": "Prestasi",
+ "pixel": "Piksel",
+ "pixels": "Piksel",
+ "play": "Main",
+ "poor": "Lemah",
+ "powered-by": "Disediakan oleh {name}",
+ "preferences": "Keutamaan",
+ "previous": "Sebelumnya",
+ "previous-period": "Tempoh sebelumnya",
+ "previous-year": "Tahun sebelumnya",
+ "profile": "Profil",
+ "profiles": "Profil",
+ "properties": "Sifat",
+ "property": "Sifat",
+ "queries": "Pertanyaan",
+ "query": "Pertanyaan",
+ "query-parameters": "Parameter pertanyaan",
+ "realtime": "Siaran langsung",
+ "recorded": "Direkodkan pada",
+ "referral": "Rujukan",
+ "referrer": "Perujuk",
+ "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",
+ "replay": "Main semula",
+ "replay-enabled": "Main semula diaktifkan",
+ "replay-id": "Replay ID",
+ "replays": "Main semula",
+ "reports": "Laporan",
+ "required": "Diperlukan",
+ "reset": "Tetapkan semula",
+ "reset-website": "Reset statistics",
+ "retention": "Pengekalan",
+ "retention-days": "Hari penyimpanan",
+ "retention-description": "Ukur kelekatan laman web anda dengan menjejaki kekerapan pengguna kembali.",
+ "revenue": "Hasil",
+ "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-segment": "Simpan segmen",
+ "screen": "Skrin",
+ "screens": "Skrin",
+ "search": "Cari",
+ "segment": "Segmen",
+ "segments": "Segmen",
+ "select": "Pilih",
+ "select-component": "Pilih komponen",
+ "select-date": "Pilih tarikh",
+ "select-filter": "Pilih tapis",
+ "select-role": "Pilih peranan",
+ "select-website": "Pilih laman web",
+ "session": "Sesi",
+ "session-data": "Data sesi",
+ "sessions": "Sesi",
+ "settings": "Tetapan",
+ "share": "Kongsi",
+ "share-url": "Kongsikan URL",
+ "single-day": "Satu hari",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Sumber",
+ "sources": "Sumber",
+ "start-step": "Langkah mula",
+ "steps": "Langkah",
+ "sum": "Jumlah",
+ "support": "Sokongan",
+ "switch-account": "Tukar akaun",
+ "table": "Jadual",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tag",
+ "team": "Pasukan",
+ "team-id": "ID pasukan",
+ "team-manager": "Pengurus pasukan",
+ "team-member": "Ahli pasukan",
+ "team-name": "Nama pasukan",
+ "team-owner": "Pemilik pasukan",
+ "team-settings": "Tetapan pasukan",
+ "team-view-only": "Lihat sahaja pasukan",
+ "team-websites": "Laman web pasukan",
+ "teams": "Pasukan",
+ "term": "Kata kunci",
+ "terms": "Syarat",
+ "theme": "Tema",
+ "this-month": "Bulan ini",
+ "this-week": "Minggu ini",
+ "this-year": "Tahun ini",
+ "timezone": "Zon masa",
+ "title": "Tajuk",
+ "today": "Hari ini",
+ "toggle-charts": "Togol carta",
+ "total": "Jumlah",
+ "total-records": "Jumlah rekod",
+ "tracking-code": "Kod penjejakan",
+ "traffic": "Trafik",
+ "transactions": "Transaksi",
+ "transfer": "Pindahkan",
+ "transfer-website": "Pindahkan laman web",
+ "true": "Benar",
+ "ttfb": "TTFB",
+ "type": "Jenis",
+ "unique": "Unik",
+ "unique-events": "Peristiwa unik",
+ "unique-visitors": "Pelawat unik",
+ "uniqueCustomers": "Pelanggan unik",
+ "unknown": "Tidak diketahui",
+ "untitled": "Tanpa tajuk",
+ "update": "Kemas kini",
+ "url": "URL",
+ "user": "Pengguna",
+ "username": "Nama pengguna",
+ "users": "Pengguna",
+ "utm": "UTM",
+ "utm-campaign": "UTM Kempen",
+ "utm-content": "UTM Kandungan",
+ "utm-description": "Jejaki kempen anda melalui parameter UTM.",
+ "utm-medium": "UTM Medium",
+ "utm-source": "UTM Sumber",
+ "utm-term": "UTM Kata Kunci",
+ "value": "Nilai",
+ "version": "Versi",
+ "view": "Lihat",
+ "view-details": "Lihat butiran",
+ "view-only": "Lihat sahaja",
+ "views": "Lawatan",
+ "views-per-visit": "Paparan per lawatan",
+ "visit-duration": "Purata tempoh masa lawatan",
+ "visitors": "Pelawat",
+ "visits": "Lawatan",
+ "website": "Laman web",
+ "website-id": "ID laman web",
+ "websites": "Laman web",
+ "window": "Tetingkap",
+ "yesterday": "Semalam"
+ },
+ "message": {
+ "action-confirmation": "Taip {confirmation} dalam kotak di bawah untuk mengesahkan.",
+ "active-users": "{x} semasa {x, plural, one {pelawat} other {pelawat}}",
+ "bad-request": "Permintaan tidak sah",
+ "collected-data": "Data yang dikumpul",
+ "confirm-delete": "Pastikah anda ingin memadam {target}?",
+ "confirm-leave": "Adakah anda pasti mahu meninggalkan {target} ?",
+ "confirm-remove": "Adakah anda pasti mahu membuang {target} ?",
+ "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.",
+ "event-log": "{event} di {url} ",
+ "forbidden": "Dilarang",
+ "go-to-settings": "Pergi ke tetapan",
+ "incorrect-username-password": "Pengguna/kata laluan tidak betul.",
+ "invalid-domain": "Domain tidak sah",
+ "min-password-length": "Panjang minimum {n} aksara",
+ "new-version-available": "Versi baharu Umami {version} tersedia!",
+ "no-data-available": "Tiada data yang boleh didapati.",
+ "no-event-data": "Tiada data peristiwa tersedia.",
+ "no-match-password": "Kata laluan tidak sepadan",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Pasukan ini tidak mempunyai laman web.",
+ "no-teams": "Anda belum mencipta sebarang pasukan.",
+ "no-users": "Tiada pengguna.",
+ "no-websites-configured": "Anda tidak ada sebarang laman web yang telah dikonfigurasikan.",
+ "not-found": "Tidak dijumpai",
+ "nothing-selected": "Tiada yang dipilih.",
+ "page-not-found": "Halaman tidak dijumpai.",
+ "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-component-preview": "Pilih komponen untuk pratonton",
+ "select-website-first": "Pilih laman web dahulu",
+ "sever-error": "Ralat pelayan",
+ "share-url": "Ini adalah URL berkongsi untuk {target}.",
+ "team-already-member": "Anda sudah menjadi ahli pasukan.",
+ "team-not-found": "Pasukan tidak dijumpai.",
+ "team-websites-info": "Laman web boleh dilihat oleh sesiapa dalam pasukan.",
+ "tracking-code": "Kod penjejakan",
+ "transfer-team-website-to-user": "Pindahkan laman web ini ke akaun anda?",
+ "transfer-user-website-to-team": "Pilih pasukan untuk memindahkan laman web ini.",
+ "transfer-website": "Pindahkan pemilikan laman web ke akaun anda atau pasukan lain.",
+ "triggered-event": "Peristiwa yang dicetuskan",
+ "unauthorized": "Tidak dibenarkan",
+ "user-deleted": "Pengguna dipadamkan.",
+ "viewed-page": "Halaman dilihat",
+ "visitor-log": "Pelawat dari {country} mengguna {browser} pada {os} {device} "
+ }
}
diff --git a/public/intl/messages/my-MM.json b/public/intl/messages/my-MM.json
index 7fc610e4d..74bea7fb6 100644
--- a/public/intl/messages/my-MM.json
+++ b/public/intl/messages/my-MM.json
@@ -1,1848 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "ဝင်ခွင့်ကုဒ်"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "လုပ်ဆောင်ချက်များ"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "လုပ်ဆောင်ချက်စာရင်း"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "ထပ်ထည့်မည်"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "အကြောင်းအရာဖော်ပြချက် ထည့်မည်"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်ထည့်မည်"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "အက်ဒမင်"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "ပြီးနောက်"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "အားလုံး"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "အချိန်အစမှအခုထိ"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "အန်နလစ်တစ်"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "ပျမ်းမျှ"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "နောက်သို့"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "မတိုင်မီ"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce နှုန်း"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "ခွဲခြမ်းစိတ်ဖြာမှု"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဘရောင်ဇာများ"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "မလုပ်တော့ပါ"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "စကားဝှက် ပြောင်းမည်"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "မြို့များ"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "အားလုံးကိုဖျက်မည်"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "အတည်ပြုသည်"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "စကားဝှက်အတည်ပြုသည်"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "ပါဝင်သည်"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "ဆက်သွားမည်"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "နိုင်ငံများ"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "ရီပို့လုပ်မည်"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Team ပြုလုပ်မည်"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "အသုံးပြုသူထည့်မည်"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "ပြုလုပ်ပြီးသော"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "လက်ရှိစကားဝှက်"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "အချိန်အပိုင်းအခြားရွေးရန်"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "ဒက်ရှ်ဘုတ်"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "ဒေတာ"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "ရက်အပိုင်းအခြား"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "ပုံသေ ရက်အပိုင်းအခြား"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "ဖျက်မည်"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Team ကိုဖျက်မည်"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "အသုံးပြုသူကိုဖျက်မည်"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်ကိုဖျက်မည်"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "ရှင်းပြချက်"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "စားပွဲတင်ကွန်ပျူတာ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "အသေးစိတ်"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "အသုံးပြုသည့် ကိရိယာများ"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "ပိတ်ပါ"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "မပါဝင်ပါ"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "ဒိုမိန်း"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "ပြုပြင်မည်"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "ဒက်ရှ်ဘုတ်ကို ပြုပြင်မည်"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "ဝေငှခြင်းကိုလင့်ကို ဖွင့်မည်"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "အဖြစ်အပျက်"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "အဖြစ်အပျက် ဒေတာ"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "အဖြစ်အပျက်များ"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "မှားသည်"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field အမည်"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Field အမည်များ"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "ပေါင်းစပ်ပြီး"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "အရှိအတိုင်း"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filter များ"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "ဖန်နယ်"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "ထက်ပို၍ကြီးသည်"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "ထက်ပို၍ကြီးသည်သို့မဟုတ်တူသည်"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "အသေးစိတ်သိမြင်နိုင်ရန်"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "ဝင်မည်"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "အသင်းဝင်မည်"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "ဘာသာစကား"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "ဘာသာစကားများ"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "လက်တော့ပ်"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "လွန်ခဲ့သော "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ရက်က"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "လွန်ခဲ့သော "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " နာရီက"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "ထွက်မည်"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "အသင်းမှထွက်မည်"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "ထက်ပို၍ငယ်သည်"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "ထက်ပို၍ငယ်သည်သို့မဟုတ်တူသည်"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "လော့ဂ်အင်"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "လော့ဂ်အောက်လုပ်မည်"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "အများဆုံး"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "အဖွဲ့ဝင်များ"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "အနည်းဆုံး"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "မိုဘိုင်း"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "နောက်ထပ်"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "အမည်"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "စကားဝှက်အသစ်"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "မရှိပါ"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "ကွန်ပျူတာလည်ပတ်မှုစနစ်"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "အပေါ်ယံမြင်ကွင်း"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "ပိုင်ဆိုင်သူ"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "ဝင်ရောက်ကြည့်ရှုသူ"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "စာမျက်နှာများ"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "စကားဝှက်"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " ထောက်ပံ့သည်"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "ပရိုဖိုင်း"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries (ကွာရီများ)"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query (ကွာရီ)"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters (ကွာရီပါရာမီတာများ)"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "အချိန်နှင့်တပြေးညီ"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "ရည်ညွှန်းမှုများ"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Refresh လုပ်မည်"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "ပြန်ထုတ်မည်"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "ဒေသများ"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "ဖျက်မည်"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "တင်ပြမှုများ"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "လိုအပ်သည်"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "ပြန်စမည်"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်မည်"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "အခန်းကဏ္ဍ"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Query ကိုလုပ်ဆောင်မည်"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "သိမ်းဆည်းမည်"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "မြင်ကွင်းများ"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "ရက်ရွေးပါ"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "ဝဘက်ဘ်ဆိုဒ်ရွေးပါ"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "ဆက်ရှင်များ"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "ဆက်တင်များ"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "URL ကိုရှဲမည်"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "တစ်ရက်အတွင်း"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "ပေါင်းလဒ်"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "တက်ဘလက်"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "အသင်း"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "အသင်း အိုင်ဒီ"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "အသင်းဝင်"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "အသင်းကိုပိုင်ဆိုင်သူ"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "အသင်းများ"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme (အပြင်အဆင်)"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "ယခုလ"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "ယခုအပတ်"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "ယခုနှစ်"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "အချိန်ဇုန်"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "ခေါင်းစဥ်"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "ယနေ့"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "ဇယားများကို အဖွင့်အပိတ်လုပ်မည်"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "စုစုပေါင်း"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "မှတ်တမ်းစုစုပေါင်း"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "ထရက်လုပ်သည့် ကုဒ်"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "မှန်သည်"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "အမျိုးအစား"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "ဝင်ရောက်သူ (ထပ်ခြင်းမရှိ)"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "မသိသော"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "ခေါင်းစဉ်မရှိ"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL များ"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "အသုံးပြုသူ"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "အသုံးပြုသူအမည်"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "အသုံးပြုသူများ"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "တန်ဖိုး"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "ဝင်ရောက်ကြည့်ရှုမှု"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "အသေးစိတ်ကို ကြည့်ရှုမည်"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "ဝင်ရောက်ကြည့်ရှုမှုများသာ"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "ဝင်ရောက်ကြည့်ရှုမှုများ"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "ဝဘက်ဘ်ဆိုဒ်တွင် ပျမ်းမျှကုန်ဆုံးချိန်"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "ဝင်ရောက်ကြည့်ရှုသူများ"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ် အိုင်ဒီ"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်များ"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "ဝင်းဒိုး"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "မနေ့က"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " လက်ရှိအသုံးပြုနေသူ "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "ယောက်"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "ယောက်"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ကို ဖျက်ရန် သေချာပါသလား?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ကို ထွက်ရန် သေချာပါသလား?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ကို ဖျက်၍ပြန်စလုပ်ရန် သေချာပါသလား?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ် ဒေတာအကုန် ဖျက်မည်"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "မှားယွင်းမှုတစ်ခု ရှိသွားပါသည်"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "url"
- },
- {
- "type": 0,
- "value": " တွင် "
- },
- {
- "type": 1,
- "value": "event"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "ဆက်တင်သို့ သွားရန်"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားနေသည်"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "ဒိုမိန်း မမှန်ပါ http/https. မပါရပါ"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "အနည်းဆုံး "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " character ရှိရမည်"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "အူမာမီ "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " အသစ်ထွက်နေပါပြီ"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "ဒေတာ မရှိပါ"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "အဖြစ်အပျက်ဒေတာ မရှိပါ"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "စကားဝှက် မှားနေသည်"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "ရလဒ်မရှိပါ"
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "ဤအသင်းတွင် ဝက်ဘ်ဆိုက်မရှိသေးပါ"
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "အသင်း မပြုလုပ်ရသေးပါ"
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "အသုံးပြုသူ မရှိသေးပါ"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "ဝက်ဘ်ဆိုဒ်တစ်ခုမှ မထည့်ရသေးပါ"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "ဤစာမျက်နှာသည် မရှိပါ"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "ဤ ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်၍ ပြန်စလုပ်ရန် အောက်တွင် "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " ကို ရိုက်ထည့်ပေးပါ"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "ဤဝက်ဘ်ဆိုဒ်က စာရင်းအချက်အလက်များကို ဖျက်မည်၊ ဆက်တင်ဒေတာများ မပါပါ"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "မှတ်သားပြီး"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "သင့်ဝက်ဆိုဒ်ဘ်၏ စာရင်းအချက်အလက်များကို အောက်ပါ URL တွင် ဝင်ရောက်ကြည့်ရှုနိုင်သည်"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "ဤအသင်းတွင် ဝင်ပြီးသားဖြစ်နေသည်"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "အသင်း မရှိပါ"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "ဤဝက်ဘ်ဆိုဒ်များကို အသင်းထဲမှ လူတိုင်းဝင်ကြည့်နိုင်သည်"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "ဤဝက်ဘ်ဆိုဒ်၏ ဒေတာကိုကောက်ခံရန် အောက်ပါ code ကို သင်၏ HTML တွင်ထည့်ပါ"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "အသုံးပြုသူ ဖျက်ပြီးပါပြီ"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " မှ "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " ဖြင့် "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " တွင် ဝင်ရောက်ကြည့်ရှုသူ"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "ဝင်ခွင့်ကုဒ်",
+ "account": "အကောင့်",
+ "action": "လုပ်ဆောင်ချက်",
+ "actions": "လုပ်ဆောင်ချက်များ",
+ "activity": "လုပ်ဆောင်ချက်စာရင်း",
+ "add": "ထပ်ထည့်မည်",
+ "add-board": "ဘုတ်ထည့်မည်",
+ "add-description": "အကြောင်းအရာဖော်ပြချက် ထည့်မည်",
+ "add-link": "လင့်ခ်ထည့်မည်",
+ "add-member": "အဖွဲ့ဝင်ထည့်မည်",
+ "add-pixel": "Pixel ထည့်မည်",
+ "add-step": "အဆင့်ထည့်မည်",
+ "add-website": "ဝက်ဘ်ဆိုဒ်ထည့်မည်",
+ "admin": "အက်ဒမင်",
+ "affiliate": "တွဲဖက်မိတ်ဖက်",
+ "after": "ပြီးနောက်",
+ "all": "အားလုံး",
+ "all-time": "အချိန်အစမှအခုထိ",
+ "analysis": "ခွဲခြမ်းစိတ်ဖြာမှု",
+ "analytics": "အန်နလစ်တစ်",
+ "aov": "AOV",
+ "application": "အပလီကေးရှင်း",
+ "apply": "အသုံးပြုမည်",
+ "arpu": "ARPU",
+ "attribution": "အရင်းအမြစ်ခွဲခြားခြင်း",
+ "attribution-description": "သင့်မားကတ်တင်းနှင့် အသုံးပြုသူများ မည်သို့ဆက်ဆံသည်နှင့် ပြောင်းလဲမှုကို မောင်းနှင်သည့်အရာများကို ကြည့်ပါ။",
+ "audience": "ပရိသတ်",
+ "average": "ပျမ်းမျှ",
+ "back": "နောက်သို့",
+ "before": "မတိုင်မီ",
+ "behavior": "အပြုအမူ",
+ "block-selector": "ဘလောက် ရွေးချယ်မှု",
+ "boards": "ဘုတ်များ",
+ "bounce-rate": "Bounce နှုန်း",
+ "breakdown": "ခွဲခြမ်းစိတ်ဖြာမှု",
+ "browser": "ဘရောင်ဇာ",
+ "browsers": "ဝက်ဘ်ဘရောင်ဇာများ",
+ "campaign": "ကမ်ပိန်း",
+ "campaigns": "ကမ်ပိန်းများ",
+ "cancel": "မလုပ်တော့ပါ",
+ "change-password": "စကားဝှက် ပြောင်းမည်",
+ "channel": "ချန်နယ်",
+ "channels": "ချန်နယ်များ",
+ "chart": "ဇယား",
+ "cities": "မြို့များ",
+ "city": "မြို့",
+ "clear-all": "အားလုံးကိုဖျက်မည်",
+ "cls": "CLS",
+ "cohort": "အုပ်စု",
+ "cohorts": "အုပ်စုများ",
+ "compare": "နှိုင်းယှဉ်မည်",
+ "compare-dates": "ရက်စွဲများ နှိုင်းယှဉ်မည်",
+ "confirm": "အတည်ပြုသည်",
+ "confirm-password": "စကားဝှက်အတည်ပြုသည်",
+ "contains": "ပါဝင်သည်",
+ "content": "အကြောင်းအရာ",
+ "continue": "ဆက်သွားမည်",
+ "conversion": "ပြောင်းလဲမှု",
+ "conversion-rate": "ပြောင်းလဲမှုနှုန်း",
+ "conversion-step": "ပြောင်းလဲမှုအဆင့်",
+ "count": "အရေအတွက်",
+ "countries": "နိုင်ငံများ",
+ "country": "နိုင်ငံ",
+ "create": "ဖန်တီးမည်",
+ "create-report": "ရီပို့လုပ်မည်",
+ "create-team": "Team ပြုလုပ်မည်",
+ "create-user": "အသုံးပြုသူထည့်မည်",
+ "created": "ပြုလုပ်ပြီးသော",
+ "created-by": "ဖန်တီးသူ",
+ "criteria": "စံသတ်မှတ်ချက်",
+ "currency": "ငွေကြေး",
+ "current": "လက်ရှိ",
+ "current-password": "လက်ရှိစကားဝှက်",
+ "custom-range": "အချိန်အပိုင်းအခြားရွေးရန်",
+ "dashboard": "ဒက်ရှ်ဘုတ်",
+ "data": "ဒေတာ",
+ "date": "ရက်စွဲ",
+ "date-range": "ရက်အပိုင်းအခြား",
+ "day": "ရက်",
+ "default-date-range": "ပုံသေ ရက်အပိုင်းအခြား",
+ "delete": "ဖျက်မည်",
+ "delete-report": "အစီရင်ခံစာ ဖျက်မည်",
+ "delete-team": "Team ကိုဖျက်မည်",
+ "delete-user": "အသုံးပြုသူကိုဖျက်မည်",
+ "delete-website": "ဝက်ဘ်ဆိုဒ်ကိုဖျက်မည်",
+ "description": "ရှင်းပြချက်",
+ "desktop": "စားပွဲတင်ကွန်ပျူတာ",
+ "destination-url": "ဦးတည်ရာ URL",
+ "details": "အသေးစိတ်",
+ "device": "ကိရိယာ",
+ "devices": "အသုံးပြုသည့် ကိရိယာများ",
+ "direct": "တိုက်ရိုက်",
+ "dismiss": "ပိတ်ပါ",
+ "distinct-id": "ထူးခြား ID",
+ "documentation": "စာရွက်စာတမ်း",
+ "does-not-contain": "မပါဝင်ပါ",
+ "does-not-include": "မပါဝင်ပါ",
+ "doest-not-exist": "မတည်ရှိပါ",
+ "domain": "ဒိုမိန်း",
+ "download": "ဒေါင်းလုဒ်လုပ်မည်",
+ "dropoff": "ထွက်ခွာမှု",
+ "duration": "ကြာချိန်",
+ "edit": "ပြုပြင်မည်",
+ "edit-member": "အဖွဲ့ဝင် ပြင်ဆင်မည်",
+ "email": "အီးမေးလ်",
+ "enable-share-url": "ဝေငှခြင်းကိုလင့်ကို ဖွင့်မည်",
+ "end-step": "အဆုံးအဆင့်",
+ "entry": "Entry URL",
+ "environment": "ပတ်ဝန်းကျင်",
+ "event": "အဖြစ်အပျက်",
+ "event-data": "အဖြစ်အပျက် ဒေတာ",
+ "event-name": "အဖြစ်အပျက်အမည်",
+ "events": "အဖြစ်အပျက်များ",
+ "exclude-bounce": "Bounce ဖယ်ထုတ်မည်",
+ "exists": "တည်ရှိသည်",
+ "exit": "Exit URL",
+ "false": "မှားသည်",
+ "fcp": "FCP",
+ "field": "Field အမည်",
+ "fields": "Field အမည်များ",
+ "filter": "စစ်ထုတ်မည်",
+ "filter-combined": "ပေါင်းစပ်ပြီး",
+ "filter-raw": "အရှိအတိုင်း",
+ "filters": "Filter များ",
+ "first-click": "ပထမဆုံးနှိပ်ချက်",
+ "first-seen": "ပထမဆုံးတွေ့ရှိချိန်",
+ "funnel": "ဖန်နယ်",
+ "funnel-description": "အသုံးပြုသူများ၏ ပြောင်းလဲမှုနှင့် ထွက်ခွာမှုနှုန်းကို နားလည်ပါ။",
+ "funnels": "ဖန်နယ်များ",
+ "goal": "ပန်းတိုင်",
+ "goals": "ပန်းတိုင်များ",
+ "goals-description": "စာမျက်နှာကြည့်ရှုမှုနှင့် အဖြစ်အပျက်များအတွက် ပန်းတိုင်များကို ခြေရာခံပါ။",
+ "good": "ကောင်း",
+ "greater-than": "ထက်ပို၍ကြီးသည်",
+ "greater-than-equals": "ထက်ပို၍ကြီးသည်သို့မဟုတ်တူသည်",
+ "grouped": "အုပ်စုဖွဲ့ထားသော",
+ "growth": "တိုးတက်မှု",
+ "hostname": "လက်ခံဆာဗာအမည်",
+ "hour": "နာရီ",
+ "includes": "ပါဝင်သည်",
+ "inp": "INP",
+ "insight": "ထိုးထွင်းသိမြင်မှု",
+ "insights": "အသေးစိတ်သိမြင်နိုင်ရန်",
+ "insights-description": "အပိုင်းခွဲများနှင့် စစ်ထုတ်ချက်များကို အသုံးပြု၍ သင့်ဒေတာကို ပိုမိုနက်ရှိုင်းစွာ လေ့လာပါ။",
+ "invalid-url": "မမှန်ကန်သော URL",
+ "is": "ဖြစ်သည်",
+ "is-false": "မှားသည်",
+ "is-not": "မဟုတ်ပါ",
+ "is-not-set": "သတ်မှတ်မထားပါ",
+ "is-set": "သတ်မှတ်ထားသည်",
+ "is-true": "မှန်သည်",
+ "join": "ဝင်မည်",
+ "join-team": "အသင်းဝင်မည်",
+ "journey": "ခရီးလမ်း",
+ "journey-description": "အသုံးပြုသူများ သင့်ဝက်ဘ်ဆိုဒ်ကို မည်သို့လှည့်လည်သည်ကို နားလည်ပါ။",
+ "journeys": "ခရီးလမ်းများ",
+ "language": "ဘာသာစကား",
+ "languages": "ဘာသာစကားများ",
+ "laptop": "လက်တော့ပ်",
+ "last-click": "နောက်ဆုံးနှိပ်ချက်",
+ "last-days": "လွန်ခဲ့သော {x} ရက်က",
+ "last-hours": "လွန်ခဲ့သော {x} နာရီက",
+ "last-months": "လွန်ခဲ့သော {x} လက",
+ "last-seen": "နောက်ဆုံးတွေ့ရှိချိန်",
+ "lcp": "LCP",
+ "leave": "ထွက်မည်",
+ "leave-team": "အသင်းမှထွက်မည်",
+ "less-than": "ထက်ပို၍ငယ်သည်",
+ "less-than-equals": "ထက်ပို၍ငယ်သည်သို့မဟုတ်တူသည်",
+ "link": "လင့်ခ်",
+ "links": "လင့်ခ်များ",
+ "location": "တည်နေရာ",
+ "login": "လော့ဂ်အင်",
+ "logout": "လော့ဂ်အောက်လုပ်မည်",
+ "manage": "စီမံမည်",
+ "manager": "မန်နေဂျာ",
+ "mask-level": "နှုတ်ဖုံးအဆင့်",
+ "match": "ကိုက်ညီ",
+ "match-all": "အားလုံး",
+ "match-any": "တစ်ခုခု",
+ "max": "အများဆုံး",
+ "max-duration": "အများဆုံး ကြာချိန်",
+ "maximize": "Expand",
+ "medium": "မီဒီယမ်",
+ "member": "အဖွဲ့ဝင်",
+ "members": "အဖွဲ့ဝင်များ",
+ "min": "အနည်းဆုံး",
+ "minute": "မိနစ်",
+ "mobile": "မိုဘိုင်း",
+ "model": "မော်ဒယ်",
+ "month": "လ",
+ "more": "နောက်ထပ်",
+ "my-account": "ကျွန်ုပ်၏အကောင့်",
+ "my-websites": "ကျွန်ုပ်၏ဝက်ဘ်ဆိုဒ်များ",
+ "name": "အမည်",
+ "needs-improvement": "တိုးတက်မှု လိုအပ်",
+ "new-password": "စကားဝှက်အသစ်",
+ "none": "မရှိပါ",
+ "number-of-records": "{x} {x, plural, one {မှတ်တမ်း} other {မှတ်တမ်းများ}}",
+ "ok": "OK",
+ "online": "အွန်လိုင်း",
+ "organic-search": "သဘာဝရှာဖွေမှု",
+ "organic-shopping": "သဘာဝစျေးဝယ်မှု",
+ "organic-social": "သဘာဝဆိုရှယ်",
+ "organic-video": "သဘာဝဗီဒီယို",
+ "os": "ကွန်ပျူတာလည်ပတ်မှုစနစ်",
+ "other": "အခြား",
+ "overview": "အပေါ်ယံမြင်ကွင်း",
+ "owner": "ပိုင်ဆိုင်သူ",
+ "page": "စာမျက်နှာ",
+ "page-of": "စာမျက်နှာ {current} / {total}",
+ "page-views": "ဝင်ရောက်ကြည့်ရှုသူ",
+ "pages": "စာမျက်နှာများ",
+ "pageTitle": "စာမျက်နှာခေါင်းစဥ်",
+ "paid-ads": "ငွေပေးကြော်ငြာ",
+ "paid-search": "ငွေပေးရှာဖွေမှု",
+ "paid-shopping": "ငွေပေးစျေးဝယ်မှု",
+ "paid-social": "ငွေပေးဆိုရှယ်",
+ "paid-video": "ငွေပေးဗီဒီယို",
+ "password": "စကားဝှက်",
+ "path": "လမ်းကြောင်း",
+ "paths": "လမ်းကြောင်းများ",
+ "performance": "စွမ်းဆောင်ရည်",
+ "pixel": "Pixel",
+ "pixels": "Pixel များ",
+ "play": "ဖွင့်မည်",
+ "poor": "ညံ့",
+ "powered-by": "{name} ထောက်ပံ့သည်",
+ "preferences": "စိတ်ကြိုက်ဆက်တင်များ",
+ "previous": "ယခင်",
+ "previous-period": "ယခင်ကာလ",
+ "previous-year": "ယခင်နှစ်",
+ "profile": "ပရိုဖိုင်း",
+ "profiles": "ပရိုဖိုင်းများ",
+ "properties": "ဂုဏ်သတ္တိများ",
+ "property": "ဂုဏ်သတ္တိ",
+ "queries": "Queries (ကွာရီများ)",
+ "query": "Query (ကွာရီ)",
+ "query-parameters": "Query parameters (ကွာရီပါရာမီတာများ)",
+ "realtime": "အချိန်နှင့်တပြေးညီ",
+ "recorded": "မှတ်တမ်းတင်ချိန်",
+ "referral": "ရည်ညွှန်းမှု",
+ "referrer": "ရည်ညွှန်းသူ",
+ "referrers": "ရည်ညွှန်းမှုများ",
+ "refresh": "Refresh လုပ်မည်",
+ "regenerate": "ပြန်ထုတ်မည်",
+ "regex-match": "Regex နှင့် ကိုက်ညီသည်",
+ "regex-not-match": "Regex နှင့် မကိုက်ညီပါ",
+ "region": "ဒေသ",
+ "regions": "ဒေသများ",
+ "remaining": "ကျန်ရှိနေသော",
+ "remove": "ဖျက်မည်",
+ "remove-member": "အဖွဲ့ဝင်ကို ဖယ်ရှားမည်",
+ "replay": "ပြန်ဖွင့်ခြင်း",
+ "replay-enabled": "ပြန်ဖွင့်ခြင်း ဖွင့်ထားသည်",
+ "replay-id": "Replay ID",
+ "replays": "ပြန်ဖွင့်ခြင်းများ",
+ "reports": "တင်ပြမှုများ",
+ "required": "လိုအပ်သည်",
+ "reset": "ပြန်စမည်",
+ "reset-website": "ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်မည်",
+ "retention": "ထိန်းသိမ်းနိုင်မှု",
+ "retention-days": "သိမ်းဆည်းရက်",
+ "retention-description": "အသုံးပြုသူများ မည်မျှမကြာခဏ ပြန်လာသည်ကို ခြေရာခံ၍ သင့်ဝက်ဘ်ဆိုဒ်၏ ဆွဲဆောင်နိုင်မှုကို တိုင်းတာပါ။",
+ "revenue": "ဝင်ငွေ",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "အခန်းကဏ္ဍ",
+ "run-query": "Query ကိုလုပ်ဆောင်မည်",
+ "sample-rate": "နမူနာနှုန်း",
+ "sample-size": "နမူနာအရွယ်အစား",
+ "save": "သိမ်းဆည်းမည်",
+ "save-cohort": "အုပ်စုသိမ်းမည်",
+ "save-segment": "အပိုင်းခွဲသိမ်းမည်",
+ "screen": "မျက်နှာပြင်",
+ "screens": "မြင်ကွင်းများ",
+ "search": "ရှာဖွေမည်",
+ "segment": "အပိုင်းခွဲ",
+ "segments": "အပိုင်းခွဲများ",
+ "select": "ရွေးချယ်မည်",
+ "select-component": "အစိတ်အပိုင်း ရွေးချယ်ပါ",
+ "select-date": "ရက်ရွေးပါ",
+ "select-filter": "စစ်ထုတ်ချက်ရွေးမည်",
+ "select-role": "အခန်းကဏ္ဍရွေးမည်",
+ "select-website": "ဝဘက်ဘ်ဆိုဒ်ရွေးပါ",
+ "session": "ဆက်ရှင်",
+ "session-data": "ဆက်ရှင်ဒေတာ",
+ "sessions": "ဆက်ရှင်များ",
+ "settings": "ဆက်တင်များ",
+ "share": "မျှဝေမည်",
+ "share-url": "URL ကိုရှဲမည်",
+ "single-day": "တစ်ရက်အတွင်း",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "အရင်းအမြစ်",
+ "sources": "အရင်းအမြစ်များ",
+ "start-step": "စတင်အဆင့်",
+ "steps": "အဆင့်များ",
+ "sum": "ပေါင်းလဒ်",
+ "support": "ပံ့ပိုးကူညီမှု",
+ "switch-account": "အကောင့်ပြောင်းမည်",
+ "table": "ဇယား",
+ "tablet": "တက်ဘလက်",
+ "tag": "တဂ်",
+ "tags": "တဂ်များ",
+ "team": "အသင်း",
+ "team-id": "အသင်း အိုင်ဒီ",
+ "team-manager": "အသင်းမန်နေဂျာ",
+ "team-member": "အသင်းဝင်",
+ "team-name": "အသင်းအမည်",
+ "team-owner": "အသင်းကိုပိုင်ဆိုင်သူ",
+ "team-settings": "အသင်းဆက်တင်များ",
+ "team-view-only": "အသင်း ကြည့်ရှုမှုသာ",
+ "team-websites": "အသင်းဝက်ဘ်ဆိုဒ်များ",
+ "teams": "အသင်းများ",
+ "term": "စည်းကမ်း",
+ "terms": "စည်းကမ်းများ",
+ "theme": "Theme (အပြင်အဆင်)",
+ "this-month": "ယခုလ",
+ "this-week": "ယခုအပတ်",
+ "this-year": "ယခုနှစ်",
+ "timezone": "အချိန်ဇုန်",
+ "title": "ခေါင်းစဥ်",
+ "today": "ယနေ့",
+ "toggle-charts": "ဇယားများကို အဖွင့်အပိတ်လုပ်မည်",
+ "total": "စုစုပေါင်း",
+ "total-records": "မှတ်တမ်းစုစုပေါင်း",
+ "tracking-code": "ထရက်လုပ်သည့် ကုဒ်",
+ "traffic": "အသွားအလာ",
+ "transactions": "ငွေလွှဲမှုများ",
+ "transfer": "လွှဲပြောင်းမည်",
+ "transfer-website": "ဝက်ဘ်ဆိုဒ်လွှဲပြောင်းမည်",
+ "true": "မှန်သည်",
+ "ttfb": "TTFB",
+ "type": "အမျိုးအစား",
+ "unique": "ထူးခြားသော",
+ "unique-events": "ထူးခြားအဖြစ်အပျက်များ",
+ "unique-visitors": "ဝင်ရောက်သူ (ထပ်ခြင်းမရှိ)",
+ "uniqueCustomers": "ထူးခြားဖောက်သည်များ",
+ "unknown": "မသိသော",
+ "untitled": "ခေါင်းစဉ်မရှိ",
+ "update": "အပ်ဒိတ်လုပ်မည်",
+ "url": "URL",
+ "user": "အသုံးပြုသူ",
+ "username": "အသုံးပြုသူအမည်",
+ "users": "အသုံးပြုသူများ",
+ "utm": "UTM",
+ "utm-campaign": "UTM ကမ်ပိန်း",
+ "utm-content": "UTM အကြောင်းအရာ",
+ "utm-description": "UTM ပါရာမီတာများမှတစ်ဆင့် သင့်ကမ်ပိန်းများကို ခြေရာခံပါ။",
+ "utm-medium": "UTM မီဒီယမ်",
+ "utm-source": "UTM အရင်းအမြစ်",
+ "utm-term": "UTM စည်းကမ်း",
+ "value": "တန်ဖိုး",
+ "version": "ဗားရှင်း",
+ "view": "ဝင်ရောက်ကြည့်ရှုမှု",
+ "view-details": "အသေးစိတ်ကို ကြည့်ရှုမည်",
+ "view-only": "ဝင်ရောက်ကြည့်ရှုမှုများသာ",
+ "views": "ဝင်ရောက်ကြည့်ရှုမှုများ",
+ "views-per-visit": "လည်ပတ်မှုတစ်ခုလျှင် ကြည့်ရှုမှု",
+ "visit-duration": "ဝဘက်ဘ်ဆိုဒ်တွင် ပျမ်းမျှကုန်ဆုံးချိန်",
+ "visitors": "ဝင်ရောက်ကြည့်ရှုသူများ",
+ "visits": "လည်ပတ်မှုများ",
+ "website": "ဝက်ဘ်ဆိုဒ်",
+ "website-id": "ဝက်ဘ်ဆိုဒ် အိုင်ဒီ",
+ "websites": "ဝက်ဘ်ဆိုဒ်များ",
+ "window": "ဝင်းဒိုး",
+ "yesterday": "မနေ့က"
+ },
+ "message": {
+ "action-confirmation": "အတည်ပြုရန် အောက်ပါအကွက်တွင် {confirmation} ကို ရိုက်ထည့်ပါ။",
+ "active-users": "{x} လက်ရှိအသုံးပြုနေသူ {x, plural, one {ယောက်} other {ယောက်}}",
+ "bad-request": "မမှန်ကန်သောတောင်းဆိုမှု",
+ "collected-data": "စုဆောင်းထားသောဒေတာ",
+ "confirm-delete": "{target} ကို ဖျက်ရန် သေချာပါသလား?",
+ "confirm-leave": "{target} ကို ထွက်ရန် သေချာပါသလား?",
+ "confirm-remove": "{target} ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား?",
+ "confirm-reset": "{target} ကို ဖျက်၍ပြန်စလုပ်ရန် သေချာပါသလား?",
+ "delete-team-warning": "အသင်းကိုဖျက်ပါက အသင်းဝက်ဘ်ဆိုဒ်များအားလုံးကိုပါ ဖျက်ပစ်မည်။",
+ "delete-website-warning": "ဝက်ဘ်ဆိုဒ် ဒေတာအကုန် ဖျက်မည်",
+ "empty-dashboard": "သင်၏ ဒက်ရ်ဘုတ် ဗလာဖြစ်နေသည်။ ပထမဆုံး အစိတ်အပိုင်း ထည့်ရန် တည်းဖြတ်ကို နှိပ်ပါ။",
+ "error": "မှားယွင်းမှုတစ်ခု ရှိသွားပါသည်",
+ "event-log": "{url} တွင် {event} ",
+ "forbidden": "ခွင့်ပြုချက်မရှိပါ",
+ "go-to-settings": "ဆက်တင်သို့ သွားရန်",
+ "incorrect-username-password": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားနေသည်",
+ "invalid-domain": "ဒိုမိန်း မမှန်ပါ http/https. မပါရပါ",
+ "min-password-length": "အနည်းဆုံး {n} character ရှိရမည်",
+ "new-version-available": "အူမာမီ {version} အသစ်ထွက်နေပါပြီ",
+ "no-data-available": "ဒေတာ မရှိပါ",
+ "no-event-data": "အဖြစ်အပျက်ဒေတာ မရှိပါ",
+ "no-match-password": "စကားဝှက် မှားနေသည်",
+ "no-results-found": "ရလဒ်မရှိပါ",
+ "no-team-websites": "ဤအသင်းတွင် ဝက်ဘ်ဆိုက်မရှိသေးပါ",
+ "no-teams": "အသင်း မပြုလုပ်ရသေးပါ",
+ "no-users": "အသုံးပြုသူ မရှိသေးပါ",
+ "no-websites-configured": "ဝက်ဘ်ဆိုဒ်တစ်ခုမှ မထည့်ရသေးပါ",
+ "not-found": "ရှာမတွေ့ပါ",
+ "nothing-selected": "ဘာမှရွေးမထားပါ။",
+ "page-not-found": "ဤစာမျက်နှာသည် မရှိပါ",
+ "reset-website": "ဤ ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်၍ ပြန်စလုပ်ရန် အောက်တွင် {confirmation} ကို ရိုက်ထည့်ပေးပါ",
+ "reset-website-warning": "ဤဝက်ဘ်ဆိုဒ်က စာရင်းအချက်အလက်များကို ဖျက်မည်၊ ဆက်တင်ဒေတာများ မပါပါ",
+ "saved": "မှတ်သားပြီး",
+ "select-component-preview": "အစိတ်အပိုင်းတစ်ခု ရွေးချယ်၍ ကြိုကြည့်ပါ",
+ "select-website-first": "ဦးစွာ ဝဘ်ဆိုက်တစ်ခု ရွေးချယ်ပါ",
+ "sever-error": "ဆာဗာအမှားအယွင်း",
+ "share-url": "သင့်ဝက်ဆိုဒ်ဘ်၏ စာရင်းအချက်အလက်များကို အောက်ပါ URL တွင် ဝင်ရောက်ကြည့်ရှုနိုင်သည်",
+ "team-already-member": "ဤအသင်းတွင် ဝင်ပြီးသားဖြစ်နေသည်",
+ "team-not-found": "အသင်း မရှိပါ",
+ "team-websites-info": "ဤဝက်ဘ်ဆိုဒ်များကို အသင်းထဲမှ လူတိုင်းဝင်ကြည့်နိုင်သည်",
+ "tracking-code": "ဤဝက်ဘ်ဆိုဒ်၏ ဒေတာကိုကောက်ခံရန် အောက်ပါ code ကို သင်၏ HTML တွင်ထည့်ပါ",
+ "transfer-team-website-to-user": "ဤဝက်ဘ်ဆိုဒ်ကို သင့်အကောင့်သို့ လွှဲပြောင်းမလား?",
+ "transfer-user-website-to-team": "ဤဝက်ဘ်ဆိုဒ်ကို လွှဲပြောင်းမည့် အသင်းကို ရွေးချယ်ပါ။",
+ "transfer-website": "ဝက်ဘ်ဆိုဒ်ပိုင်ဆိုင်မှုကို သင့်အကောင့် သို့မဟုတ် အခြားအသင်းသို့ လွှဲပြောင်းပါ။",
+ "triggered-event": "အစပျိုးလိုက်သော အဖြစ်အပျက်",
+ "unauthorized": "ခွင့်ပြုချက်မရှိပါ",
+ "user-deleted": "အသုံးပြုသူ ဖျက်ပြီးပါပြီ",
+ "viewed-page": "ကြည့်ရှုခဲ့သောစာမျက်နှာ",
+ "visitor-log": "{country} မှ {browser} ဖြင့် {os} {device} တွင် ဝင်ရောက်ကြည့်ရှုသူ"
+ }
}
diff --git a/public/intl/messages/nb-NO.json b/public/intl/messages/nb-NO.json
index bb2dec35a..e79a813ad 100644
--- a/public/intl/messages/nb-NO.json
+++ b/public/intl/messages/nb-NO.json
@@ -1,1872 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Tilgangskode"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Handlinger"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Aktivitetslogg"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Legg til"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Legg til beskrivelse"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Legg til bruker"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Legg til steg"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Legg til nettsted"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Etter"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alle"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Noensinne"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Gjennomsnnitt"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Tilbake"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Før"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Avvisningsfrekvens"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Nedbrytning"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Nettleser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Nettlesere"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Avvis"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Bytt passord"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Byer"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "By"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Tøm alle"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Sammenlign"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Bekreft"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Godkjenn passord"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Inneholder"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Fortsett"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Antall"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Opprett"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Opprett rapport"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Opprett team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Opprett bruker"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Opprettet"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Opprettet av"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Nåværende"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Nåværende passord"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Egendefinert utvalg"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Dashbord"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Dato"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datointervall"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dag"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Standard datoperiode"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Slett"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Slett nettstedet"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Stasjonær"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detaljer"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Enhet"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Enheter"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Avbryt"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Innholder ikke"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domene"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Rediger"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Rediger dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Rediger bruker"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Aktiver delings-URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Avslutt steg"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Inngangs-URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Hendelse"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Hendelsesdata"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Hendelser"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Utgangs-URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Usant"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Felt"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Felt"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinert"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Rå"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Først sett"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Trakt"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Forstå konverteringen og drop-off frafallsfrekvens av brukere."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Mål"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Mål"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Spor dine mål for sidevisninger og hendelser."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Mer enn"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Mer enn eller lik"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Vert"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Verter"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Innsikt"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dykk dypere i din data ved bruk av segmentering og filtre."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Er"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Er ikke"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Er ikke satt"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Er satt"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Bli med"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Bli med i teamet"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Reise"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Forstå hvordan brukerene navigerer gjennom din side."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Språk"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Språk"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Bærbar"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Siste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dager"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Siste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " timer"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Sist sett"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Forlat"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Forlat team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Mindre enn"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Mindre enn eller lik"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Logg inn"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logg ut"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Administrer"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Maks"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Bruker"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Brukere"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobiltelefon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mer"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Min konto"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mine nettsider"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Navn"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nytt passord"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Ingen"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Oversikt"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Eier"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Side "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " av "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Sidevisninger"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Sidetittel"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Sider"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Passord"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Sti"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Stier"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Drevet av "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Forrige"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Forrige periode"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Forrige år"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Egenskaper"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Egenskap"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Forspørsler"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Forespørsel"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Forespørsel parametere"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Sanntid"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Henviser"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Henvisere"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Oppdater"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerer"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regioner"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Fjern"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Fjern bruker"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Rapporter"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Påkrevd"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Nullstill"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Nullstill statistikk"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retensjon"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mål nettstedets klebrighet ved å spore hvor ofte brukere kommer tilbake."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Inntenker"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Se på inntektene dine over tid."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Inntektegenskaper"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rolle"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Kjør spørring"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Lagre"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Skjermer"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Søk"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Velg"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Velg dato"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Velg rolle"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Velg nettsted"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Økt"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Økter"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Innstillinger"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Del URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Enkeltdag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Starttrinn"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Trinn"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Nettbrett"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team-ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Teamadministrator"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Teammedlem"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Teamnavn"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Teameier"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team (kun visning)"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team-nettsteder"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Denne måneden"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Denne uka"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "I år"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Tidssone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Tittel"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "I dag"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Veksle grafer"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Totalt"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Totalt antall oppføringer"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Sporingskode"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transaksjoner"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Overfør"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Overfør nettsted"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Sant"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unike"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unike besøkende"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unike kunder"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Ukjent"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Uten tittel"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Oppdater"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL-er"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Bruker"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Brukeregenskap"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Brukernavn"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Brukere"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Spor kampanjene dine via UTM-parametre."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Verdi"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Vis"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Vis detaljer"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Kun visning"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visninger"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Visninger per besøk"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Gjennomsnittlig besøkstid"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Besøkende"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Besøk"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Nettsted"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Nettsted-ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Nettsteder"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Vindu"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "I går"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Skriv "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " i feltet nedenfor for å bekrefte."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "besøkende"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "besøkende"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " nå"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Innsamlede data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Er du sikker på at du vil slette "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Er du sikker på at du vil forlate "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Er du sikker på at du vil fjerne "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Er du sikker på at du vil nullstille statistikken til "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Å slette et team vil også slette alle teamets nettsteder."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Alle tilknyttede data vil også bli slettet."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Noe gikk galt."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " på "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Gå til innstillinger"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Ugyldig brukernavn/passord."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ugyldig domene"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimumslengde på "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " tegn"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "En ny versjon av Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " er tilgjengelig!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Ingen data tilgjengelig."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Ingen hendelsesdata er tilgjengelig."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passordene er ikke like"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Ingen resultater funnet."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Dette teamet har ingen nettsteder."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Du har ikke opprettet noen team."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Ingen brukere."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Du har ikke satt opp noen nettsteder."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Siden ble ikke funnet."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "For å nullstille dette nettstedet, skriv "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " i feltet nedenfor for å bekrefte."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistikk for dette nettstedet vil bli slettet, men sporingskoden forblir uberørt."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Lagret!"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Dette er den offentlige delings-URL-en for "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Du er allerede medlem av teamet."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Teamet ble ikke funnet."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Nettsteder kan vises av alle på teamet."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Sporingskode"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Overfør dette nettstedet til kontoen din?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Velg teamet du vil overføre dette nettstedet til."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Overfør eierskapet til nettstedet til din konto eller et annet team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Utløst hendelse"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Bruker slettet."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Vist side"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Besøkende fra "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " med "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " på "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Besøkende falt fra"
- }
- ]
+ "label": {
+ "access-code": "Tilgangskode",
+ "account": "Konto",
+ "action": "Handling",
+ "actions": "Handlinger",
+ "activity": "Aktivitetslogg",
+ "add": "Legg til",
+ "add-board": "Legg til tavle",
+ "add-description": "Legg til beskrivelse",
+ "add-link": "Legg til lenke",
+ "add-member": "Legg til bruker",
+ "add-pixel": "Legg til piksel",
+ "add-step": "Legg til steg",
+ "add-website": "Legg til nettsted",
+ "admin": "Administrator",
+ "affiliate": "Tilknyttet",
+ "after": "Etter",
+ "all": "Alle",
+ "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",
+ "average": "Gjennomsnnitt",
+ "back": "Tilbake",
+ "before": "Før",
+ "behavior": "Atferd",
+ "block-selector": "Blokkvelger",
+ "boards": "Tavler",
+ "bounce-rate": "Avvisningsfrekvens",
+ "breakdown": "Nedbrytning",
+ "browser": "Nettleser",
+ "browsers": "Nettlesere",
+ "campaign": "Kampanje",
+ "campaigns": "Kampanjer",
+ "cancel": "Avvis",
+ "change-password": "Bytt passord",
+ "channel": "Kanal",
+ "channels": "Kanaler",
+ "chart": "Diagram",
+ "cities": "Byer",
+ "city": "By",
+ "clear-all": "Tøm alle",
+ "cls": "CLS",
+ "cohort": "Kohort",
+ "cohorts": "Kohorter",
+ "compare": "Sammenlign",
+ "compare-dates": "Sammenlign datoer",
+ "confirm": "Bekreft",
+ "confirm-password": "Godkjenn passord",
+ "contains": "Inneholder",
+ "content": "Innhold",
+ "continue": "Fortsett",
+ "conversion": "Konvertering",
+ "conversion-rate": "Konverteringsrate",
+ "conversion-step": "Konverteringssteg",
+ "count": "Antall",
+ "countries": "Land",
+ "country": "Land",
+ "create": "Opprett",
+ "create-report": "Opprett rapport",
+ "create-team": "Opprett team",
+ "create-user": "Opprett bruker",
+ "created": "Opprettet",
+ "created-by": "Opprettet av",
+ "criteria": "Kriterier",
+ "currency": "Valuta",
+ "current": "Nåværende",
+ "current-password": "Nåværende passord",
+ "custom-range": "Egendefinert utvalg",
+ "dashboard": "Dashbord",
+ "data": "Data",
+ "date": "Dato",
+ "date-range": "Datointervall",
+ "day": "Dag",
+ "default-date-range": "Standard datoperiode",
+ "delete": "Slett",
+ "delete-report": "Slett rapport",
+ "delete-team": "Slett team",
+ "delete-user": "Slett bruker",
+ "delete-website": "Slett nettstedet",
+ "description": "Beskrivelse",
+ "desktop": "Stasjonær",
+ "destination-url": "Mål-URL",
+ "details": "Detaljer",
+ "device": "Enhet",
+ "devices": "Enheter",
+ "direct": "Direkte",
+ "dismiss": "Avbryt",
+ "distinct-id": "Unik ID",
+ "documentation": "Dokumentasjon",
+ "does-not-contain": "Innholder ikke",
+ "does-not-include": "Inkluderer ikke",
+ "doest-not-exist": "Eksisterer ikke",
+ "domain": "Domene",
+ "download": "Last ned",
+ "dropoff": "Frafall",
+ "duration": "Varighet",
+ "edit": "Rediger",
+ "edit-member": "Rediger bruker",
+ "email": "E-post",
+ "enable-share-url": "Aktiver delings-URL",
+ "end-step": "Avslutt steg",
+ "entry": "Inngangs-URL",
+ "environment": "Miljø",
+ "event": "Hendelse",
+ "event-data": "Hendelsesdata",
+ "event-name": "Hendelsesnavn",
+ "events": "Hendelser",
+ "exclude-bounce": "Ekskluder avvisning",
+ "exists": "Eksisterer",
+ "exit": "Utgangs-URL",
+ "false": "Usant",
+ "fcp": "FCP",
+ "field": "Felt",
+ "fields": "Felt",
+ "filter": "Filter",
+ "filter-combined": "Kombinert",
+ "filter-raw": "Rå",
+ "filters": "Filter",
+ "first-click": "Første klikk",
+ "first-seen": "Først sett",
+ "funnel": "Trakt",
+ "funnel-description": "Forstå konverteringen og drop-off frafallsfrekvens av brukere.",
+ "funnels": "Trakter",
+ "goal": "Mål",
+ "goals": "Mål",
+ "goals-description": "Spor dine mål for sidevisninger og hendelser.",
+ "good": "God",
+ "greater-than": "Mer enn",
+ "greater-than-equals": "Mer enn eller lik",
+ "grouped": "Gruppert",
+ "growth": "Vekst",
+ "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.",
+ "invalid-url": "Ugyldig URL",
+ "is": "Er",
+ "is-false": "Er usant",
+ "is-not": "Er ikke",
+ "is-not-set": "Er ikke satt",
+ "is-set": "Er satt",
+ "is-true": "Er sant",
+ "join": "Bli med",
+ "join-team": "Bli med i teamet",
+ "journey": "Reise",
+ "journey-description": "Forstå hvordan brukerene navigerer gjennom din side.",
+ "journeys": "Reiser",
+ "language": "Språk",
+ "languages": "Språk",
+ "laptop": "Bærbar",
+ "last-click": "Siste klikk",
+ "last-days": "Siste {x} dager",
+ "last-hours": "Siste {x} timer",
+ "last-months": "Siste {x} måneder",
+ "last-seen": "Sist sett",
+ "lcp": "LCP",
+ "leave": "Forlat",
+ "leave-team": "Forlat team",
+ "less-than": "Mindre enn",
+ "less-than-equals": "Mindre enn eller lik",
+ "link": "Lenke",
+ "links": "Lenker",
+ "location": "Plassering",
+ "login": "Logg inn",
+ "logout": "Logg ut",
+ "manage": "Administrer",
+ "manager": "Administrator",
+ "mask-level": "Maskenivå",
+ "match": "Samsvar",
+ "match-all": "Alle",
+ "match-any": "Enhver",
+ "max": "Maks",
+ "max-duration": "Maksimal varighet",
+ "maximize": "Utvid",
+ "medium": "Medium",
+ "member": "Bruker",
+ "members": "Brukere",
+ "min": "Min",
+ "minute": "Minutt",
+ "mobile": "Mobiltelefon",
+ "model": "Modell",
+ "month": "Måned",
+ "more": "Mer",
+ "my-account": "Min konto",
+ "my-websites": "Mine nettsider",
+ "name": "Navn",
+ "needs-improvement": "Trenger forbedring",
+ "new-password": "Nytt passord",
+ "none": "Ingen",
+ "number-of-records": "{x} {x, plural, one {post} other {poster}}",
+ "ok": "OK",
+ "online": "Tilkoblet",
+ "organic-search": "Organisk søk",
+ "organic-shopping": "Organisk handel",
+ "organic-social": "Organisk sosial",
+ "organic-video": "Organisk video",
+ "os": "OS",
+ "other": "Annet",
+ "overview": "Oversikt",
+ "owner": "Eier",
+ "page": "Side",
+ "page-of": "Side {current} av {total}",
+ "page-views": "Sidevisninger",
+ "pages": "Sider",
+ "pageTitle": "Sidetittel",
+ "paid-ads": "Betalte annonser",
+ "paid-search": "Betalt søk",
+ "paid-shopping": "Betalt handel",
+ "paid-social": "Betalt sosial",
+ "paid-video": "Betalt video",
+ "password": "Passord",
+ "path": "Sti",
+ "paths": "Stier",
+ "performance": "Ytelse",
+ "pixel": "Piksel",
+ "pixels": "Piksler",
+ "play": "Spill av",
+ "poor": "Dårlig",
+ "powered-by": "Drevet av {name}",
+ "preferences": "Innstillinger",
+ "previous": "Forrige",
+ "previous-period": "Forrige periode",
+ "previous-year": "Forrige år",
+ "profile": "Profil",
+ "profiles": "Profiler",
+ "properties": "Egenskaper",
+ "property": "Egenskap",
+ "queries": "Forspørsler",
+ "query": "Forespørsel",
+ "query-parameters": "Forespørsel parametere",
+ "realtime": "Sanntid",
+ "recorded": "Registrert den",
+ "referral": "Henvisning",
+ "referrer": "Henviser",
+ "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",
+ "replay": "Avspilling",
+ "replay-enabled": "Avspilling aktivert",
+ "replay-id": "Replay ID",
+ "replays": "Avspillinger",
+ "reports": "Rapporter",
+ "required": "Påkrevd",
+ "reset": "Nullstill",
+ "reset-website": "Nullstill statistikk",
+ "retention": "Retensjon",
+ "retention-days": "Oppbevaringsdager",
+ "retention-description": "Mål nettstedets klebrighet ved å spore hvor ofte brukere kommer tilbake.",
+ "revenue": "Inntenker",
+ "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-segment": "Lagre segment",
+ "screen": "Skjerm",
+ "screens": "Skjermer",
+ "search": "Søk",
+ "segment": "Segment",
+ "segments": "Segmenter",
+ "select": "Velg",
+ "select-component": "Velg komponent",
+ "select-date": "Velg dato",
+ "select-filter": "Velg filter",
+ "select-role": "Velg rolle",
+ "select-website": "Velg nettsted",
+ "session": "Økt",
+ "session-data": "Øktdata",
+ "sessions": "Økter",
+ "settings": "Innstillinger",
+ "share": "Del",
+ "share-url": "Del URL",
+ "single-day": "Enkeltdag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Kilde",
+ "sources": "Kilder",
+ "start-step": "Starttrinn",
+ "steps": "Trinn",
+ "sum": "Sum",
+ "support": "Støtte",
+ "switch-account": "Bytt konto",
+ "table": "Tabell",
+ "tablet": "Nettbrett",
+ "tag": "Tagg",
+ "tags": "Tagger",
+ "team": "Lag",
+ "team-id": "Team-ID",
+ "team-manager": "Teamadministrator",
+ "team-member": "Teammedlem",
+ "team-name": "Teamnavn",
+ "team-owner": "Teameier",
+ "team-settings": "Teaminnstillinger",
+ "team-view-only": "Team (kun visning)",
+ "team-websites": "Team-nettsteder",
+ "teams": "Team",
+ "term": "Søkeord",
+ "terms": "Vilkår",
+ "theme": "Tema",
+ "this-month": "Denne måneden",
+ "this-week": "Denne uka",
+ "this-year": "I år",
+ "timezone": "Tidssone",
+ "title": "Tittel",
+ "today": "I dag",
+ "toggle-charts": "Veksle grafer",
+ "total": "Totalt",
+ "total-records": "Totalt antall oppføringer",
+ "tracking-code": "Sporingskode",
+ "traffic": "Trafikk",
+ "transactions": "Transaksjoner",
+ "transfer": "Overfør",
+ "transfer-website": "Overfør nettsted",
+ "true": "Sant",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "unique": "Unike",
+ "unique-events": "Unike hendelser",
+ "unique-visitors": "Unike besøkende",
+ "uniqueCustomers": "Unike kunder",
+ "unknown": "Ukjent",
+ "untitled": "Uten tittel",
+ "update": "Oppdater",
+ "url": "URL",
+ "user": "Bruker",
+ "username": "Brukernavn",
+ "users": "Brukere",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampanje",
+ "utm-content": "UTM-innhold",
+ "utm-description": "Spor kampanjene dine via UTM-parametre.",
+ "utm-medium": "UTM-medium",
+ "utm-source": "UTM-kilde",
+ "utm-term": "UTM-søkeord",
+ "value": "Verdi",
+ "version": "Versjon",
+ "view": "Vis",
+ "view-details": "Vis detaljer",
+ "view-only": "Kun visning",
+ "views": "Visninger",
+ "views-per-visit": "Visninger per besøk",
+ "visit-duration": "Gjennomsnittlig besøkstid",
+ "visitors": "Besøkende",
+ "visits": "Besøk",
+ "website": "Nettsted",
+ "website-id": "Nettsted-ID",
+ "websites": "Nettsteder",
+ "window": "Vindu",
+ "yesterday": "I går"
+ },
+ "message": {
+ "action-confirmation": "Skriv {confirmation} i feltet nedenfor for å bekrefte.",
+ "active-users": "{x} {x, plural, one {besøkende} other {besøkende}} nå",
+ "bad-request": "Ugyldig forespørsel",
+ "collected-data": "Innsamlede data",
+ "confirm-delete": "Er du sikker på at du vil slette {target}?",
+ "confirm-leave": "Er du sikker på at du vil forlate {target} ?",
+ "confirm-remove": "Er du sikker på at du vil fjerne {target} ?",
+ "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.",
+ "event-log": "{event} på {url} ",
+ "forbidden": "Forbudt",
+ "go-to-settings": "Gå til innstillinger",
+ "incorrect-username-password": "Ugyldig brukernavn/passord.",
+ "invalid-domain": "Ugyldig domene",
+ "min-password-length": "Minimumslengde på {n} tegn",
+ "new-version-available": "En ny versjon av Umami {version} er tilgjengelig!",
+ "no-data-available": "Ingen data tilgjengelig.",
+ "no-event-data": "Ingen hendelsesdata er tilgjengelig.",
+ "no-match-password": "Passordene er ikke like",
+ "no-results-found": "Ingen resultater funnet.",
+ "no-team-websites": "Dette teamet har ingen nettsteder.",
+ "no-teams": "Du har ikke opprettet noen team.",
+ "no-users": "Ingen brukere.",
+ "no-websites-configured": "Du har ikke satt opp noen nettsteder.",
+ "not-found": "Ikke funnet",
+ "nothing-selected": "Ingenting valgt.",
+ "page-not-found": "Siden ble ikke funnet.",
+ "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-component-preview": "Velg en komponent for forhåndsvisning",
+ "select-website-first": "Velg et nettsted først",
+ "sever-error": "Serverfeil",
+ "share-url": "Dette er den offentlige delings-URL-en for {target}.",
+ "team-already-member": "Du er allerede medlem av teamet.",
+ "team-not-found": "Teamet ble ikke funnet.",
+ "team-websites-info": "Nettsteder kan vises av alle på teamet.",
+ "tracking-code": "Sporingskode",
+ "transfer-team-website-to-user": "Overfør dette nettstedet til kontoen din?",
+ "transfer-user-website-to-team": "Velg teamet du vil overføre dette nettstedet til.",
+ "transfer-website": "Overfør eierskapet til nettstedet til din konto eller et annet team.",
+ "triggered-event": "Utløst hendelse",
+ "unauthorized": "Ikke autorisert",
+ "user-deleted": "Bruker slettet.",
+ "viewed-page": "Vist side",
+ "visitor-log": "Besøkende fra {country} med {browser} på {os} {device} "
+ }
}
diff --git a/public/intl/messages/nl-NL.json b/public/intl/messages/nl-NL.json
index d7ea5c9f2..8c617dab7 100644
--- a/public/intl/messages/nl-NL.json
+++ b/public/intl/messages/nl-NL.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Toegangscode"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Acties"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activiteiten logboek"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Toevoegen"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Omschrijving toevoegen"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Website koppelen"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Na"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alles"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Onbeperkt"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Gemiddelde"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Terug"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Voor"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bouncepercentage"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Opsplitsen"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Annuleren"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Wachtwoord wijzigen"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Steden"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Stad"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Filters wissen"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Bevestigen"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Wachtwoord bevestigen"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Bevat"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Doorgaan"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Landen"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Aanmaken"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Rapport aanmaken"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Team aanmaken"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Gebruiker maken"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Gemaakt"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Gemaakt Door"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Huidig wachtwoord"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Aangepast bereik"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Overzicht"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Gegevens"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Datumbereik"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dag"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Standaard bereik"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Verwijderen"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Rapport verwijderen"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Team verwijderen"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Verwijder gebruiker"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Website verwijderen"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Omschrijving"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Computer"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Informatie"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Apparaat"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Apparaten"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Negeren"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Bevat geen"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domein"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Uitval"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Bewerken"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Dashboard aanpassen"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Gebruiker aanpassen"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Sta delen via openbare URL toe"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Gebeurtenis"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Datum gebeurtenis"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Gebeurtenissen"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Onwaar"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Veld"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Velden"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Gecombineerd"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Ruw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Ontdek de conversie- en uitvalpercentages van gebruikers."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Groter dan"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Groter of gelijk aan"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Inzichten"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Verken je gegevens verder door segmenten en filters te gebruiken."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is niet"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is niet ingesteld"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is ingesteld"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Lid worden"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Word lid van een team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Taal"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Talen"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Laatste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dagen"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Laatste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " uur"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Verlaten"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Verlaat team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Minder dan"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Minder of gelijk aan"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Inloggen"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Uitloggen"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Beheren"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Gebruiker"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Gebruikers"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobiel"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Toon meer"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Mijn profiel"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mijn websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Naam"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nieuw wachtwoord"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Geen"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overzicht"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Eigenaar"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Pagina "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " van "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Paginaweergaven"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Pagina titel"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pagina's"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Wachtwoord"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "mogelijk gemaakt door "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profiel"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Parameters"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "URL-parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Actueel"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Verwijzers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Vernieuwen"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Opnieuw genereren"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Regio"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regio's"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Verwijderen"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Gebruiker verwijderen"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Rapporten"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Verplicht"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Opnieuw instellen"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Statistieken opnieuw instellen"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retentie"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Meet de retentie van je website door door bij te houden hoe vaak gebruikers terugkeren."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Gebruikersrol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Query uitvoeren"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Opslaan"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Schermen"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Zoeken"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Selecteer"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Datum selecteren"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Rol selecteren"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Website selecteren"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessies"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Instellingen"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "URL delen"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Enkele dag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Som"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Teamlid"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Teamnaam"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Teameigenaar"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team alleen lezen"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Thema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Deze maand"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Deze week"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Dit jaar"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Tijdzone"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titel"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Vandaag"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Grafieken tonen/verbergen"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Totaal"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Totaal records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Volgcode"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Waar"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unieke bezoekers"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Onbekend"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Ongetiteld"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URL's"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Gebruiker"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Gebruikersnaam"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Gebruikers"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Waarde"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Weergave"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Meer details"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Alleen inzien"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Weergaven"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Gemiddelde bezoektijd"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Bezoekers"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Gisteren"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Typ "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in het veld hieronder om te bevestigen."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " actieve "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "bezoeker"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "bezoekers"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Weet je zeker dat je "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " wilt verwijderen?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Weet je zeker dat je "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " wilt verlaten?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Weet je zeker dat je "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " wilt verwijderen?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Weet je zeker dat je de statistieken van "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " opnieuw wilt instellen?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Als een team wordt verwijderd, worden ook alle websites van dat team verwijderd."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Alle verwante gegevens zullen ook verwijderd worden."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Er is iets misgegaan."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " op "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Naar instellingen"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Incorrecte gebruikersnaam/wachtwoord."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ongeldig domein"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimale lengte van "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " tekens"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Een nieuwe versie van Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is beschikbaar!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Geen gegevens beschikbaar."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Geen gegevens over de gebeurtenis beschikbaar."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Wachtwoorden komen niet overeen"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Geen resultaten gevonden."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Er zijn geen websites gekoppeld aan dit team."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Er zijn nog geen teams aangemaakt."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Er zijn geen gebruikers."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Je hebt geen websites ingesteld."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Pagina niet gevonden."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Typ "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in het veld hieronder om te bevestigen dat je de website wilt resetten."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Alle bijhorende statistieken van deze website worden verwijderd, maar jouw volgcode blijft gelden."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Opslaan succesvol."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Met deze URL kan "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " openbaar gedeeld worden."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Je bent al lid van het team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team niet gevonden."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites kunnen door iedereen in het team worden bekeken."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Volgcode"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Deze website toevoegen aan je account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Selecteer het team om deze website aan toe te voegen."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Draag het eigenaarschap van de website over naar jouw account, of een ander team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Getriggerde gebeurtenis"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Gebruiker verwijderd"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Bekeken pagina"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Bezoeker uit "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " met "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " op een "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Afgehaakte bezoekers"
- }
- ]
+ "label": {
+ "access-code": "Toegangscode",
+ "account": "Account",
+ "action": "Actie",
+ "actions": "Acties",
+ "activity": "Activiteiten logboek",
+ "add": "Toevoegen",
+ "add-board": "Bord toevoegen",
+ "add-description": "Omschrijving toevoegen",
+ "add-link": "Link toevoegen",
+ "add-member": "Lid toevoegen",
+ "add-pixel": "Pixel toevoegen",
+ "add-step": "Stap toevoegen",
+ "add-website": "Website koppelen",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Na",
+ "all": "Alles",
+ "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",
+ "average": "Gemiddelde",
+ "back": "Terug",
+ "before": "Voor",
+ "behavior": "Gedrag",
+ "block-selector": "Blokselectie",
+ "boards": "Borden",
+ "bounce-rate": "Bouncepercentage",
+ "breakdown": "Opsplitsen",
+ "browser": "Browser",
+ "browsers": "Browsers",
+ "campaign": "Campagne",
+ "campaigns": "Campagnes",
+ "cancel": "Annuleren",
+ "change-password": "Wachtwoord wijzigen",
+ "channel": "Kanaal",
+ "channels": "Kanalen",
+ "chart": "Grafiek",
+ "cities": "Steden",
+ "city": "Stad",
+ "clear-all": "Filters wissen",
+ "cls": "CLS",
+ "cohort": "Cohort",
+ "cohorts": "Cohorten",
+ "compare": "Vergelijken",
+ "compare-dates": "Datums vergelijken",
+ "confirm": "Bevestigen",
+ "confirm-password": "Wachtwoord bevestigen",
+ "contains": "Bevat",
+ "content": "Inhoud",
+ "continue": "Doorgaan",
+ "conversion": "Conversie",
+ "conversion-rate": "Conversieratio",
+ "conversion-step": "Conversiestap",
+ "count": "Aantal",
+ "countries": "Landen",
+ "country": "Land",
+ "create": "Aanmaken",
+ "create-report": "Rapport aanmaken",
+ "create-team": "Team aanmaken",
+ "create-user": "Gebruiker maken",
+ "created": "Gemaakt",
+ "created-by": "Gemaakt Door",
+ "criteria": "Criteria",
+ "currency": "Valuta",
+ "current": "Huidig",
+ "current-password": "Huidig wachtwoord",
+ "custom-range": "Aangepast bereik",
+ "dashboard": "Overzicht",
+ "data": "Gegevens",
+ "date": "Datum",
+ "date-range": "Datumbereik",
+ "day": "Dag",
+ "default-date-range": "Standaard bereik",
+ "delete": "Verwijderen",
+ "delete-report": "Rapport verwijderen",
+ "delete-team": "Team verwijderen",
+ "delete-user": "Gebruiker verwijderen",
+ "delete-website": "Website verwijderen",
+ "description": "Beschrijving",
+ "desktop": "Computer",
+ "destination-url": "Bestemmings-URL",
+ "details": "Informatie",
+ "device": "Apparaat",
+ "devices": "Apparaten",
+ "direct": "Direct",
+ "dismiss": "Negeren",
+ "distinct-id": "Uniek ID",
+ "documentation": "Documentatie",
+ "does-not-contain": "Bevat geen",
+ "does-not-include": "Bevat niet",
+ "doest-not-exist": "Bestaat niet",
+ "domain": "Domein",
+ "download": "Downloaden",
+ "dropoff": "Uitval",
+ "duration": "Duur",
+ "edit": "Bewerken",
+ "edit-member": "Gebruiker aanpassen",
+ "email": "E-mail",
+ "enable-share-url": "Sta delen via openbare URL toe",
+ "end-step": "Eindstap",
+ "entry": "Entry URL",
+ "environment": "Omgeving",
+ "event": "Gebeurtenis",
+ "event-data": "Datum gebeurtenis",
+ "event-name": "Gebeurtenisnaam",
+ "events": "Gebeurtenissen",
+ "exclude-bounce": "Bounce uitsluiten",
+ "exists": "Bestaat",
+ "exit": "Exit URL",
+ "false": "Onwaar",
+ "fcp": "FCP",
+ "field": "Veld",
+ "fields": "Velden",
+ "filter": "Filter",
+ "filter-combined": "Gecombineerd",
+ "filter-raw": "Ruw",
+ "filters": "Filters",
+ "first-click": "Eerste klik",
+ "first-seen": "Eerst gezien",
+ "funnel": "Trechter",
+ "funnel-description": "Ontdek de conversie- en uitvalpercentages van gebruikers.",
+ "funnels": "Trechters",
+ "goal": "Doel",
+ "goals": "Doelen",
+ "goals-description": "Volg je doelen voor paginaweergaven en gebeurtenissen.",
+ "good": "Goed",
+ "greater-than": "Groter dan",
+ "greater-than-equals": "Groter of gelijk aan",
+ "grouped": "Gegroepeerd",
+ "growth": "Groei",
+ "hostname": "Hostnaam",
+ "hour": "Uur",
+ "includes": "Bevat",
+ "inp": "INP",
+ "insight": "Inzicht",
+ "insights": "Inzichten",
+ "insights-description": "Verken je gegevens verder door segmenten en filters te gebruiken.",
+ "invalid-url": "Ongeldige URL",
+ "is": "Is",
+ "is-false": "Is onwaar",
+ "is-not": "Is niet",
+ "is-not-set": "Is niet ingesteld",
+ "is-set": "Is ingesteld",
+ "is-true": "Is waar",
+ "join": "Lid worden",
+ "join-team": "Word lid van een team",
+ "journey": "Reis",
+ "journey-description": "Begrijp hoe gebruikers door je website navigeren.",
+ "journeys": "Reizen",
+ "language": "Taal",
+ "languages": "Talen",
+ "laptop": "Laptop",
+ "last-click": "Laatste klik",
+ "last-days": "Laatste {x} dagen",
+ "last-hours": "Laatste {x} uur",
+ "last-months": "Laatste {x} maanden",
+ "last-seen": "Laatst gezien",
+ "lcp": "LCP",
+ "leave": "Verlaten",
+ "leave-team": "Verlaat team",
+ "less-than": "Minder dan",
+ "less-than-equals": "Minder of gelijk aan",
+ "link": "Link",
+ "links": "Koppelingen",
+ "location": "Locatie",
+ "login": "Inloggen",
+ "logout": "Uitloggen",
+ "manage": "Beheren",
+ "manager": "Beheerder",
+ "mask-level": "Maskeerniveau",
+ "match": "Overeenkomst",
+ "match-all": "Alle",
+ "match-any": "Elk",
+ "max": "Max",
+ "max-duration": "Maximale duur",
+ "maximize": "Uitvouwen",
+ "medium": "Medium",
+ "member": "Gebruiker",
+ "members": "Gebruikers",
+ "min": "Min",
+ "minute": "Minuut",
+ "mobile": "Mobiel",
+ "model": "Model",
+ "month": "Maand",
+ "more": "Toon meer",
+ "my-account": "Mijn profiel",
+ "my-websites": "Mijn websites",
+ "name": "Naam",
+ "needs-improvement": "Verbetering nodig",
+ "new-password": "Nieuw wachtwoord",
+ "none": "Geen",
+ "number-of-records": "{x} {x, plural, one {record} other {records}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organisch zoeken",
+ "organic-shopping": "Organisch winkelen",
+ "organic-social": "Organisch sociaal",
+ "organic-video": "Organische video",
+ "os": "OS",
+ "other": "Overig",
+ "overview": "Overzicht",
+ "owner": "Eigenaar",
+ "page": "Pagina",
+ "page-of": "Pagina {current} van {total}",
+ "page-views": "Paginaweergaven",
+ "pages": "Pagina's",
+ "pageTitle": "Pagina titel",
+ "paid-ads": "Betaalde advertenties",
+ "paid-search": "Betaald zoeken",
+ "paid-shopping": "Betaald winkelen",
+ "paid-social": "Betaald sociaal",
+ "paid-video": "Betaalde video",
+ "password": "Wachtwoord",
+ "path": "Pad",
+ "paths": "Paden",
+ "performance": "Prestaties",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Afspelen",
+ "poor": "Slecht",
+ "powered-by": "mogelijk gemaakt door {name}",
+ "preferences": "Voorkeuren",
+ "previous": "Vorige",
+ "previous-period": "Vorige periode",
+ "previous-year": "Vorig jaar",
+ "profile": "Profiel",
+ "profiles": "Profielen",
+ "properties": "Eigenschappen",
+ "property": "Eigenschap",
+ "queries": "Parameters",
+ "query": "Query",
+ "query-parameters": "URL-parameters",
+ "realtime": "Actueel",
+ "recorded": "Opgenomen op",
+ "referral": "Verwijzing",
+ "referrer": "Verwijzer",
+ "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",
+ "replay": "Herhaling",
+ "replay-enabled": "Herhaling ingeschakeld",
+ "replay-id": "Replay ID",
+ "replays": "Herhalingen",
+ "reports": "Rapporten",
+ "required": "Verplicht",
+ "reset": "Opnieuw instellen",
+ "reset-website": "Statistieken opnieuw instellen",
+ "retention": "Retentie",
+ "retention-days": "Bewaardagen",
+ "retention-description": "Meet de retentie van je website door door bij te houden hoe vaak gebruikers terugkeren.",
+ "revenue": "Omzet",
+ "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-segment": "Segment opslaan",
+ "screen": "Scherm",
+ "screens": "Schermen",
+ "search": "Zoeken",
+ "segment": "Segment",
+ "segments": "Segmenten",
+ "select": "Selecteer",
+ "select-component": "Component selecteren",
+ "select-date": "Datum selecteren",
+ "select-filter": "Filter selecteren",
+ "select-role": "Rol selecteren",
+ "select-website": "Website selecteren",
+ "session": "Sessie",
+ "session-data": "Sessiegegevens",
+ "sessions": "Sessies",
+ "settings": "Instellingen",
+ "share": "Delen",
+ "share-url": "URL delen",
+ "single-day": "Enkele dag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Bron",
+ "sources": "Bronnen",
+ "start-step": "Startstap",
+ "steps": "Stappen",
+ "sum": "Som",
+ "support": "Ondersteuning",
+ "switch-account": "Wissel van account",
+ "table": "Tabel",
+ "tablet": "Tablet",
+ "tag": "Label",
+ "tags": "Labels",
+ "team": "Team",
+ "team-id": "Team-ID",
+ "team-manager": "Teamleider",
+ "team-member": "Teamlid",
+ "team-name": "Teamnaam",
+ "team-owner": "Teameigenaar",
+ "team-settings": "Teaminstellingen",
+ "team-view-only": "Team alleen lezen",
+ "team-websites": "Teamwebsites",
+ "teams": "Teams",
+ "term": "Zoekterm",
+ "terms": "Voorwaarden",
+ "theme": "Thema",
+ "this-month": "Deze maand",
+ "this-week": "Deze week",
+ "this-year": "Dit jaar",
+ "timezone": "Tijdzone",
+ "title": "Titel",
+ "today": "Vandaag",
+ "toggle-charts": "Grafieken tonen/verbergen",
+ "total": "Totaal",
+ "total-records": "Totaal records",
+ "tracking-code": "Volgcode",
+ "traffic": "Verkeer",
+ "transactions": "Transacties",
+ "transfer": "Overdragen",
+ "transfer-website": "Website overdragen",
+ "true": "Waar",
+ "ttfb": "TTFB",
+ "type": "Type",
+ "unique": "Uniek",
+ "unique-events": "Unieke gebeurtenissen",
+ "unique-visitors": "Unieke bezoekers",
+ "uniqueCustomers": "Unieke klanten",
+ "unknown": "Onbekend",
+ "untitled": "Ongetiteld",
+ "update": "Bijwerken",
+ "url": "URL",
+ "user": "Gebruiker",
+ "username": "Gebruikersnaam",
+ "users": "Gebruikers",
+ "utm": "UTM",
+ "utm-campaign": "UTM-campagne",
+ "utm-content": "UTM-inhoud",
+ "utm-description": "Volg je campagnes via UTM-parameters.",
+ "utm-medium": "UTM-medium",
+ "utm-source": "UTM-bron",
+ "utm-term": "UTM-term",
+ "value": "Waarde",
+ "version": "Versie",
+ "view": "Weergave",
+ "view-details": "Meer details",
+ "view-only": "Alleen inzien",
+ "views": "Weergaven",
+ "views-per-visit": "Weergaven per bezoek",
+ "visit-duration": "Gemiddelde bezoektijd",
+ "visitors": "Bezoekers",
+ "visits": "Bezoeken",
+ "website": "Website",
+ "website-id": "Website-ID",
+ "websites": "Websites",
+ "window": "Venster",
+ "yesterday": "Gisteren"
+ },
+ "message": {
+ "action-confirmation": "Typ {confirmation} in het veld hieronder om te bevestigen.",
+ "active-users": "{x} actieve {x, plural, one {bezoeker} other {bezoekers}}",
+ "bad-request": "Ongeldig verzoek",
+ "collected-data": "Verzamelde gegevens",
+ "confirm-delete": "Weet je zeker dat je {target} wilt verwijderen?",
+ "confirm-leave": "Weet je zeker dat je {target} wilt verlaten?",
+ "confirm-remove": "Weet je zeker dat je {target} wilt verwijderen?",
+ "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.",
+ "event-log": "{event} op {url} ",
+ "forbidden": "Verboden",
+ "go-to-settings": "Naar instellingen",
+ "incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.",
+ "invalid-domain": "Ongeldig domein",
+ "min-password-length": "Minimale lengte van {n} tekens",
+ "new-version-available": "Een nieuwe versie van Umami {version} is beschikbaar!",
+ "no-data-available": "Geen gegevens beschikbaar.",
+ "no-event-data": "Geen gegevens over de gebeurtenis beschikbaar.",
+ "no-match-password": "Wachtwoorden komen niet overeen",
+ "no-results-found": "Geen resultaten gevonden.",
+ "no-team-websites": "Er zijn geen websites gekoppeld aan dit team.",
+ "no-teams": "Er zijn nog geen teams aangemaakt.",
+ "no-users": "Er zijn geen gebruikers.",
+ "no-websites-configured": "Je hebt geen websites ingesteld.",
+ "not-found": "Niet gevonden",
+ "nothing-selected": "Niets geselecteerd.",
+ "page-not-found": "Pagina niet gevonden.",
+ "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-component-preview": "Selecteer een component voor een voorvertoning",
+ "select-website-first": "Selecteer eerst een website",
+ "sever-error": "Serverfout",
+ "share-url": "Met deze URL kan {target} openbaar gedeeld worden.",
+ "team-already-member": "Je bent al lid van het team.",
+ "team-not-found": "Team niet gevonden.",
+ "team-websites-info": "Websites kunnen door iedereen in het team worden bekeken.",
+ "tracking-code": "Volgcode",
+ "transfer-team-website-to-user": "Deze website toevoegen aan je account?",
+ "transfer-user-website-to-team": "Selecteer het team om deze website aan toe te voegen.",
+ "transfer-website": "Draag het eigenaarschap van de website over naar jouw account, of een ander team.",
+ "triggered-event": "Getriggerde gebeurtenis",
+ "unauthorized": "Niet geautoriseerd",
+ "user-deleted": "Gebruiker verwijderd",
+ "viewed-page": "Bekeken pagina",
+ "visitor-log": "Bezoeker uit {country} met {browser} op een {os} {device} "
+ }
}
diff --git a/public/intl/messages/pl-PL.json b/public/intl/messages/pl-PL.json
index 97782a412..7803fcd38 100644
--- a/public/intl/messages/pl-PL.json
+++ b/public/intl/messages/pl-PL.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Kod dostępu"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Działania"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Dziennik aktywności"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Dodaj"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Dodaj opis"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Dodaj członka"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Dodaj krok"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Dodaj witrynę"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Po"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Wszystkie"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Cały czas"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analityka"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Średnia"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Powrót"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Przed"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Współczynnik odrzuceń"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Rozbicie"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Przeglądarka"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Przeglądarki"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Anuluj"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Zmień hasło"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Miasta"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Miasto"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Wyczyść wszystko"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Porównaj"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Potwierdź"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potwierdź hasło"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Zawiera"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Kontynuuj"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Liczba"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Kraje"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Państwo"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Utwórz"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Utwórz raport"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Utwórz zespół"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Utwórz użytkownika"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Utworzony"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Utworzony przez"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Aktualny"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Aktualne hasło"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Zakres niestandardowy"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Panel"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Dane"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Zakres dat"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dzień"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Domyślny zakres dat"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Usuń"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Usuń raport"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Usuń zespół"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Usuń użytkownika"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Usuń witrynę"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Opis"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Komputer"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Szczegóły"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Urządzenie"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Urządzenia"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Odrzuć"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Nie zawiera"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domena"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Odpływ"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Edytuj"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edytuj panel"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edytuj członka"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Włącz udostępnianie adresu URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Krok końcowy"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Zdarzenie"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Dane zdarzenia"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Zdarzenia"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL wyjściowy"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Fałsz"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Pole"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Pola"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtruj"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Połączone"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Surowe dane"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtry"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Lejek"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Zrozum wskaźniki konwersji i odpływu użytkowników."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Cel"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Cele"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Większe niż"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Większe niż lub równe"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosty"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Analiza"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Poznaj lepiej swoje dane, korzystając z segmentów i filtrów."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Równe"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Nie jest równe"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Nieustawione"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Ustawione"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Dołącz"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Dołącz do zespołu"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Droga"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Zrozum, w jaki sposób użytkownicy poruszają się po Twojej witrynie."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Język"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Języki"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Ostatnie "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dni"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Ostatnie "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " godzin"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Osatnie "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " miesięcy"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Opuść"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Opuść zespół"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Mniejsze niż"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Mniejsze niż lub równe"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Zaloguj się"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Wyloguj"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Maks"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Członek"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Członkowie"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Smartfon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Więcej"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Moje konto"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Moje witryny"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nazwa"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nowe hasło"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Brak"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "rekord"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "rekordy"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Przegląd"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Właściciel"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Strona "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " z "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Wyświetlenia strony"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Tytuł strony"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Strony"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Hasło"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Obsługiwane przez "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Poprzedni"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Poprzedni okres"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Poprzedni rok"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Zapytania"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Zapytanie"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parametry zapytania"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Czas rzeczywisty"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Źródło odsyłające"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Źródła odsyłające"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Odśwież"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Wygeneruj ponownie"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regiony"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Usuń"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Usuń członka"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Raporty"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Wymagany"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Zresetuj"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Zresetuj statystyki"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retencja"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mierz przyciągającą siłę swojej strony internetowej, śledząc, jak często użytkownicy powracają."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rola"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Uruchom zapytanie"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Zapisz"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Ekrany"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Szukaj"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Wybierz"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Wybierz datę"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Wybierz rolę"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Wybierz witrynę"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesje"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Ustawienia"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Udostępnij adres URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "W tym dniu"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Krok startowy"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Kroki"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Suma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Zespół"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID zespołu"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Członek zespołu"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nazwa zespołu"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Właściciel zespołu"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Tylko do odczytu dla zespołu"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Witryny zespołu"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Zespoły"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Motyw"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "W tym miesiącu"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "W tym tygodniu"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "W tym roku"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Strefa czasowa"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Tytuł"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Dzisiaj"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Przełącz wykresy"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "W sumie"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Suma rekordów"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Kod śledzenia"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Prawda"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Typ"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unikalne"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unikalni odwiedzający"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Nieznany"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Bez tytułu"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Aktualizuj"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "Link"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "Linki"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Użytkownik"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nazwa użytkownika"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Użytkownicy"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Śledź swoje kampanie za pomocą parametrów UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Wartość"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Zobacz"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Pokaż szczegóły"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Tylko do odczytu"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Wyświetlenia"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Widoków na wizytę"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Średni czas wizyty"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Odwiedzający"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Wizyty"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Witryna"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID witryny"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Witryny"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Okno"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Wczoraj"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Wpisz "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": ", aby potwierdzić."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " aktualnie "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "odwiedzający"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "odwiedzających"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Zebrane dane"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Czy na pewno chcesz usunąć "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Czy na pewno chcesz opuścić "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Czy na pewno chcesz usunąć "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Czy na pewno chcesz zresetować statystyki "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Usunięcie zespołu usunie wszystkie jego witryny."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Wszystkie powiązane dane również zostaną usunięte."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Coś poszło nie tak."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Przejdź do ustawień"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nieprawidłowa nazwa użytkownika lub hasło."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Nieprawidłowa witryna"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimalna długość "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " znaków"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Nowa wersja Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " jest dostępna!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Brak dostępnych danych."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Brak dostępnych danych o zdarzeniach."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Hasła się nie zgadzają"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Nie znaleziono wyników."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Ten zespół nie ma żadnych witryn internetowych."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Nie stworzyłeś żadnych zespołów."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Nie ma żadnych użytkowników."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nie masz skonfigurowanych żadnych witryn internetowych."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Strona nie znaleziona."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Aby zresetować tę witrynę, wpisz "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " w polu poniżej, aby potwierdzić."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Wszystkie statystyki tej witryny zostaną usunięte, ale kod śledzenia pozostanie nienaruszony."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Zapisano pomyślnie."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "To jest publicznie udostępniany adres URL dla "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Jesteś już członkiem zespołu."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Nie znaleziono zespołu."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Strony internetowe mogą być przeglądane przez każdego członka zespołu."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Kod śledzenia"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Czy przenieść tę witrynę do Twoje konta?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Wybierz zespół, do którego chcesz przenieść tę witrynę."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Przenieś własność witryny na swoje konto lub do innego zespołu."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Zdarzenie wyzwalające"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Użytkownik usunięty."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Obejrzana strona"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Odwiedzający z "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " używa "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Odpływ użytkowników"
- }
- ]
+ "label": {
+ "access-code": "Kod dostępu",
+ "account": "Konto",
+ "action": "Akcja",
+ "actions": "Działania",
+ "activity": "Dziennik aktywności",
+ "add": "Dodaj",
+ "add-board": "Dodaj tablicę",
+ "add-description": "Dodaj opis",
+ "add-link": "Dodaj link",
+ "add-member": "Dodaj członka",
+ "add-pixel": "Dodaj piksel",
+ "add-step": "Dodaj krok",
+ "add-website": "Dodaj witrynę",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Po",
+ "all": "Wszystkie",
+ "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",
+ "average": "Średnia",
+ "back": "Powrót",
+ "before": "Przed",
+ "behavior": "Zachowanie",
+ "block-selector": "Selektor bloków",
+ "boards": "Tablice",
+ "bounce-rate": "Współczynnik odrzuceń",
+ "breakdown": "Rozbicie",
+ "browser": "Przeglądarka",
+ "browsers": "Przeglądarki",
+ "campaign": "Kampania",
+ "campaigns": "Kampanie",
+ "cancel": "Anuluj",
+ "change-password": "Zmień hasło",
+ "channel": "Kanał",
+ "channels": "Kanały",
+ "chart": "Wykres",
+ "cities": "Miasta",
+ "city": "Miasto",
+ "clear-all": "Wyczyść wszystko",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorty",
+ "compare": "Porównaj",
+ "compare-dates": "Porównaj daty",
+ "confirm": "Potwierdź",
+ "confirm-password": "Potwierdź hasło",
+ "contains": "Zawiera",
+ "content": "Treść",
+ "continue": "Kontynuuj",
+ "conversion": "Konwersja",
+ "conversion-rate": "Wskaźnik konwersji",
+ "conversion-step": "Etap konwersji",
+ "count": "Liczba",
+ "countries": "Kraje",
+ "country": "Państwo",
+ "create": "Utwórz",
+ "create-report": "Utwórz raport",
+ "create-team": "Utwórz zespół",
+ "create-user": "Utwórz użytkownika",
+ "created": "Utworzony",
+ "created-by": "Utworzony przez",
+ "criteria": "Kryteria",
+ "currency": "Waluta",
+ "current": "Aktualny",
+ "current-password": "Aktualne hasło",
+ "custom-range": "Zakres niestandardowy",
+ "dashboard": "Panel",
+ "data": "Dane",
+ "date": "Data",
+ "date-range": "Zakres dat",
+ "day": "Dzień",
+ "default-date-range": "Domyślny zakres dat",
+ "delete": "Usuń",
+ "delete-report": "Usuń raport",
+ "delete-team": "Usuń zespół",
+ "delete-user": "Usuń użytkownika",
+ "delete-website": "Usuń witrynę",
+ "description": "Opis",
+ "desktop": "Komputer",
+ "destination-url": "Docelowy URL",
+ "details": "Szczegóły",
+ "device": "Urządzenie",
+ "devices": "Urządzenia",
+ "direct": "Bezpośredni",
+ "dismiss": "Odrzuć",
+ "distinct-id": "Unikalny ID",
+ "documentation": "Dokumentacja",
+ "does-not-contain": "Nie zawiera",
+ "does-not-include": "Nie zawiera",
+ "doest-not-exist": "Nie istnieje",
+ "domain": "Domena",
+ "download": "Pobierz",
+ "dropoff": "Odpływ",
+ "duration": "Czas trwania",
+ "edit": "Edytuj",
+ "edit-member": "Edytuj członka",
+ "email": "E-mail",
+ "enable-share-url": "Włącz udostępnianie adresu URL",
+ "end-step": "Krok końcowy",
+ "entry": "Entry URL",
+ "environment": "Środowisko",
+ "event": "Zdarzenie",
+ "event-data": "Dane zdarzenia",
+ "event-name": "Nazwa zdarzenia",
+ "events": "Zdarzenia",
+ "exclude-bounce": "Wyklucz odrzucenia",
+ "exists": "Istnieje",
+ "exit": "URL wyjściowy",
+ "false": "Fałsz",
+ "fcp": "FCP",
+ "field": "Pole",
+ "fields": "Pola",
+ "filter": "Filtruj",
+ "filter-combined": "Połączone",
+ "filter-raw": "Surowe dane",
+ "filters": "Filtry",
+ "first-click": "Pierwsze kliknięcie",
+ "first-seen": "Pierwsza wizyta",
+ "funnel": "Lejek",
+ "funnel-description": "Zrozum wskaźniki konwersji i odpływu użytkowników.",
+ "funnels": "Lejki",
+ "goal": "Cel",
+ "goals": "Cele",
+ "goals-description": "Śledź cele dla odsłon stron i zdarzeń.",
+ "good": "Dobrze",
+ "greater-than": "Większe niż",
+ "greater-than-equals": "Większe niż lub równe",
+ "grouped": "Grupowane",
+ "growth": "Wzrost",
+ "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.",
+ "invalid-url": "Nieprawidłowy URL",
+ "is": "Równe",
+ "is-false": "Jest fałszem",
+ "is-not": "Nie jest równe",
+ "is-not-set": "Nieustawione",
+ "is-set": "Ustawione",
+ "is-true": "Jest prawdą",
+ "join": "Dołącz",
+ "join-team": "Dołącz do zespołu",
+ "journey": "Droga",
+ "journey-description": "Zrozum, w jaki sposób użytkownicy poruszają się po Twojej witrynie.",
+ "journeys": "Drogi",
+ "language": "Język",
+ "languages": "Języki",
+ "laptop": "Laptop",
+ "last-click": "Ostatnie kliknięcie",
+ "last-days": "Ostatnie {x} dni",
+ "last-hours": "Ostatnie {x} godzin",
+ "last-months": "Ostatnie {x} miesięcy",
+ "last-seen": "Ostatnio widziany",
+ "lcp": "LCP",
+ "leave": "Opuść",
+ "leave-team": "Opuść zespół",
+ "less-than": "Mniejsze niż",
+ "less-than-equals": "Mniejsze niż lub równe",
+ "link": "Link",
+ "links": "Linki",
+ "location": "Lokalizacja",
+ "login": "Zaloguj się",
+ "logout": "Wyloguj",
+ "manage": "Zarządzaj",
+ "manager": "Menedżer",
+ "mask-level": "Poziom maski",
+ "match": "Dopasowanie",
+ "match-all": "Wszystkie",
+ "match-any": "Dowolny",
+ "max": "Maks",
+ "max-duration": "Maksymalny czas trwania",
+ "maximize": "Rozwiń",
+ "medium": "Medium",
+ "member": "Członek",
+ "members": "Członkowie",
+ "min": "Min",
+ "minute": "Minuta",
+ "mobile": "Smartfon",
+ "model": "Model",
+ "month": "Miesiąc",
+ "more": "Więcej",
+ "my-account": "Moje konto",
+ "my-websites": "Moje witryny",
+ "name": "Nazwa",
+ "needs-improvement": "Wymaga poprawy",
+ "new-password": "Nowe hasło",
+ "none": "Brak",
+ "number-of-records": "{x} {x, plural, one {rekord} other {rekordy}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Wyszukiwanie organiczne",
+ "organic-shopping": "Zakupy organiczne",
+ "organic-social": "Organiczne social media",
+ "organic-video": "Organiczne wideo",
+ "os": "System",
+ "other": "Inne",
+ "overview": "Przegląd",
+ "owner": "Właściciel",
+ "page": "Strona",
+ "page-of": "Strona {current} z {total}",
+ "page-views": "Wyświetlenia strony",
+ "pages": "Strony",
+ "pageTitle": "Tytuł strony",
+ "paid-ads": "Reklamy płatne",
+ "paid-search": "Płatne wyszukiwanie",
+ "paid-shopping": "Płatne zakupy",
+ "paid-social": "Płatne social media",
+ "paid-video": "Płatne wideo",
+ "password": "Hasło",
+ "path": "Ścieżka",
+ "paths": "Ścieżki",
+ "performance": "Wydajność",
+ "pixel": "Piksel",
+ "pixels": "Piksele",
+ "play": "Odtwórz",
+ "poor": "Słabo",
+ "powered-by": "Obsługiwane przez {name}",
+ "preferences": "Preferencje",
+ "previous": "Poprzedni",
+ "previous-period": "Poprzedni okres",
+ "previous-year": "Poprzedni rok",
+ "profile": "Profil",
+ "profiles": "Profile",
+ "properties": "Właściwości",
+ "property": "Właściwość",
+ "queries": "Zapytania",
+ "query": "Zapytanie",
+ "query-parameters": "Parametry zapytania",
+ "realtime": "Czas rzeczywisty",
+ "recorded": "Nagrano o",
+ "referral": "Polecenie",
+ "referrer": "Źródło odsyłające",
+ "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",
+ "replay": "Odtwarzanie",
+ "replay-enabled": "Odtwarzanie włączone",
+ "replay-id": "Replay ID",
+ "replays": "Odtwarzania",
+ "reports": "Raporty",
+ "required": "Wymagany",
+ "reset": "Zresetuj",
+ "reset-website": "Zresetuj statystyki",
+ "retention": "Retencja",
+ "retention-days": "Dni przechowywania",
+ "retention-description": "Mierz przyciągającą siłę swojej strony internetowej, śledząc, jak często użytkownicy powracają.",
+ "revenue": "Przychód",
+ "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-segment": "Zapisz segment",
+ "screen": "Ekran",
+ "screens": "Ekrany",
+ "search": "Szukaj",
+ "segment": "Segment",
+ "segments": "Segmenty",
+ "select": "Wybierz",
+ "select-component": "Wybierz komponent",
+ "select-date": "Wybierz datę",
+ "select-filter": "Wybierz filtr",
+ "select-role": "Wybierz rolę",
+ "select-website": "Wybierz witrynę",
+ "session": "Sesja",
+ "session-data": "Dane sesji",
+ "sessions": "Sesje",
+ "settings": "Ustawienia",
+ "share": "Udostępnij",
+ "share-url": "Udostępnij adres URL",
+ "single-day": "W tym dniu",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Źródło",
+ "sources": "Źródła",
+ "start-step": "Krok startowy",
+ "steps": "Kroki",
+ "sum": "Suma",
+ "support": "Wsparcie",
+ "switch-account": "Przełącz konto",
+ "table": "Tabela",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tagi",
+ "team": "Zespół",
+ "team-id": "ID zespołu",
+ "team-manager": "Menedżer zespołu",
+ "team-member": "Członek zespołu",
+ "team-name": "Nazwa zespołu",
+ "team-owner": "Właściciel zespołu",
+ "team-settings": "Ustawienia zespołu",
+ "team-view-only": "Tylko do odczytu dla zespołu",
+ "team-websites": "Witryny zespołu",
+ "teams": "Zespoły",
+ "term": "Wyszukiwane hasło",
+ "terms": "Warunki",
+ "theme": "Motyw",
+ "this-month": "W tym miesiącu",
+ "this-week": "W tym tygodniu",
+ "this-year": "W tym roku",
+ "timezone": "Strefa czasowa",
+ "title": "Tytuł",
+ "today": "Dzisiaj",
+ "toggle-charts": "Przełącz wykresy",
+ "total": "W sumie",
+ "total-records": "Suma rekordów",
+ "tracking-code": "Kod śledzenia",
+ "traffic": "Ruch",
+ "transactions": "Transakcje",
+ "transfer": "Przenieś",
+ "transfer-website": "Przenieś stronę",
+ "true": "Prawda",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Unikalne",
+ "unique-events": "Unikalne zdarzenia",
+ "unique-visitors": "Unikalni odwiedzający",
+ "uniqueCustomers": "Unikalni klienci",
+ "unknown": "Nieznany",
+ "untitled": "Bez tytułu",
+ "update": "Aktualizuj",
+ "url": "URL",
+ "user": "Użytkownik",
+ "username": "Nazwa użytkownika",
+ "users": "Użytkownicy",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampania",
+ "utm-content": "UTM-treść",
+ "utm-description": "Śledź swoje kampanie za pomocą parametrów UTM.",
+ "utm-medium": "UTM-medium",
+ "utm-source": "UTM-źródło",
+ "utm-term": "UTM-hasło",
+ "value": "Wartość",
+ "version": "Wersja",
+ "view": "Zobacz",
+ "view-details": "Pokaż szczegóły",
+ "view-only": "Tylko do odczytu",
+ "views": "Wyświetlenia",
+ "views-per-visit": "Widoków na wizytę",
+ "visit-duration": "Średni czas wizyty",
+ "visitors": "Odwiedzający",
+ "visits": "Wizyty",
+ "website": "Witryna",
+ "website-id": "ID witryny",
+ "websites": "Witryny",
+ "window": "Okno",
+ "yesterday": "Wczoraj"
+ },
+ "message": {
+ "action-confirmation": "Wpisz {confirmation}, aby potwierdzić.",
+ "active-users": "{x} aktualnie {x, plural, one {odwiedzający} other {odwiedzających}}",
+ "bad-request": "Nieprawidłowe żądanie",
+ "collected-data": "Zebrane dane",
+ "confirm-delete": "Czy na pewno chcesz usunąć {target}?",
+ "confirm-leave": "Czy na pewno chcesz opuścić {target} ?",
+ "confirm-remove": "Czy na pewno chcesz usunąć {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Zabronione",
+ "go-to-settings": "Przejdź do ustawień",
+ "incorrect-username-password": "Nieprawidłowa nazwa użytkownika lub hasło.",
+ "invalid-domain": "Nieprawidłowa witryna",
+ "min-password-length": "Minimalna długość {n} znaków",
+ "new-version-available": "Nowa wersja Umami {version} jest dostępna!",
+ "no-data-available": "Brak dostępnych danych.",
+ "no-event-data": "Brak dostępnych danych o zdarzeniach.",
+ "no-match-password": "Hasła się nie zgadzają",
+ "no-results-found": "Nie znaleziono wyników.",
+ "no-team-websites": "Ten zespół nie ma żadnych witryn internetowych.",
+ "no-teams": "Nie stworzyłeś żadnych zespołów.",
+ "no-users": "Nie ma żadnych użytkowników.",
+ "no-websites-configured": "Nie masz skonfigurowanych żadnych witryn internetowych.",
+ "not-found": "Nie znaleziono",
+ "nothing-selected": "Nic nie wybrano.",
+ "page-not-found": "Strona nie znaleziona.",
+ "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-component-preview": "Wybierz komponent do podglądu",
+ "select-website-first": "Najpierw wybierz stronę internetową",
+ "sever-error": "Błąd serwera",
+ "share-url": "To jest publicznie udostępniany adres URL dla {target}.",
+ "team-already-member": "Jesteś już członkiem zespołu.",
+ "team-not-found": "Nie znaleziono zespołu.",
+ "team-websites-info": "Strony internetowe mogą być przeglądane przez każdego członka zespołu.",
+ "tracking-code": "Kod śledzenia",
+ "transfer-team-website-to-user": "Czy przenieść tę witrynę do Twoje konta?",
+ "transfer-user-website-to-team": "Wybierz zespół, do którego chcesz przenieść tę witrynę.",
+ "transfer-website": "Przenieś własność witryny na swoje konto lub do innego zespołu.",
+ "triggered-event": "Zdarzenie wyzwalające",
+ "unauthorized": "Brak autoryzacji",
+ "user-deleted": "Użytkownik usunięty.",
+ "viewed-page": "Obejrzana strona",
+ "visitor-log": "Odwiedzający z {country} używa {browser} na {os} {device} "
+ }
}
diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json
index 26985407a..dbc38a2d3 100644
--- a/public/intl/messages/pt-BR.json
+++ b/public/intl/messages/pt-BR.json
@@ -1,1852 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Código de acesso"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Ações do usuário"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Registro de atividades"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Adicionar"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Adicionar descrição"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Adicionar membro"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Adicionar etapa"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Adicionar site"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Depois"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Todos"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Todos os períodos"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Análise"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Média"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Voltar"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Antes"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Taxa de rejeição"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Detalhamento"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Navegador"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadores"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancelar"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Alterar senha"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cidades"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Cidade"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Limpar tudo"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirmar"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmar senha"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contém"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuar"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Países"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "País"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Criar"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Criar relatório"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Criar equipe"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Criar usuário"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Criado"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Criado por"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Senha atual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Período personalizado"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Painel"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Dados"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Período"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dia"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Período padrão"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Excluir"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Excluir relatório"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Excluir equipe"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Excluir usuário"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Excluir site"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Descrição"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalhes"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Dispositivo"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivos"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Fechar"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Não contém"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domínio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Abandono"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editar"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Editar painel"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Editar membro"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Ativar link para compartilhar"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Evento"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Dados do evento"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Tipos de eventos"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Não"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Campo"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Campos"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtro"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinado"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Bruto"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtros"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funil"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Entenda a taxa de conversão e abandono dos seus usuários."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Maior que"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Maior ou igual a"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Explore seus dados em mais detalhes usando filtros"
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "É igual a"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Não é igual a"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Não definido"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Definido"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Participar"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Participar da equipe"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Idioma"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Idiomas"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Notebook"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dias"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimas "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " horas"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " meses"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Sair"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Sair da equipe"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Menor que"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Menor ou igual a"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Entrar"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Sair"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Gerenciar"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Máximo"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Membro"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Membros"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Mínimo"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Celular"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mais"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Minha conta"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Meus sites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nome"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nova senha"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Nenhum"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "registro"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "registros"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Sistema operacional"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Visão geral"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Proprietário"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Página "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " de "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Visualizações de página"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Título"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Páginas"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Senha"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Desenvolvido por "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Consultas"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Consulta"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parâmetros da consulta"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Tempo real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referência"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referências"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Atualizar"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Gerar novamente"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Estado"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Estados"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remover"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remover membro"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Relatórios"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obrigatório"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Redefinir"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Redefinir dados"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retenção"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Função"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Executar consulta"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Salvar"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Tamanhos de tela"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Pesquisar"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Selecionar"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Selecionar data"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Selecionar função"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Selecionar site"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessões"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Configurações"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Link para compartilhar"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Apenas um dia"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Etapas"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Soma"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Equipe"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID da equipe"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Membro da equipe"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nome da equipe"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Proprietário da equipe"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Apenas visualização da equipe"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Sites da equipe"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Equipes"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Este mês"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Esta semana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Este ano"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Fuso horário"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Título"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hoje"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Alternar gráficos"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total de registros"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreamento"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transferir"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transferir site"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Sim"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tipo"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Únicos"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitantes únicos"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Desconhecido"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Sem título"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Atualizar"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Usuário"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nome de usuário"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Usuários"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Acompanhe suas campanhas de publicidade através de parâmetros UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valor"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Visualizar"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Ver mais"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Somente visualização"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visualizações"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Visualizações por visita"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tempo médio de visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitantes"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visitas"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Site"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID do site"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Sites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Janela"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ontem"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Digite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " na caixa abaixo para confirmar."
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": " Atualmente "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " usuários ativos"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Tem certeza de que deseja excluir "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Tem certeza de que deseja sair de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Tem certeza que deseja remover "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Tem certeza que deseja redefinir os dados de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Excluir a equipe também excluirá todos os sites da equipe."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Todos os dados relacionados serão excluídos."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ocorreu um erro."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " em "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ir para as configurações"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nome de usuário ou senha incorretos."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domínio inválido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "A senha deve ter no mínimo "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caracteres"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Uma nova versão "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " do Umami está disponível!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Não há dados disponíveis."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Não há eventos disponíveis."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "As senhas não coincidem."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Nenhum resultado encontrado."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Esta equipe não possui sites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Você ainda não criou nenhuma equipe."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Não há usuários."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Você ainda não configurou nenhum site."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Página não encontrada."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Se você tiver certeza de que deseja redefinir este site, digite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " na caixa de entrada abaixo para confirmar."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Salvo com sucesso."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Este é o link para compartilhar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Você já é membro desta equipe."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Equipe não encontrada."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Qualquer membro da equipe pode visualizar os sites."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreamento"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transferir este site para sua conta?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Selecione para qual equipe deseja transferir este site."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfira a propriedade do site para sua conta ou para outra equipe."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Evento disparado"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Usuário excluído."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Página visualizada"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitante de "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " usando o navegador "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " em um "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " com sistema operacional "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitantes abandonados"
- }
- ]
+ "label": {
+ "access-code": "Código de acesso",
+ "account": "Conta",
+ "action": "Ação",
+ "actions": "Ações do usuário",
+ "activity": "Registro de atividades",
+ "add": "Adicionar",
+ "add-board": "Adicionar quadro",
+ "add-description": "Adicionar descrição",
+ "add-link": "Adicionar link",
+ "add-member": "Adicionar membro",
+ "add-pixel": "Adicionar pixel",
+ "add-step": "Adicionar etapa",
+ "add-website": "Adicionar site",
+ "admin": "Administrador",
+ "affiliate": "Afiliado",
+ "after": "Depois",
+ "all": "Todos",
+ "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",
+ "average": "Média",
+ "back": "Voltar",
+ "before": "Antes",
+ "behavior": "Comportamento",
+ "block-selector": "Seletor de bloco",
+ "boards": "Quadros",
+ "bounce-rate": "Taxa de rejeição",
+ "breakdown": "Detalhamento",
+ "browser": "Navegador",
+ "browsers": "Navegadores",
+ "campaign": "Campanha",
+ "campaigns": "Campanhas",
+ "cancel": "Cancelar",
+ "change-password": "Alterar senha",
+ "channel": "Canal",
+ "channels": "Canais",
+ "chart": "Gráfico",
+ "cities": "Cidades",
+ "city": "Cidade",
+ "clear-all": "Limpar tudo",
+ "cls": "CLS",
+ "cohort": "Cohorte",
+ "cohorts": "Coortes",
+ "compare": "Comparar",
+ "compare-dates": "Comparar datas",
+ "confirm": "Confirmar",
+ "confirm-password": "Confirmar senha",
+ "contains": "Contém",
+ "content": "Conteúdo",
+ "continue": "Continuar",
+ "conversion": "Conversão",
+ "conversion-rate": "Taxa de conversão",
+ "conversion-step": "Etapa de conversão",
+ "count": "Contagem",
+ "countries": "Países",
+ "country": "País",
+ "create": "Criar",
+ "create-report": "Criar relatório",
+ "create-team": "Criar equipe",
+ "create-user": "Criar usuário",
+ "created": "Criado",
+ "created-by": "Criado por",
+ "criteria": "Critérios",
+ "currency": "Moeda",
+ "current": "Atual",
+ "current-password": "Senha atual",
+ "custom-range": "Período personalizado",
+ "dashboard": "Painel",
+ "data": "Dados",
+ "date": "Data",
+ "date-range": "Período",
+ "day": "Dia",
+ "default-date-range": "Período padrão",
+ "delete": "Excluir",
+ "delete-report": "Excluir relatório",
+ "delete-team": "Excluir equipe",
+ "delete-user": "Excluir usuário",
+ "delete-website": "Excluir site",
+ "description": "Descrição",
+ "desktop": "Computador",
+ "destination-url": "URL de destino",
+ "details": "Detalhes",
+ "device": "Dispositivo",
+ "devices": "Dispositivos",
+ "direct": "Direto",
+ "dismiss": "Fechar",
+ "distinct-id": "ID distinto",
+ "documentation": "Documentação",
+ "does-not-contain": "Não contém",
+ "does-not-include": "Não inclui",
+ "doest-not-exist": "Não existe",
+ "domain": "Domínio",
+ "download": "Download",
+ "dropoff": "Abandono",
+ "duration": "Duração",
+ "edit": "Editar",
+ "edit-member": "Editar membro",
+ "email": "E-mail",
+ "enable-share-url": "Ativar link para compartilhar",
+ "end-step": "Etapa final",
+ "entry": "Entry URL",
+ "environment": "Ambiente",
+ "event": "Evento",
+ "event-data": "Dados do evento",
+ "event-name": "Nome do evento",
+ "events": "Tipos de eventos",
+ "exclude-bounce": "Excluir rejeição",
+ "exists": "Existe",
+ "exit": "Exit URL",
+ "false": "Não",
+ "fcp": "FCP",
+ "field": "Campo",
+ "fields": "Campos",
+ "filter": "Filtro",
+ "filter-combined": "Combinado",
+ "filter-raw": "Bruto",
+ "filters": "Filtros",
+ "first-click": "Primeiro clique",
+ "first-seen": "Visto pela primeira vez",
+ "funnel": "Funil",
+ "funnel-description": "Entenda a taxa de conversão e abandono dos seus usuários.",
+ "funnels": "Funis",
+ "goal": "Meta",
+ "goals": "Metas",
+ "goals-description": "Acompanhe suas metas para visualizações de página e eventos.",
+ "good": "Bom",
+ "greater-than": "Maior que",
+ "greater-than-equals": "Maior ou igual a",
+ "grouped": "Agrupado",
+ "growth": "Crescimento",
+ "hostname": "Nome do host",
+ "hour": "Hora",
+ "includes": "Inclui",
+ "inp": "INP",
+ "insight": "Insight",
+ "insights": "Insights",
+ "insights-description": "Explore seus dados em mais detalhes usando filtros",
+ "invalid-url": "URL inválida",
+ "is": "É igual a",
+ "is-false": "É falso",
+ "is-not": "Não é igual a",
+ "is-not-set": "Não definido",
+ "is-set": "Definido",
+ "is-true": "É verdadeiro",
+ "join": "Participar",
+ "join-team": "Participar da equipe",
+ "journey": "Jornada",
+ "journey-description": "Entenda como os usuários navegam pelo seu site.",
+ "journeys": "Jornadas",
+ "language": "Idioma",
+ "languages": "Idiomas",
+ "laptop": "Notebook",
+ "last-click": "Último clique",
+ "last-days": "Últimos {x} dias",
+ "last-hours": "Últimas {x} horas",
+ "last-months": "Últimos {x} meses",
+ "last-seen": "Última visualização",
+ "lcp": "LCP",
+ "leave": "Sair",
+ "leave-team": "Sair da equipe",
+ "less-than": "Menor que",
+ "less-than-equals": "Menor ou igual a",
+ "link": "Link",
+ "links": "Links",
+ "location": "Localização",
+ "login": "Entrar",
+ "logout": "Sair",
+ "manage": "Gerenciar",
+ "manager": "Gerente",
+ "mask-level": "Nível de máscara",
+ "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",
+ "members": "Membros",
+ "min": "Mínimo",
+ "minute": "Minuto",
+ "mobile": "Celular",
+ "model": "Modelo",
+ "month": "Mês",
+ "more": "Mais",
+ "my-account": "Minha conta",
+ "my-websites": "Meus sites",
+ "name": "Nome",
+ "needs-improvement": "Precisa melhorar",
+ "new-password": "Nova senha",
+ "none": "Nenhum",
+ "number-of-records": "{x} {x, plural, one {registro} other {registros}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Busca orgânica",
+ "organic-shopping": "Compras orgânicas",
+ "organic-social": "Social orgânico",
+ "organic-video": "Vídeo orgânico",
+ "os": "Sistema operacional",
+ "other": "Outro",
+ "overview": "Visão geral",
+ "owner": "Proprietário",
+ "page": "Página",
+ "page-of": "Página {current} de {total}",
+ "page-views": "Visualizações de página",
+ "pages": "Páginas",
+ "pageTitle": "Título",
+ "paid-ads": "Anúncios pagos",
+ "paid-search": "Busca paga",
+ "paid-shopping": "Compras pagas",
+ "paid-social": "Social pago",
+ "paid-video": "Vídeo pago",
+ "password": "Senha",
+ "path": "Caminho",
+ "paths": "Caminhos",
+ "performance": "Desempenho",
+ "pixel": "Pixel",
+ "pixels": "Pixels",
+ "play": "Reproduzir",
+ "poor": "Ruim",
+ "powered-by": "Desenvolvido por {name}",
+ "preferences": "Preferências",
+ "previous": "Anterior",
+ "previous-period": "Período anterior",
+ "previous-year": "Ano anterior",
+ "profile": "Perfil",
+ "profiles": "Perfis",
+ "properties": "Propriedades",
+ "property": "Propriedade",
+ "queries": "Consultas",
+ "query": "Consulta",
+ "query-parameters": "Parâmetros da consulta",
+ "realtime": "Tempo real",
+ "recorded": "Registrado em",
+ "referral": "Referência",
+ "referrer": "Referência",
+ "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",
+ "replay": "Reprodução",
+ "replay-enabled": "Reprodução habilitada",
+ "replay-id": "Replay ID",
+ "replays": "Reproduções",
+ "reports": "Relatórios",
+ "required": "Obrigatório",
+ "reset": "Redefinir",
+ "reset-website": "Redefinir dados",
+ "retention": "Retenção",
+ "retention-days": "Dias de retenção",
+ "retention-description": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam.",
+ "revenue": "Receita",
+ "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-segment": "Salvar segmento",
+ "screen": "Tela",
+ "screens": "Tamanhos de tela",
+ "search": "Pesquisar",
+ "segment": "Segmento",
+ "segments": "Segmentos",
+ "select": "Selecionar",
+ "select-component": "Selecionar componente",
+ "select-date": "Selecionar data",
+ "select-filter": "Selecionar filtro",
+ "select-role": "Selecionar função",
+ "select-website": "Selecionar site",
+ "session": "Sessão",
+ "session-data": "Dados da sessão",
+ "sessions": "Sessões",
+ "settings": "Configurações",
+ "share": "Compartilhar",
+ "share-url": "Link para compartilhar",
+ "single-day": "Apenas um dia",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Fonte",
+ "sources": "Fontes",
+ "start-step": "Etapa inicial",
+ "steps": "Etapas",
+ "sum": "Soma",
+ "support": "Suporte",
+ "switch-account": "Trocar conta",
+ "table": "Tabela",
+ "tablet": "Tablet",
+ "tag": "Tag",
+ "tags": "Tags",
+ "team": "Equipe",
+ "team-id": "ID da equipe",
+ "team-manager": "Gerente da equipe",
+ "team-member": "Membro da equipe",
+ "team-name": "Nome da equipe",
+ "team-owner": "Proprietário da equipe",
+ "team-settings": "Configurações da equipe",
+ "team-view-only": "Apenas visualização da equipe",
+ "team-websites": "Sites da equipe",
+ "teams": "Equipes",
+ "term": "Termo",
+ "terms": "Termos",
+ "theme": "Tema",
+ "this-month": "Este mês",
+ "this-week": "Esta semana",
+ "this-year": "Este ano",
+ "timezone": "Fuso horário",
+ "title": "Título",
+ "today": "Hoje",
+ "toggle-charts": "Alternar gráficos",
+ "total": "Total",
+ "total-records": "Total de registros",
+ "tracking-code": "Código de rastreamento",
+ "traffic": "Tráfego",
+ "transactions": "Transações",
+ "transfer": "Transferir",
+ "transfer-website": "Transferir site",
+ "true": "Sim",
+ "ttfb": "TTFB",
+ "type": "Tipo",
+ "unique": "Únicos",
+ "unique-events": "Eventos únicos",
+ "unique-visitors": "Visitantes únicos",
+ "uniqueCustomers": "Clientes únicos",
+ "unknown": "Desconhecido",
+ "untitled": "Sem título",
+ "update": "Atualizar",
+ "url": "URL",
+ "user": "Usuário",
+ "username": "Nome de usuário",
+ "users": "Usuários",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campanha",
+ "utm-content": "UTM Conteúdo",
+ "utm-description": "Acompanhe suas campanhas de publicidade através de parâmetros UTM.",
+ "utm-medium": "UTM Mídia",
+ "utm-source": "UTM Fonte",
+ "utm-term": "UTM Termo",
+ "value": "Valor",
+ "version": "Versão",
+ "view": "Visualizar",
+ "view-details": "Ver mais",
+ "view-only": "Somente visualização",
+ "views": "Visualizações",
+ "views-per-visit": "Visualizações por visita",
+ "visit-duration": "Tempo médio de visita",
+ "visitors": "Visitantes",
+ "visits": "Visitas",
+ "website": "Site",
+ "website-id": "ID do site",
+ "websites": "Sites",
+ "window": "Janela",
+ "yesterday": "Ontem"
+ },
+ "message": {
+ "action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.",
+ "active-users": " Atualmente {x} usuários ativos",
+ "bad-request": "Requisição inválida",
+ "collected-data": "Dados coletados",
+ "confirm-delete": "Tem certeza de que deseja excluir {target}?",
+ "confirm-leave": "Tem certeza de que deseja sair de {target} ?",
+ "confirm-remove": "Tem certeza que deseja remover {target} ?",
+ "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.",
+ "event-log": "{event} em {url} ",
+ "forbidden": "Proibido",
+ "go-to-settings": "Ir para as configurações",
+ "incorrect-username-password": "Nome de usuário ou senha incorretos.",
+ "invalid-domain": "Domínio inválido",
+ "min-password-length": "A senha deve ter no mínimo {n} caracteres",
+ "new-version-available": "Uma nova versão {version} do Umami está disponível!",
+ "no-data-available": "Não há dados disponíveis.",
+ "no-event-data": "Não há eventos disponíveis.",
+ "no-match-password": "As senhas não coincidem.",
+ "no-results-found": "Nenhum resultado encontrado.",
+ "no-team-websites": "Esta equipe não possui sites.",
+ "no-teams": "Você ainda não criou nenhuma equipe.",
+ "no-users": "Não há usuários.",
+ "no-websites-configured": "Você ainda não configurou nenhum site.",
+ "not-found": "Não encontrado",
+ "nothing-selected": "Nada selecionado.",
+ "page-not-found": "Página não encontrada.",
+ "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-component-preview": "Selecione um componente para visualizar",
+ "select-website-first": "Selecione um site primeiro",
+ "sever-error": "Erro do servidor",
+ "share-url": "Este é o link para compartilhar {target}.",
+ "team-already-member": "Você já é membro desta equipe.",
+ "team-not-found": "Equipe não encontrada.",
+ "team-websites-info": "Qualquer membro da equipe pode visualizar os sites.",
+ "tracking-code": "Código de rastreamento",
+ "transfer-team-website-to-user": "Transferir este site para sua conta?",
+ "transfer-user-website-to-team": "Selecione para qual equipe deseja transferir este site.",
+ "transfer-website": "Transfira a propriedade do site para sua conta ou para outra equipe.",
+ "triggered-event": "Evento disparado",
+ "unauthorized": "Não autorizado",
+ "user-deleted": "Usuário excluído.",
+ "viewed-page": "Página visualizada",
+ "visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os} ."
+ }
}
diff --git a/public/intl/messages/pt-PT.json b/public/intl/messages/pt-PT.json
index 6efd9834b..25915dacb 100644
--- a/public/intl/messages/pt-PT.json
+++ b/public/intl/messages/pt-PT.json
@@ -1,1872 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Ações"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Adicionar website"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrador"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Todos"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Todo o tempo"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Voltar"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Taxa de rejeição"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Navegadores"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Cancelar"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Alterar senha"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmar senha"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Países"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Senha atual"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Intervalo personalizado"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Painel"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Intervalo de datas"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Intervalo de datas predefinido"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Eliminar"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Eliminar website"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispositivos"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Ignorar"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domínio"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editar"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Ativar link de partilha"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Eventos"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinado"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Dados brutos"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Língua"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Línguas"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Portátil"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Últimos "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dias"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Últimas "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " horas"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Iniciar sessão"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Sair"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Telemóvel"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mais"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nome"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nova senha"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Proprietário"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Visualizações da página"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Páginas"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Senha"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Distribuído por "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Perfil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Tempo real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referenciadores"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Atualizar"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obrigatório"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Repor"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Repor estatísticas"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Guardar"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Definições"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Partilhar link"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Dia único"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Este mês"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Esta semana"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Este ano"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Fuso horário"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hoje"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Alternar gráficos"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreamento"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Visitantes únicos"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Desconhecido"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nome de utilizador"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Ver detalhes"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visualizações"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Tempo médio de visita"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitantes"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "visitante"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "visitantes"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " neste momento"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Tem a certeza que pretende eliminar "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Tem a certeza que pretende restaurar as estatísticas de "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Todos os dados associados também serão eliminados."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ocorreu um erro."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ir para as definições"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nome de utilizador/senha incorretos."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domínio inválido"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Sem dados disponíveis."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "As senhas não coincidem"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Não tens nenhum website configurado."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Página não encontrada."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Todas as estatísticas deste site serão eliminadas, mas o seu código de rastreamento permanecerá intacto."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Guardado com sucesso."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Este é o link de partilha público para "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Código de rastreamento"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitante de "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " a usar "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " no "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "os"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Código de acesso",
+ "account": "Conta",
+ "action": "Ação",
+ "actions": "Ações",
+ "activity": "Registo de atividade",
+ "add": "Adicionar",
+ "add-board": "Adicionar quadro",
+ "add-description": "Adicionar descrição",
+ "add-link": "Adicionar ligação",
+ "add-member": "Adicionar membro",
+ "add-pixel": "Adicionar pixel",
+ "add-step": "Adicionar passo",
+ "add-website": "Adicionar website",
+ "admin": "Administrador",
+ "affiliate": "Afiliado",
+ "after": "Depois",
+ "all": "Todos",
+ "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",
+ "average": "Média",
+ "back": "Voltar",
+ "before": "Antes",
+ "behavior": "Comportamento",
+ "block-selector": "Seletor de bloco",
+ "boards": "Quadros",
+ "bounce-rate": "Taxa de rejeição",
+ "breakdown": "Detalhamento",
+ "browser": "Navegador",
+ "browsers": "Navegadores",
+ "campaign": "Campanha",
+ "campaigns": "Campanhas",
+ "cancel": "Cancelar",
+ "change-password": "Alterar senha",
+ "channel": "Canal",
+ "channels": "Canais",
+ "chart": "Gráfico",
+ "cities": "Cidades",
+ "city": "Cidade",
+ "clear-all": "Limpar tudo",
+ "cls": "CLS",
+ "cohort": "Cohorte",
+ "cohorts": "Coortes",
+ "compare": "Comparar",
+ "compare-dates": "Comparar datas",
+ "confirm": "Confirmar",
+ "confirm-password": "Confirmar senha",
+ "contains": "Contém",
+ "content": "Conteúdo",
+ "continue": "Continuar",
+ "conversion": "Conversão",
+ "conversion-rate": "Taxa de conversão",
+ "conversion-step": "Passo de conversão",
+ "count": "Contagem",
+ "countries": "Países",
+ "country": "País",
+ "create": "Criar",
+ "create-report": "Criar relatório",
+ "create-team": "Criar equipa",
+ "create-user": "Criar utilizador",
+ "created": "Criado",
+ "created-by": "Criado por",
+ "criteria": "Critérios",
+ "currency": "Moeda",
+ "current": "Atual",
+ "current-password": "Senha atual",
+ "custom-range": "Intervalo personalizado",
+ "dashboard": "Painel",
+ "data": "Dados",
+ "date": "Data",
+ "date-range": "Intervalo de datas",
+ "day": "Dia",
+ "default-date-range": "Intervalo de datas predefinido",
+ "delete": "Eliminar",
+ "delete-report": "Eliminar relatório",
+ "delete-team": "Eliminar equipa",
+ "delete-user": "Eliminar utilizador",
+ "delete-website": "Eliminar website",
+ "description": "Descrição",
+ "desktop": "Computador",
+ "destination-url": "URL de destino",
+ "details": "Detalhes",
+ "device": "Dispositivo",
+ "devices": "Dispositivos",
+ "direct": "Direto",
+ "dismiss": "Ignorar",
+ "distinct-id": "ID distinto",
+ "documentation": "Documentação",
+ "does-not-contain": "Não contém",
+ "does-not-include": "Não inclui",
+ "doest-not-exist": "Não existe",
+ "domain": "Domínio",
+ "download": "Transferir",
+ "dropoff": "Abandono",
+ "duration": "Duração",
+ "edit": "Editar",
+ "edit-member": "Editar membro",
+ "email": "E-mail",
+ "enable-share-url": "Ativar link de partilha",
+ "end-step": "Passo final",
+ "entry": "URL de entrada",
+ "environment": "Ambiente",
+ "event": "Evento",
+ "event-data": "Dados do evento",
+ "event-name": "Nome do evento",
+ "events": "Eventos",
+ "exclude-bounce": "Excluir rejeição",
+ "exists": "Existe",
+ "exit": "URL de saída",
+ "false": "Falso",
+ "fcp": "FCP",
+ "field": "Campo",
+ "fields": "Campos",
+ "filter": "Filtro",
+ "filter-combined": "Combinado",
+ "filter-raw": "Dados brutos",
+ "filters": "Filtros",
+ "first-click": "Primeiro clique",
+ "first-seen": "Primeira visualização",
+ "funnel": "Funil",
+ "funnel-description": "Compreenda a taxa de conversão e abandono dos utilizadores.",
+ "funnels": "Funis",
+ "goal": "Objetivo",
+ "goals": "Objetivos",
+ "goals-description": "Acompanhe os seus objetivos para visualizações de página e eventos.",
+ "good": "Bom",
+ "greater-than": "Maior que",
+ "greater-than-equals": "Maior ou igual a",
+ "grouped": "Agrupado",
+ "growth": "Crescimento",
+ "hostname": "Nome do host",
+ "hour": "Hora",
+ "includes": "Inclui",
+ "inp": "INP",
+ "insight": "Insight",
+ "insights": "Insights",
+ "insights-description": "Aprofunde os seus dados utilizando segmentos e filtros.",
+ "invalid-url": "URL inválido",
+ "is": "É",
+ "is-false": "É falso",
+ "is-not": "Não é",
+ "is-not-set": "Não definido",
+ "is-set": "Definido",
+ "is-true": "É verdadeiro",
+ "join": "Juntar-se",
+ "join-team": "Juntar-se à equipa",
+ "journey": "Jornada",
+ "journey-description": "Compreenda como os utilizadores navegam no seu website.",
+ "journeys": "Jornadas",
+ "language": "Língua",
+ "languages": "Línguas",
+ "laptop": "Portátil",
+ "last-click": "Último clique",
+ "last-days": "Últimos {x} dias",
+ "last-hours": "Últimas {x} horas",
+ "last-months": "Últimos {x} meses",
+ "last-seen": "Última visualização",
+ "lcp": "LCP",
+ "leave": "Sair",
+ "leave-team": "Sair da equipa",
+ "less-than": "Menor que",
+ "less-than-equals": "Menor ou igual a",
+ "link": "Ligação",
+ "links": "Ligações",
+ "location": "Localização",
+ "login": "Iniciar sessão",
+ "logout": "Sair",
+ "manage": "Gerir",
+ "manager": "Gestor",
+ "mask-level": "Nível de máscara",
+ "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",
+ "members": "Membros",
+ "min": "Mínimo",
+ "minute": "Minuto",
+ "mobile": "Telemóvel",
+ "model": "Modelo",
+ "month": "Mês",
+ "more": "Mais",
+ "my-account": "A minha conta",
+ "my-websites": "Os meus websites",
+ "name": "Nome",
+ "needs-improvement": "Precisa de melhoria",
+ "new-password": "Nova senha",
+ "none": "Nenhum",
+ "number-of-records": "{x} {x, plural, one {registo} other {registos}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Pesquisa orgânica",
+ "organic-shopping": "Compras orgânicas",
+ "organic-social": "Social orgânico",
+ "organic-video": "Vídeo orgânico",
+ "os": "SO",
+ "other": "Outro",
+ "overview": "Visão geral",
+ "owner": "Proprietário",
+ "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",
+ "paid-ads": "Anúncios pagos",
+ "paid-search": "Pesquisa paga",
+ "paid-shopping": "Compras pagas",
+ "paid-social": "Social pago",
+ "paid-video": "Vídeo pago",
+ "password": "Senha",
+ "path": "Caminho",
+ "paths": "Caminhos",
+ "performance": "Desempenho",
+ "pixel": "Pixel",
+ "pixels": "Píxeis",
+ "play": "Reproduzir",
+ "poor": "Mau",
+ "powered-by": "Distribuído por {name}",
+ "preferences": "Preferências",
+ "previous": "Anterior",
+ "previous-period": "Período anterior",
+ "previous-year": "Ano anterior",
+ "profile": "Perfil",
+ "profiles": "Perfis",
+ "properties": "Propriedades",
+ "property": "Propriedade",
+ "queries": "Consultas",
+ "query": "Consulta",
+ "query-parameters": "Parâmetros de consulta",
+ "realtime": "Tempo real",
+ "recorded": "Registado em",
+ "referral": "Referência",
+ "referrer": "Referência",
+ "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",
+ "replay": "Reprodução",
+ "replay-enabled": "Reprodução ativada",
+ "replay-id": "Replay ID",
+ "replays": "Reproduções",
+ "reports": "Relatórios",
+ "required": "Obrigatório",
+ "reset": "Repor",
+ "reset-website": "Repor estatísticas",
+ "retention": "Retenção",
+ "retention-days": "Dias de retenção",
+ "retention-description": "Meça a fidelidade do seu site, monitorizando a frequência com que os utilizadores regressam.",
+ "revenue": "Receita",
+ "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-segment": "Guardar segmento",
+ "screen": "Ecrã",
+ "screens": "Ecrãs",
+ "search": "Pesquisar",
+ "segment": "Segmento",
+ "segments": "Segmentos",
+ "select": "Selecionar",
+ "select-component": "Selecionar componente",
+ "select-date": "Selecionar data",
+ "select-filter": "Selecionar filtro",
+ "select-role": "Selecionar função",
+ "select-website": "Selecionar website",
+ "session": "Sessão",
+ "session-data": "Dados da sessão",
+ "sessions": "Sessões",
+ "settings": "Definições",
+ "share": "Partilhar",
+ "share-url": "Partilhar link",
+ "single-day": "Dia único",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Fonte",
+ "sources": "Fontes",
+ "start-step": "Etapa inicial",
+ "steps": "Etapas",
+ "sum": "Soma",
+ "support": "Suporte",
+ "switch-account": "Trocar de conta",
+ "table": "Tabela",
+ "tablet": "Tablet",
+ "tag": "Etiqueta",
+ "tags": "Etiquetas",
+ "team": "Equipa",
+ "team-id": "ID da equipa",
+ "team-manager": "Gestor de equipa",
+ "team-member": "Membro da equipa",
+ "team-name": "Nome da equipa",
+ "team-owner": "Proprietário da equipa",
+ "team-settings": "Definições da equipa",
+ "team-view-only": "Visualização da equipa apenas",
+ "team-websites": "Websites da equipa",
+ "teams": "Equipas",
+ "term": "Termo",
+ "terms": "Termos",
+ "theme": "Tema",
+ "this-month": "Este mês",
+ "this-week": "Esta semana",
+ "this-year": "Este ano",
+ "timezone": "Fuso horário",
+ "title": "Título",
+ "today": "Hoje",
+ "toggle-charts": "Alternar gráficos",
+ "total": "Total",
+ "total-records": "Total de registos",
+ "tracking-code": "Código de rastreamento",
+ "traffic": "Tráfego",
+ "transactions": "Transações",
+ "transfer": "Transferir",
+ "transfer-website": "Transferir website",
+ "true": "Verdadeiro",
+ "ttfb": "TTFB",
+ "type": "Tipo",
+ "unique": "Único",
+ "unique-events": "Eventos únicos",
+ "unique-visitors": "Visitantes únicos",
+ "uniqueCustomers": "Clientes únicos",
+ "unknown": "Desconhecido",
+ "untitled": "Sem título",
+ "update": "Atualizar",
+ "url": "URL",
+ "user": "Utilizador",
+ "username": "Nome de utilizador",
+ "users": "Utilizadores",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campanha",
+ "utm-content": "UTM Conteúdo",
+ "utm-description": "Monitorize as suas campanhas através de parâmetros UTM.",
+ "utm-medium": "UTM Meio",
+ "utm-source": "UTM Fonte",
+ "utm-term": "UTM Termo",
+ "value": "Valor",
+ "version": "Versão",
+ "view": "Visualizar",
+ "view-details": "Ver detalhes",
+ "view-only": "Apenas visualização",
+ "views": "Visualizações",
+ "views-per-visit": "Visualizações por visita",
+ "visit-duration": "Tempo médio de visita",
+ "visitors": "Visitantes",
+ "visits": "Visitas",
+ "website": "Website",
+ "website-id": "ID do website",
+ "websites": "Websites",
+ "window": "Janela",
+ "yesterday": "Ontem"
+ },
+ "message": {
+ "action-confirmation": "Escreva {confirmation} na caixa abaixo para confirmar.",
+ "active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento",
+ "bad-request": "Pedido inválido",
+ "collected-data": "Dados recolhidos",
+ "confirm-delete": "Tem a certeza que pretende eliminar {target}?",
+ "confirm-leave": "Tem a certeza de que deseja sair de {target} ?",
+ "confirm-remove": "Tem a certeza de que deseja remover {target} ?",
+ "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.",
+ "event-log": "{event} em {url} ",
+ "forbidden": "Proibido",
+ "go-to-settings": "Ir para as definições",
+ "incorrect-username-password": "Nome de utilizador/senha incorretos.",
+ "invalid-domain": "Domínio inválido",
+ "min-password-length": "Comprimento mínimo de {n} caracteres",
+ "new-version-available": "Uma nova versão do Umami {version} está disponível!",
+ "no-data-available": "Sem dados disponíveis.",
+ "no-event-data": "Não existem dados de eventos disponíveis.",
+ "no-match-password": "As senhas não coincidem",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Esta equipa não tem websites.",
+ "no-teams": "Ainda não criou nenhuma equipa.",
+ "no-users": "Não existem utilizadores.",
+ "no-websites-configured": "Não tens nenhum website configurado.",
+ "not-found": "Não encontrado",
+ "nothing-selected": "Nada selecionado.",
+ "page-not-found": "Página não encontrada.",
+ "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-component-preview": "Selecione um componente para pré-visualizar",
+ "select-website-first": "Selecione primeiro um site",
+ "sever-error": "Erro do servidor",
+ "share-url": "Este é o link de partilha público para {target}.",
+ "team-already-member": "Já é membro da equipa.",
+ "team-not-found": "Equipa não encontrada.",
+ "team-websites-info": "Os websites podem ser visualizados por qualquer membro da equipa.",
+ "tracking-code": "Código de rastreamento",
+ "transfer-team-website-to-user": "Transferir este website para a sua conta?",
+ "transfer-user-website-to-team": "Selecione a equipa para a qual transferir este website.",
+ "transfer-website": "Transfira a propriedade do website para a sua conta ou outra equipa.",
+ "triggered-event": "Evento acionado",
+ "unauthorized": "Não autorizado",
+ "user-deleted": "Utilizador eliminado.",
+ "viewed-page": "Página visualizada",
+ "visitor-log": "Visitante de {country} a usar {browser} no {device} {os} "
+ }
}
diff --git a/public/intl/messages/ro-RO.json b/public/intl/messages/ro-RO.json
index 19541aca1..bc6805a5f 100644
--- a/public/intl/messages/ro-RO.json
+++ b/public/intl/messages/ro-RO.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Cod de access"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Acțiuni"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Jurnal de activități"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Adaugă"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Adaugă descriere"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Adaugă membru"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Adaugă pas"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Adaugă site web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "După"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Toate"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Pentru tot timpul"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Mediu"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Înapoi"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Înainte"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Rata de respingere"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Detaliat"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsere"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Anulează"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Schimbare parolă"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Orașe"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Oraș"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Șterge tot"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compară"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Confirmare parolă"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Conține"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continuă"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Număr"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Țări"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Țară"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Crează"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Crează report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Crează echipă"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Crează utilizator"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Creat"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Creat de"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Curent"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Parola curentă"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Interval personalizat"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Tablou de bord"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Dată"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Interval"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Zi"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Interval implicit"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Șterge"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Șterge raport"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Șterge echipă"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Șterge utilizator"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Șterge site web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Descriere"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detalii"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Dispozitiv"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Dispozitive"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Renunță"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Nu conține"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domeniu"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Rată de abandon"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Editare"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Editare tablou de bord"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Editare membru"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Activare adresă URL de distribuire"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Pas final"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL de intrare"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Eveniment"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Date despre eveniment"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Evenimente"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL de ieșire"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Fals"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Câmp"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Câmpuri"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtru"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combinat"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Brut"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtre"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Văzut pentru prima dată"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Parcursul utilizatorului"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Înțelege rata de conversie și rata de abandon a utilizatorilor."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Obiectiv"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Obiective"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Urmărește obiectivele de vizualizări și evenimente."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Mai mare decât"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Mai mare sau egal cu"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Perspective"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Aprofundează datele utilizând segmente și filtre."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Este"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Nu este"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Nu este setat"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Este setat"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Alătură-te"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Alătură-te echipei"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Traseu"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Înțelege cum navighează vizitatorii prin website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Limbă"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Limbi"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Ultimele "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " zile"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Ultimele "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ore"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Ultimele "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " luni"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Văzut ultima dată"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Părăsește"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Părăsește echipa"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Mai puțin decât"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Mai puțin sau egal cu"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Autentificare"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Ieșire din cont"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Administrează"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Membru"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Membri"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mai mult"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Contul meu"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Website-ul meu"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Nume"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Parolă nouă"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Niciunul"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "înregistrare"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "înregistrări"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Vedere de ansamblu"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Titular"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Pagina "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " din "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Vizualizări de pagină"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Titlul paginii"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pagini"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Parolă"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Rută"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Rute"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Cu sprijinul "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Anterior"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Perioda anterioară"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Anul anterior"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Proprietăți"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Proprietate"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Interogări"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Interogare"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parametri de interogare"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Timp real"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Proveniență"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Site-uri de proveniență"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Reîmprospătare"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerează"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Regiune"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regiuni"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Îndepărtează"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Îndepărtează membru"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Rapoarte"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Obligatoriu"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Resetează"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Resetează statisticile pentru site"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retenție"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Măsoară atractivitatea site-ului tău prin urmărirea frecvenței cu care utilizatorii se întorc."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Venit"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Urmărește venitul în timp."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Execută interogarea"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Salvează"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Ecrane"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Căutare"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Selectează"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Selectează data"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Selectează rolul"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Selectează website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Sesiune"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sesiuni"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Setări"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Partajare URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "O singură zi"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Pas de început"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Pași"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sumă"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tabletă"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Echipă"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID Echipă"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Manager echipă"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Membru echipă"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Nume echipă"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Titular echipă"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Doar vizualizare echipă"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Website-uri echipă"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Echipă"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Temă"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Această lună"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Această săptămână"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Acest an"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Fus orar"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titlu"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Astăzi"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Schimbă graficele"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total înregistrări"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Cod de urmărire"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Tranzacții"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Adevărat"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tip"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unici"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Vizitatori unici"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Clienți unici"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Necunoscut"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Fără titlu"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Utilizator"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Proprietatea utilizatorului"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Nume utilizator"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Utilizatori"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Urmărește campaniile tale cu parametri UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Valoare"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Vizualizare"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Vizualizare detalii"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Doar vizualizare"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Vizualizări"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Vizualizări per vizită"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Timp mediu de vizitare"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Vizitatori"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Vizite"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID Website"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Site-uri web"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Fereastră"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Ieri"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Scrie "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " în câmpul de mai jos pentru a confirma."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "vizitator activ"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "vizitatori activi"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Date colectate"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Ești sigur că vrei să ștergi "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Ești sigur că vrei să părăsești "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Ești sigur că vrei să ștergi "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Ești sigur că vrei să resetezi statisticile pentru "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Ștergerea unei echipe va șterge și toate website-urile echipei."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Toate datele asociate vor fi șterse, de asemenea."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Ceva n-a mers bine."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " la "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Mergi la Setări"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nume utilizator / parolă incorecte."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Domeniul nu este valid"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Lungimea minimă este de "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " caractere"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "O nouă versiune de Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " este disponibilă!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Nicio informație disponibilă."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Nu sunt disponibile date legate de eveniment."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Parolele nu se potrivesc"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Nu a fost găsit niciun rezultat."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Echipa aceasta nu are niciun website."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Nu ai creat nicio echipă."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Nu există utilizatori."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nu ai niciun site web configurat."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Pagina nu a fost găsită."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Pentru a reseta acest website, scrie "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " În câmpul de mai jos pentru a confirma."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Toate statisticile pentru acest site web vor fi șterse, dar codul de urmărire va rămâne intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Salvat cu succes."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Aceasta este adresa URL de partajare pentru "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Deja ești membru al acestei echipe."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Echipa nu a fost găsită."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Site-urile web pot fi vizualizate de către oricare membru al echipei."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Cod de urmărire"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Vrei să transferi acest website pe contul tău?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Selectează echipa căreia vrei să îi transferi site-ul."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transferă titulatura site-ului către tine sau către o altă echipă."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Eveniment declanșat"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Utilizator șters."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Pagină vizualizată"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Vizitator din "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " folosind "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " pe "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Vizitatori care au abandonat"
- }
- ]
+ "label": {
+ "access-code": "Cod de access",
+ "account": "Cont",
+ "action": "Acțiune",
+ "actions": "Acțiuni",
+ "activity": "Jurnal de activități",
+ "add": "Adaugă",
+ "add-board": "Adaugă panou",
+ "add-description": "Adaugă descriere",
+ "add-link": "Adaugă link",
+ "add-member": "Adaugă membru",
+ "add-pixel": "Adaugă pixel",
+ "add-step": "Adaugă pas",
+ "add-website": "Adaugă site web",
+ "admin": "Administrator",
+ "affiliate": "Afiliat",
+ "after": "După",
+ "all": "Toate",
+ "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ță",
+ "average": "Mediu",
+ "back": "Înapoi",
+ "before": "Înainte",
+ "behavior": "Comportament",
+ "block-selector": "Selector de bloc",
+ "boards": "Panouri",
+ "bounce-rate": "Rata de respingere",
+ "breakdown": "Detaliat",
+ "browser": "Browser",
+ "browsers": "Browsere",
+ "campaign": "Campanie",
+ "campaigns": "Campanii",
+ "cancel": "Anulează",
+ "change-password": "Schimbare parolă",
+ "channel": "Canal",
+ "channels": "Canale",
+ "chart": "Grafic",
+ "cities": "Orașe",
+ "city": "Oraș",
+ "clear-all": "Șterge tot",
+ "cls": "CLS",
+ "cohort": "Cohortă",
+ "cohorts": "Cohorte",
+ "compare": "Compară",
+ "compare-dates": "Compară datele",
+ "confirm": "Confirmă",
+ "confirm-password": "Confirmare parolă",
+ "contains": "Conține",
+ "content": "Conținut",
+ "continue": "Continuă",
+ "conversion": "Conversie",
+ "conversion-rate": "Rată de conversie",
+ "conversion-step": "Pas de conversie",
+ "count": "Număr",
+ "countries": "Țări",
+ "country": "Țară",
+ "create": "Crează",
+ "create-report": "Crează report",
+ "create-team": "Crează echipă",
+ "create-user": "Crează utilizator",
+ "created": "Creat",
+ "created-by": "Creat de",
+ "criteria": "Criterii",
+ "currency": "Monedă",
+ "current": "Curent",
+ "current-password": "Parola curentă",
+ "custom-range": "Interval personalizat",
+ "dashboard": "Tablou de bord",
+ "data": "Date",
+ "date": "Dată",
+ "date-range": "Interval",
+ "day": "Zi",
+ "default-date-range": "Interval implicit",
+ "delete": "Șterge",
+ "delete-report": "Șterge raport",
+ "delete-team": "Șterge echipă",
+ "delete-user": "Șterge utilizator",
+ "delete-website": "Șterge site web",
+ "description": "Descriere",
+ "desktop": "Desktop",
+ "destination-url": "URL destinație",
+ "details": "Detalii",
+ "device": "Dispozitiv",
+ "devices": "Dispozitive",
+ "direct": "Direct",
+ "dismiss": "Renunță",
+ "distinct-id": "ID distinct",
+ "documentation": "Documentație",
+ "does-not-contain": "Nu conține",
+ "does-not-include": "Nu include",
+ "doest-not-exist": "Nu există",
+ "domain": "Domeniu",
+ "download": "Descarcă",
+ "dropoff": "Rată de abandon",
+ "duration": "Durată",
+ "edit": "Editare",
+ "edit-member": "Editare membru",
+ "email": "Email",
+ "enable-share-url": "Activare adresă URL de distribuire",
+ "end-step": "Pas final",
+ "entry": "URL de intrare",
+ "environment": "Mediu",
+ "event": "Eveniment",
+ "event-data": "Date despre eveniment",
+ "event-name": "Nume eveniment",
+ "events": "Evenimente",
+ "exclude-bounce": "Exclude respingere",
+ "exists": "Există",
+ "exit": "URL de ieșire",
+ "false": "Fals",
+ "fcp": "FCP",
+ "field": "Câmp",
+ "fields": "Câmpuri",
+ "filter": "Filtru",
+ "filter-combined": "Combinat",
+ "filter-raw": "Brut",
+ "filters": "Filtre",
+ "first-click": "Primul click",
+ "first-seen": "Văzut pentru prima dată",
+ "funnel": "Parcursul utilizatorului",
+ "funnel-description": "Înțelege rata de conversie și rata de abandon a utilizatorilor.",
+ "funnels": "Parcursuri",
+ "goal": "Obiectiv",
+ "goals": "Obiective",
+ "goals-description": "Urmărește obiectivele de vizualizări și evenimente.",
+ "good": "Bun",
+ "greater-than": "Mai mare decât",
+ "greater-than-equals": "Mai mare sau egal cu",
+ "grouped": "Grupat",
+ "growth": "Creștere",
+ "hostname": "Nume gazdă",
+ "hour": "Oră",
+ "includes": "Include",
+ "inp": "INP",
+ "insight": "Perspectivă",
+ "insights": "Perspective",
+ "insights-description": "Aprofundează datele utilizând segmente și filtre.",
+ "invalid-url": "URL invalid",
+ "is": "Este",
+ "is-false": "Este fals",
+ "is-not": "Nu este",
+ "is-not-set": "Nu este setat",
+ "is-set": "Este setat",
+ "is-true": "Este adevărat",
+ "join": "Alătură-te",
+ "join-team": "Alătură-te echipei",
+ "journey": "Traseu",
+ "journey-description": "Înțelege cum navighează vizitatorii prin website.",
+ "journeys": "Trasee",
+ "language": "Limbă",
+ "languages": "Limbi",
+ "laptop": "Laptop",
+ "last-click": "Ultimul click",
+ "last-days": "Ultimele {x} zile",
+ "last-hours": "Ultimele {x} ore",
+ "last-months": "Ultimele {x} luni",
+ "last-seen": "Văzut ultima dată",
+ "lcp": "LCP",
+ "leave": "Părăsește",
+ "leave-team": "Părăsește echipa",
+ "less-than": "Mai puțin decât",
+ "less-than-equals": "Mai puțin sau egal cu",
+ "link": "Link",
+ "links": "Linkuri",
+ "location": "Locație",
+ "login": "Autentificare",
+ "logout": "Ieșire din cont",
+ "manage": "Administrează",
+ "manager": "Manager",
+ "mask-level": "Nivel mască",
+ "match": "Potrivire",
+ "match-all": "Toate",
+ "match-any": "Oricare",
+ "max": "Max",
+ "max-duration": "Durată maximă",
+ "maximize": "Extinde",
+ "medium": "Mediu",
+ "member": "Membru",
+ "members": "Membri",
+ "min": "Min",
+ "minute": "Minut",
+ "mobile": "Mobil",
+ "model": "Model",
+ "month": "Lună",
+ "more": "Mai mult",
+ "my-account": "Contul meu",
+ "my-websites": "Website-ul meu",
+ "name": "Nume",
+ "needs-improvement": "Are nevoie de îmbunătățiri",
+ "new-password": "Parolă nouă",
+ "none": "Niciunul",
+ "number-of-records": "{x} {x, plural, one {înregistrare} other {înregistrări}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Căutare organică",
+ "organic-shopping": "Cumpărături organice",
+ "organic-social": "Social organic",
+ "organic-video": "Video organic",
+ "os": "SO",
+ "other": "Altul",
+ "overview": "Vedere de ansamblu",
+ "owner": "Titular",
+ "page": "Pagină",
+ "page-of": "Pagina {current} din {total}",
+ "page-views": "Vizualizări de pagină",
+ "pages": "Pagini",
+ "pageTitle": "Titlul paginii",
+ "paid-ads": "Reclame plătite",
+ "paid-search": "Căutare plătită",
+ "paid-shopping": "Cumpărături plătite",
+ "paid-social": "Social plătit",
+ "paid-video": "Video plătit",
+ "password": "Parolă",
+ "path": "Rută",
+ "paths": "Rute",
+ "performance": "Performanță",
+ "pixel": "Pixel",
+ "pixels": "Pixeli",
+ "play": "Redă",
+ "poor": "Slab",
+ "powered-by": "Cu sprijinul {name}",
+ "preferences": "Preferințe",
+ "previous": "Anterior",
+ "previous-period": "Perioda anterioară",
+ "previous-year": "Anul anterior",
+ "profile": "Profil",
+ "profiles": "Profiluri",
+ "properties": "Proprietăți",
+ "property": "Proprietate",
+ "queries": "Interogări",
+ "query": "Interogare",
+ "query-parameters": "Parametri de interogare",
+ "realtime": "Timp real",
+ "recorded": "Înregistrat la",
+ "referral": "Referință",
+ "referrer": "Proveniență",
+ "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",
+ "replay": "Reluare",
+ "replay-enabled": "Reluare activată",
+ "replay-id": "Replay ID",
+ "replays": "Reluări",
+ "reports": "Rapoarte",
+ "required": "Obligatoriu",
+ "reset": "Resetează",
+ "reset-website": "Resetează statisticile pentru site",
+ "retention": "Retenție",
+ "retention-days": "Zile de păstrare",
+ "retention-description": "Măsoară atractivitatea site-ului tău prin urmărirea frecvenței cu care utilizatorii se întorc.",
+ "revenue": "Venit",
+ "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-segment": "Salvează segmentul",
+ "screen": "Ecran",
+ "screens": "Ecrane",
+ "search": "Căutare",
+ "segment": "Segment",
+ "segments": "Segmente",
+ "select": "Selectează",
+ "select-component": "Selectați componenta",
+ "select-date": "Selectează data",
+ "select-filter": "Selectează filtru",
+ "select-role": "Selectează rolul",
+ "select-website": "Selectează website",
+ "session": "Sesiune",
+ "session-data": "Date sesiune",
+ "sessions": "Sesiuni",
+ "settings": "Setări",
+ "share": "Partajează",
+ "share-url": "Partajare URL",
+ "single-day": "O singură zi",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Sursă",
+ "sources": "Surse",
+ "start-step": "Pas de început",
+ "steps": "Pași",
+ "sum": "Sumă",
+ "support": "Suport",
+ "switch-account": "Schimbă contul",
+ "table": "Tabel",
+ "tablet": "Tabletă",
+ "tag": "Etichetă",
+ "tags": "Etichete",
+ "team": "Echipă",
+ "team-id": "ID Echipă",
+ "team-manager": "Manager echipă",
+ "team-member": "Membru echipă",
+ "team-name": "Nume echipă",
+ "team-owner": "Titular echipă",
+ "team-settings": "Setări echipă",
+ "team-view-only": "Doar vizualizare echipă",
+ "team-websites": "Website-uri echipă",
+ "teams": "Echipă",
+ "term": "Termen",
+ "terms": "Termeni",
+ "theme": "Temă",
+ "this-month": "Această lună",
+ "this-week": "Această săptămână",
+ "this-year": "Acest an",
+ "timezone": "Fus orar",
+ "title": "Titlu",
+ "today": "Astăzi",
+ "toggle-charts": "Schimbă graficele",
+ "total": "Total",
+ "total-records": "Total înregistrări",
+ "tracking-code": "Cod de urmărire",
+ "traffic": "Trafic",
+ "transactions": "Tranzacții",
+ "transfer": "Transferă",
+ "transfer-website": "Transferă site-ul",
+ "true": "Adevărat",
+ "ttfb": "TTFB",
+ "type": "Tip",
+ "unique": "Unici",
+ "unique-events": "Evenimente unice",
+ "unique-visitors": "Vizitatori unici",
+ "uniqueCustomers": "Clienți unici",
+ "unknown": "Necunoscut",
+ "untitled": "Fără titlu",
+ "update": "Actualizează",
+ "url": "URL",
+ "user": "Utilizator",
+ "username": "Nume utilizator",
+ "users": "Utilizatori",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campanie",
+ "utm-content": "UTM Conținut",
+ "utm-description": "Urmărește campaniile tale cu parametri UTM.",
+ "utm-medium": "UTM Mediu",
+ "utm-source": "UTM Sursă",
+ "utm-term": "UTM Termen",
+ "value": "Valoare",
+ "version": "Versiune",
+ "view": "Vizualizare",
+ "view-details": "Vizualizare detalii",
+ "view-only": "Doar vizualizare",
+ "views": "Vizualizări",
+ "views-per-visit": "Vizualizări per vizită",
+ "visit-duration": "Timp mediu de vizitare",
+ "visitors": "Vizitatori",
+ "visits": "Vizite",
+ "website": "Site web",
+ "website-id": "ID Website",
+ "websites": "Site-uri web",
+ "window": "Fereastră",
+ "yesterday": "Ieri"
+ },
+ "message": {
+ "action-confirmation": "Scrie {confirmation} în câmpul de mai jos pentru a confirma.",
+ "active-users": "{x} {x, plural, one {vizitator activ} other {vizitatori activi}}",
+ "bad-request": "Cerere incorectă",
+ "collected-data": "Date colectate",
+ "confirm-delete": "Ești sigur că vrei să ștergi {target}?",
+ "confirm-leave": "Ești sigur că vrei să părăsești {target} ?",
+ "confirm-remove": "Ești sigur că vrei să ștergi {target} ?",
+ "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.",
+ "event-log": "{event} la {url} ",
+ "forbidden": "Interzis",
+ "go-to-settings": "Mergi la Setări",
+ "incorrect-username-password": "Nume utilizator / parolă incorecte.",
+ "invalid-domain": "Domeniul nu este valid",
+ "min-password-length": "Lungimea minimă este de {n} caractere",
+ "new-version-available": "O nouă versiune de Umami {version} este disponibilă!",
+ "no-data-available": "Nicio informație disponibilă.",
+ "no-event-data": "Nu sunt disponibile date legate de eveniment.",
+ "no-match-password": "Parolele nu se potrivesc",
+ "no-results-found": "Nu a fost găsit niciun rezultat.",
+ "no-team-websites": "Echipa aceasta nu are niciun website.",
+ "no-teams": "Nu ai creat nicio echipă.",
+ "no-users": "Nu există utilizatori.",
+ "no-websites-configured": "Nu ai niciun site web configurat.",
+ "not-found": "Negăsit",
+ "nothing-selected": "Nimic selectat.",
+ "page-not-found": "Pagina nu a fost găsită.",
+ "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-component-preview": "Selectați o componentă pentru previzualizare",
+ "select-website-first": "Selectați mai întâi un site web",
+ "sever-error": "Eroare de server",
+ "share-url": "Aceasta este adresa URL de partajare pentru {target}.",
+ "team-already-member": "Deja ești membru al acestei echipe.",
+ "team-not-found": "Echipa nu a fost găsită.",
+ "team-websites-info": "Site-urile web pot fi vizualizate de către oricare membru al echipei.",
+ "tracking-code": "Cod de urmărire",
+ "transfer-team-website-to-user": "Vrei să transferi acest website pe contul tău?",
+ "transfer-user-website-to-team": "Selectează echipa căreia vrei să îi transferi site-ul.",
+ "transfer-website": "Transferă titulatura site-ului către tine sau către o altă echipă.",
+ "triggered-event": "Eveniment declanșat",
+ "unauthorized": "Neautorizat",
+ "user-deleted": "Utilizator șters.",
+ "viewed-page": "Pagină vizualizată",
+ "visitor-log": "Vizitator din {country} folosind {browser} pe {os} {device} "
+ }
}
diff --git a/public/intl/messages/ru-RU.json b/public/intl/messages/ru-RU.json
index b7c0165ca..5bf41593c 100644
--- a/public/intl/messages/ru-RU.json
+++ b/public/intl/messages/ru-RU.json
@@ -1,1836 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Код доступа"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Действия"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Журнал активности"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Добавить"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Добавить описание"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Добавить участника"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Добавить шаг"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Добавить сайт"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Администратор"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "После"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Все"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Все время"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Аналитика"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Средний"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Назад"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "До"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Отказы"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Авария"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Браузер"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Браузеры"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Отменить"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Изменить пароль"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Города"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Город"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Очистить все"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Сравнить"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Подтвердить"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Подтвердить пароль"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Содержит"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Продолжить"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Считать"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Страны"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Страна"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Создать"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Создать отчет"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Создать команду"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Создать пользователя"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Создано"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Создано"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Текущий"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Текущий пароль"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Другой период"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Информационная панель"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Данные"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Дата"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Диапазон дат"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "День"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Диапазон дат по-умолчанию"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Удалить"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Удалить отчет"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Удалить команду"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Удалить пользователя"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Удалить сайт"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Описание"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Настольный компьютер"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Подробности"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Устройство"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Устройства"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Отклонить"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Не содержит"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Домен"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Высадка"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Изменить"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Редактировать дашборд"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Редактировать участника"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Разрешить делиться ссылкой"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "Конечный шаг"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "URL-адрес входа"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Событие"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Данные о событии"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "События"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "URL-адрес выхода"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Ложь"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Поле"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Поля"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Фильтр"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Объединенные"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Сырые данные"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Фильтры"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "Первый вход"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Воронка"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Изучите коэффициент конверсии и ухода пользователей."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Цель"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Цели"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Отслеживайте свои цели по просмотрам страниц и событиям."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Больше, чем"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Больше или равно"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Информация"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Погрузитесь глубже в свои данные с помощью сегментов и фильтров."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Является"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Не установлен"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Не установлено"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Установлен"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Присоединиться"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Присоединиться к команде"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Поймите, как пользователи перемещаются по вашему сайту."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Язык"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Языки"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Ноутбук"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Последние "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " дней"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Последние "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " часа"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Последние "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " месяцев"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Последний вход"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Уйти"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Покинуть команду"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Меньше, чем"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Меньше или равно"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Войти"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Выйти"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Управление"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Менеджер"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Максимум"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Участник"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Участники"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Минимум"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Смартфон"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Больше"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Мой профиль"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Мои сайты"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Имя"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Новый пароль"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Не указано"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "запись"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "записи"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Обзор"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Владелец"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Страница "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " из "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Просмотры страниц"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Название страницы"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Страницы"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Пароль"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Путь"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Пути"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "На движке "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Предыдущий"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Предыдущий период"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Предыдущий год"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Профиль"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Свойства"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Свойство"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Запросы"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Запрос"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Параметры запроса"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Реальное время"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Реферер"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Источники"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Обновить"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Обновить"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Регион"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Регионы"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Удалить"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Удалить участника"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Отчеты"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Обязательное"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Сбросить"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Сбросить статистику"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Удержание"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Измерьте «прилипаемость» вашего сайта, отслеживая, как часто пользователи возвращаются на него."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Выручка"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Изучите свои доходы за определенное время."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Доходная недвижимость"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Роль"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Выполнить запрос"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Сохранить"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Экраны"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Поиск"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Выберите"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Выберите дату"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Выберите роль"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Выбрать сайт"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Сессия"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Сессии"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Настройки"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Поделиться ссылкой"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Один день"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Начальный этап"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Шаги"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Сумма"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Планшет"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Команда"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID команды"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Менеджер команды"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Член команды"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Название команды"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Владелец команды"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Только командный просмотр"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Веб-сайты команды"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Команды"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Тема"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Этот месяц"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Эта неделя"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Этот год"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Часовой пояс"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Заголовок"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Сегодня"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Показать/скрыть графики"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Всего"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Всего записей"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Код отслеживания"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Транзакции"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Передача"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Передать сайт"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Правда"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Тип"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Уникальный"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Уникальные посетители"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Уникальные клиенты"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Неизвестно"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Без названия"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Обновление"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Пользователь"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "Собственность пользователя"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Имя пользователя"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Пользователи"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Отслеживайте свои кампании с помощью UTM-параметров."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Значение"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Просмотреть"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Посмотреть детали"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Только просмотр"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Просмотры"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Просмотров за посещение"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Среднее время посещения"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Посетители"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Посещения"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Сайт"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID сайта"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Сайты"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Окно"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Вчера"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Введите "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " в поле ниже, чтобы подтвердить."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " текущих посетителей"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Собранные данные"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Вы уверены, что хотите удалить "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Вы уверены, что хотите уйти "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Вы уверены, что хотите удалить "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Вы уверены, что хотите сбросить статистику "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "При удалении команды будут удалены и все ее веб-сайты."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Все связанные данные будут также удалены."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Что-то пошло не так."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Перейти к настройкам"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Неверное имя пользователя/пароль."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Некорректный домен"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Минимальная длина "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " символов"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Вышла новая версия Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Нет данных."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Данные о событиях отсутствуют."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Пароли не совпадают"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Результаты не найдены."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "У этой команды нет ни одного сайта."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Вы не создали ни одной команды."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Нет пользователей."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "У вас нет настроенных сайтов."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Страница не найдена."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Для сброса введите RESET"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Вся статистика для этого сайта будет удалена, но ваш код отслеживания останется нетронутым."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Успешно сохранено."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Это публичная ссылка для "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Вы уже состоите в команде."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Команда не найдена."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Сайты могут просматривать все члены команды."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Код отслеживания"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Перенести этот сайт в свой прфоиль?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Выберите команду, которой нужно передать этот сайт."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Передайте право владения сайтом своей учетной записи или другой команде."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Запущенное событие"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Пользователь удален."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Просмотренная страница"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Посетитель из "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " используя "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Высадка посетителей"
- }
- ]
+ "label": {
+ "access-code": "Код доступа",
+ "account": "Аккаунт",
+ "action": "Действие",
+ "actions": "Действия",
+ "activity": "Журнал активности",
+ "add": "Добавить",
+ "add-board": "Добавить доску",
+ "add-description": "Добавить описание",
+ "add-link": "Добавить ссылку",
+ "add-member": "Добавить участника",
+ "add-pixel": "Добавить пиксель",
+ "add-step": "Добавить шаг",
+ "add-website": "Добавить сайт",
+ "admin": "Администратор",
+ "affiliate": "Партнер",
+ "after": "После",
+ "all": "Все",
+ "all-time": "Все время",
+ "analysis": "Анализ",
+ "analytics": "Аналитика",
+ "aov": "AOV",
+ "application": "Приложение",
+ "apply": "Применить",
+ "arpu": "ARPU",
+ "attribution": "Атрибуция",
+ "attribution-description": "Посмотрите, как пользователи взаимодействуют с вашим маркетингом и что приводит к конверсиям.",
+ "audience": "Аудитория",
+ "average": "Средний",
+ "back": "Назад",
+ "before": "До",
+ "behavior": "Поведение",
+ "block-selector": "Выбор блока",
+ "boards": "Доски",
+ "bounce-rate": "Отказы",
+ "breakdown": "Авария",
+ "browser": "Браузер",
+ "browsers": "Браузеры",
+ "campaign": "Кампания",
+ "campaigns": "Кампании",
+ "cancel": "Отменить",
+ "change-password": "Изменить пароль",
+ "channel": "Канал",
+ "channels": "Каналы",
+ "chart": "Диаграмма",
+ "cities": "Города",
+ "city": "Город",
+ "clear-all": "Очистить все",
+ "cls": "CLS",
+ "cohort": "Когорта",
+ "cohorts": "Когорты",
+ "compare": "Сравнить",
+ "compare-dates": "Сравнить даты",
+ "confirm": "Подтвердить",
+ "confirm-password": "Подтвердить пароль",
+ "contains": "Содержит",
+ "content": "Контент",
+ "continue": "Продолжить",
+ "conversion": "Конверсия",
+ "conversion-rate": "Коэффициент конверсии",
+ "conversion-step": "Шаг конверсии",
+ "count": "Считать",
+ "countries": "Страны",
+ "country": "Страна",
+ "create": "Создать",
+ "create-report": "Создать отчет",
+ "create-team": "Создать команду",
+ "create-user": "Создать пользователя",
+ "created": "Создано",
+ "created-by": "Создано",
+ "criteria": "Критерии",
+ "currency": "Валюта",
+ "current": "Текущий",
+ "current-password": "Текущий пароль",
+ "custom-range": "Другой период",
+ "dashboard": "Информационная панель",
+ "data": "Данные",
+ "date": "Дата",
+ "date-range": "Диапазон дат",
+ "day": "День",
+ "default-date-range": "Диапазон дат по-умолчанию",
+ "delete": "Удалить",
+ "delete-report": "Удалить отчет",
+ "delete-team": "Удалить команду",
+ "delete-user": "Удалить пользователя",
+ "delete-website": "Удалить сайт",
+ "description": "Описание",
+ "desktop": "Настольный компьютер",
+ "destination-url": "URL назначения",
+ "details": "Подробности",
+ "device": "Устройство",
+ "devices": "Устройства",
+ "direct": "Прямой",
+ "dismiss": "Отклонить",
+ "distinct-id": "Уникальный ID",
+ "documentation": "Документация",
+ "does-not-contain": "Не содержит",
+ "does-not-include": "Не включает",
+ "doest-not-exist": "Не существует",
+ "domain": "Домен",
+ "download": "Скачать",
+ "dropoff": "Высадка",
+ "duration": "Длительность",
+ "edit": "Изменить",
+ "edit-member": "Редактировать участника",
+ "email": "Электронная почта",
+ "enable-share-url": "Разрешить делиться ссылкой",
+ "end-step": "Конечный шаг",
+ "entry": "URL-адрес входа",
+ "environment": "Окружение",
+ "event": "Событие",
+ "event-data": "Данные о событии",
+ "event-name": "Название события",
+ "events": "События",
+ "exclude-bounce": "Исключить отказы",
+ "exists": "Существует",
+ "exit": "URL-адрес выхода",
+ "false": "Ложь",
+ "fcp": "FCP",
+ "field": "Поле",
+ "fields": "Поля",
+ "filter": "Фильтр",
+ "filter-combined": "Объединенные",
+ "filter-raw": "Сырые данные",
+ "filters": "Фильтры",
+ "first-click": "Первый клик",
+ "first-seen": "Первый вход",
+ "funnel": "Воронка",
+ "funnel-description": "Изучите коэффициент конверсии и ухода пользователей.",
+ "funnels": "Воронки",
+ "goal": "Цель",
+ "goals": "Цели",
+ "goals-description": "Отслеживайте свои цели по просмотрам страниц и событиям.",
+ "good": "Хорошо",
+ "greater-than": "Больше, чем",
+ "greater-than-equals": "Больше или равно",
+ "grouped": "Группировано",
+ "growth": "Рост",
+ "hostname": "Имя хоста",
+ "hour": "Час",
+ "includes": "Включает",
+ "inp": "INP",
+ "insight": "Инсайт",
+ "insights": "Информация",
+ "insights-description": "Погрузитесь глубже в свои данные с помощью сегментов и фильтров.",
+ "invalid-url": "Недействительный URL",
+ "is": "Является",
+ "is-false": "Ложно",
+ "is-not": "Не установлен",
+ "is-not-set": "Не установлено",
+ "is-set": "Установлен",
+ "is-true": "Истинно",
+ "join": "Присоединиться",
+ "join-team": "Присоединиться к команде",
+ "journey": "Путь",
+ "journey-description": "Поймите, как пользователи перемещаются по вашему сайту.",
+ "journeys": "Пути",
+ "language": "Язык",
+ "languages": "Языки",
+ "laptop": "Ноутбук",
+ "last-click": "Последний клик",
+ "last-days": "Последние {x} дней",
+ "last-hours": "Последние {x} часа",
+ "last-months": "Последние {x} месяцев",
+ "last-seen": "Последний вход",
+ "lcp": "LCP",
+ "leave": "Уйти",
+ "leave-team": "Покинуть команду",
+ "less-than": "Меньше, чем",
+ "less-than-equals": "Меньше или равно",
+ "link": "Ссылка",
+ "links": "Ссылки",
+ "location": "Местоположение",
+ "login": "Войти",
+ "logout": "Выйти",
+ "manage": "Управление",
+ "manager": "Менеджер",
+ "mask-level": "Уровень маскировки",
+ "match": "Соответствие",
+ "match-all": "Все",
+ "match-any": "Любой",
+ "max": "Максимум",
+ "max-duration": "Максимальная длительность",
+ "maximize": "Развернуть",
+ "medium": "Средний",
+ "member": "Участник",
+ "members": "Участники",
+ "min": "Минимум",
+ "minute": "Минута",
+ "mobile": "Смартфон",
+ "model": "Модель",
+ "month": "Месяц",
+ "more": "Больше",
+ "my-account": "Мой профиль",
+ "my-websites": "Мои сайты",
+ "name": "Имя",
+ "needs-improvement": "Требует улучшения",
+ "new-password": "Новый пароль",
+ "none": "Не указано",
+ "number-of-records": "{x} {x, plural, one {запись} other {записи}}",
+ "ok": "ОК",
+ "online": "Онлайн",
+ "organic-search": "Органический поиск",
+ "organic-shopping": "Органические покупки",
+ "organic-social": "Органические соцсети",
+ "organic-video": "Органическое видео",
+ "os": "ОС",
+ "other": "Другое",
+ "overview": "Обзор",
+ "owner": "Владелец",
+ "page": "Страница",
+ "page-of": "Страница {current} из {total}",
+ "page-views": "Просмотры страниц",
+ "pages": "Страницы",
+ "pageTitle": "Название страницы",
+ "paid-ads": "Платная реклама",
+ "paid-search": "Платный поиск",
+ "paid-shopping": "Платные покупки",
+ "paid-social": "Платные соцсети",
+ "paid-video": "Платное видео",
+ "password": "Пароль",
+ "path": "Путь",
+ "paths": "Пути",
+ "performance": "Производительность",
+ "pixel": "Пиксель",
+ "pixels": "Пиксели",
+ "play": "Воспроизвести",
+ "poor": "Плохо",
+ "powered-by": "На движке {name}",
+ "preferences": "Настройки",
+ "previous": "Предыдущий",
+ "previous-period": "Предыдущий период",
+ "previous-year": "Предыдущий год",
+ "profile": "Профиль",
+ "profiles": "Профили",
+ "properties": "Свойства",
+ "property": "Свойство",
+ "queries": "Запросы",
+ "query": "Запрос",
+ "query-parameters": "Параметры запроса",
+ "realtime": "Реальное время",
+ "recorded": "Записано",
+ "referral": "Реферал",
+ "referrer": "Реферер",
+ "referrers": "Источники",
+ "refresh": "Обновить",
+ "regenerate": "Обновить",
+ "regex-match": "Соответствует регулярному выражению",
+ "regex-not-match": "Не соответствует регулярному выражению",
+ "region": "Регион",
+ "regions": "Регионы",
+ "remaining": "Осталось",
+ "remove": "Удалить",
+ "remove-member": "Удалить участника",
+ "replay": "Запись сессии",
+ "replay-enabled": "Запись сессий включена",
+ "replay-id": "Replay ID",
+ "replays": "Записи сессий",
+ "reports": "Отчеты",
+ "required": "Обязательное",
+ "reset": "Сбросить",
+ "reset-website": "Сбросить статистику",
+ "retention": "Удержание",
+ "retention-days": "Дни хранения",
+ "retention-description": "Измерьте «прилипаемость» вашего сайта, отслеживая, как часто пользователи возвращаются на него.",
+ "revenue": "Выручка",
+ "revenue-description": "Изучите свои доходы за определенное время.",
+ "role": "Роль",
+ "run-query": "Выполнить запрос",
+ "sample-rate": "Частота выборки",
+ "sample-size": "Размер выборки",
+ "save": "Сохранить",
+ "save-cohort": "Сохранить когорту",
+ "save-segment": "Сохранить сегмент",
+ "screen": "Экран",
+ "screens": "Экраны",
+ "search": "Поиск",
+ "segment": "Сегмент",
+ "segments": "Сегменты",
+ "select": "Выберите",
+ "select-component": "Выберите компонент",
+ "select-date": "Выберите дату",
+ "select-filter": "Выберите фильтр",
+ "select-role": "Выберите роль",
+ "select-website": "Выбрать сайт",
+ "session": "Сессия",
+ "session-data": "Данные сессии",
+ "sessions": "Сессии",
+ "settings": "Настройки",
+ "share": "Поделиться",
+ "share-url": "Поделиться ссылкой",
+ "single-day": "Один день",
+ "slug": "Slug",
+ "sms": "СМС",
+ "source": "Источник",
+ "sources": "Источники",
+ "start-step": "Начальный этап",
+ "steps": "Шаги",
+ "sum": "Сумма",
+ "support": "Поддержка",
+ "switch-account": "Сменить аккаунт",
+ "table": "Таблица",
+ "tablet": "Планшет",
+ "tag": "Тег",
+ "tags": "Теги",
+ "team": "Команда",
+ "team-id": "ID команды",
+ "team-manager": "Менеджер команды",
+ "team-member": "Член команды",
+ "team-name": "Название команды",
+ "team-owner": "Владелец команды",
+ "team-settings": "Настройки команды",
+ "team-view-only": "Только командный просмотр",
+ "team-websites": "Веб-сайты команды",
+ "teams": "Команды",
+ "term": "Поисковый запрос",
+ "terms": "Условия",
+ "theme": "Тема",
+ "this-month": "Этот месяц",
+ "this-week": "Эта неделя",
+ "this-year": "Этот год",
+ "timezone": "Часовой пояс",
+ "title": "Заголовок",
+ "today": "Сегодня",
+ "toggle-charts": "Показать/скрыть графики",
+ "total": "Всего",
+ "total-records": "Всего записей",
+ "tracking-code": "Код отслеживания",
+ "traffic": "Трафик",
+ "transactions": "Транзакции",
+ "transfer": "Передача",
+ "transfer-website": "Передать сайт",
+ "true": "Правда",
+ "ttfb": "TTFB",
+ "type": "Тип",
+ "unique": "Уникальный",
+ "unique-events": "Уникальные события",
+ "unique-visitors": "Уникальные посетители",
+ "uniqueCustomers": "Уникальные клиенты",
+ "unknown": "Неизвестно",
+ "untitled": "Без названия",
+ "update": "Обновление",
+ "url": "URL",
+ "user": "Пользователь",
+ "username": "Имя пользователя",
+ "users": "Пользователи",
+ "utm": "UTM",
+ "utm-campaign": "UTM-кампания",
+ "utm-content": "UTM-контент",
+ "utm-description": "Отслеживайте свои кампании с помощью UTM-параметров.",
+ "utm-medium": "UTM-канал",
+ "utm-source": "UTM-источник",
+ "utm-term": "UTM-запрос",
+ "value": "Значение",
+ "version": "Версия",
+ "view": "Просмотреть",
+ "view-details": "Посмотреть детали",
+ "view-only": "Только просмотр",
+ "views": "Просмотры",
+ "views-per-visit": "Просмотров за посещение",
+ "visit-duration": "Среднее время посещения",
+ "visitors": "Посетители",
+ "visits": "Посещения",
+ "website": "Сайт",
+ "website-id": "ID сайта",
+ "websites": "Сайты",
+ "window": "Окно",
+ "yesterday": "Вчера"
+ },
+ "message": {
+ "action-confirmation": "Введите {confirmation} в поле ниже, чтобы подтвердить.",
+ "active-users": "{x} текущих посетителей",
+ "bad-request": "Неверный запрос",
+ "collected-data": "Собранные данные",
+ "confirm-delete": "Вы уверены, что хотите удалить {target}?",
+ "confirm-leave": "Вы уверены, что хотите уйти {target} ?",
+ "confirm-remove": "Вы уверены, что хотите удалить {target} ?",
+ "confirm-reset": "Вы уверены, что хотите сбросить статистику {target}?",
+ "delete-team-warning": "При удалении команды будут удалены и все ее веб-сайты.",
+ "delete-website-warning": "Все связанные данные будут также удалены.",
+ "empty-dashboard": "Ваша панель управления пуста. Нажмите Изменить, чтобы добавить первый компонент.",
+ "error": "Что-то пошло не так.",
+ "event-log": "{event} на {url} ",
+ "forbidden": "Доступ запрещён",
+ "go-to-settings": "Перейти к настройкам",
+ "incorrect-username-password": "Неверное имя пользователя/пароль.",
+ "invalid-domain": "Некорректный домен",
+ "min-password-length": "Минимальная длина {n} символов",
+ "new-version-available": "Вышла новая версия Umami {version}!",
+ "no-data-available": "Нет данных.",
+ "no-event-data": "Данные о событиях отсутствуют.",
+ "no-match-password": "Пароли не совпадают",
+ "no-results-found": "Результаты не найдены.",
+ "no-team-websites": "У этой команды нет ни одного сайта.",
+ "no-teams": "Вы не создали ни одной команды.",
+ "no-users": "Нет пользователей.",
+ "no-websites-configured": "У вас нет настроенных сайтов.",
+ "not-found": "Не найдено",
+ "nothing-selected": "Ничего не выбрано.",
+ "page-not-found": "Страница не найдена.",
+ "reset-website": "Для сброса введите RESET",
+ "reset-website-warning": "Вся статистика для этого сайта будет удалена, но ваш код отслеживания останется нетронутым.",
+ "saved": "Успешно сохранено.",
+ "select-component-preview": "Выберите компонент для предпросмотра",
+ "select-website-first": "Сначала выберите сайт",
+ "sever-error": "Ошибка сервера",
+ "share-url": "Это публичная ссылка для {target}.",
+ "team-already-member": "Вы уже состоите в команде.",
+ "team-not-found": "Команда не найдена.",
+ "team-websites-info": "Сайты могут просматривать все члены команды.",
+ "tracking-code": "Код отслеживания",
+ "transfer-team-website-to-user": "Перенести этот сайт в свой прфоиль?",
+ "transfer-user-website-to-team": "Выберите команду, которой нужно передать этот сайт.",
+ "transfer-website": "Передайте право владения сайтом своей учетной записи или другой команде.",
+ "triggered-event": "Запущенное событие",
+ "unauthorized": "Не авторизован",
+ "user-deleted": "Пользователь удален.",
+ "viewed-page": "Просмотренная страница",
+ "visitor-log": "Посетитель из {country} используя {browser} на {os} {device} "
+ }
}
diff --git a/public/intl/messages/si-LK.json b/public/intl/messages/si-LK.json
index e18561c9d..570687e4b 100644
--- a/public/intl/messages/si-LK.json
+++ b/public/intl/messages/si-LK.json
@@ -1,1874 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Actions"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "වෙබ් අඩවිය එක් කරන්න"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "සියල්ල"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "හැම වෙලාවෙම"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "ආපසු"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Bounce rate"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Browsers"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "අවලංගු කරන්න"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "මුරපදය වෙනස් කරන්න"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "මුරපදය සත්යාපනය කරන්න"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Countries"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "වත්මන් මුරපදය"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "අභිරුචි පරාසය"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "උපකරණ පුවරුව"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "දින පරාසය"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "පෙරනිමි දින පරාසය"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "මකන්න"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "වෙබ් අඩවිය මකන්න"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Desktop"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Devices"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "මගහරින්න"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "වසම"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "සංස්කරණය කරන්න"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "බෙදාගැනීමේ URL සබල කරන්න"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "සිදුවීම් දත්ත"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Events"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Combined"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Raw"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "භාෂාව"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "අන්තිම "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " දින"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "අන්තිම "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " පැය"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "ලොග් වෙන්න"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "පිටවීම"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobile"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "තවත්"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "නම"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "අලුත් මුරපදය"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "කිසිවක් නැත"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "හිමිකරු"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Page views"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Pages"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "මුරපදය"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "පැතිකඩ"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "තත්ය කාල"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Referrers"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "නැවුම් කරන්න"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "අවශ්යයි"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "යළි පිහිටුවන්න"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "සංඛ්යා ලේඛන නැවත සකසන්න"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "සුරකින්න"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "සැකසුම්"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "බෙදාගැනීමේ URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "තනි දවස"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "තේමාව"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "මෙ මාසය"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "මේ සතිය"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "මේ අවුරුද්ද"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "වේලා කලාපය"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "අද"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "ලුහුබැඳීමේ කේතය"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unique visitors"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "නොදනී"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "පරිශීලක නාමය"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "තොරතුරු පෙන්වන්න"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Views"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Visitors"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "වෙබ් අඩවි"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "ඊයේ"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " දැන් "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "අමුත්තා"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "අමුත්තන්"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " මකා දැමීම ගැන විශ්වාසද?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ට අදාල සංඛ්යාලේඛන නැවත පිහිටුවීමට අවශ්යද?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All website data will be deleted."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Something went wrong."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "සැකසීම් වෙත යන්න"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "වැරදි පරිශීලක නාමය/මුරපදය."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Invalid domain. Do not include http/https."
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "පෙන්වීමට දත්ත නොමැත."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Passwords do not match."
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "You do not have any websites configured."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "පිටුව හමු නොවීය."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your settings will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Saved."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "මේ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " සඳහා ප්රසිද්ධියේ බෙදාගත් URL එකයි."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "To track stats for this website, place the following code in the "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " section of your HTML."
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Visitor from "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " using "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "ප්රවේශ කේතය",
+ "account": "ගිණුම",
+ "action": "ක්රියාව",
+ "actions": "ක්රියා",
+ "activity": "Activity log",
+ "add": "එකතු කරන්න",
+ "add-board": "පුවරුව එකතු කරන්න",
+ "add-description": "විස්තරය එකතු කරන්න",
+ "add-link": "සබැඳිය එකතු කරන්න",
+ "add-member": "සාමාජිකයා එකතු කරන්න",
+ "add-pixel": "පික්සලය එකතු කරන්න",
+ "add-step": "පියවර එකතු කරන්න",
+ "add-website": "වෙබ් අඩවිය එක් කරන්න",
+ "admin": "Administrator",
+ "affiliate": "අනුබද්ධ",
+ "after": "පසුව",
+ "all": "සියල්ල",
+ "all-time": "හැම වෙලාවෙම",
+ "analysis": "විශ්ලේෂණය",
+ "analytics": "විශ්ලේෂණ",
+ "aov": "AOV",
+ "application": "යෙදුම",
+ "apply": "යොදන්න",
+ "arpu": "ARPU",
+ "attribution": "ආරෝපණය",
+ "attribution-description": "පරිශීලකයින් ඔබේ අලෙවිකරණය සමඟ කටයුතු කරන ආකාරය සහ පරිවර්තන මෙහෙයවන දේ බලන්න.",
+ "audience": "ප්රේක්ෂකයින්",
+ "average": "සාමාන්ය",
+ "back": "ආපසු",
+ "before": "පෙර",
+ "behavior": "අචරණය",
+ "block-selector": "කොටස් තෝරනය",
+ "boards": "පුවරු",
+ "bounce-rate": "ප්රතිචිප්ත අනුපාතය",
+ "breakdown": "බිඳීම",
+ "browser": "බ්රවුසරය",
+ "browsers": "බ්රවුසර",
+ "campaign": "ව්යාපාරය",
+ "campaigns": "ව්යාපාර",
+ "cancel": "අවලංගු කරන්න",
+ "change-password": "මුරපදය වෙනස් කරන්න",
+ "channel": "නාලිකාව",
+ "channels": "නාලිකා",
+ "chart": "ප්රස්ථාරය",
+ "cities": "නගර",
+ "city": "නගරය",
+ "clear-all": "සියල්ල හිස් කරන්න",
+ "cls": "CLS",
+ "cohort": "සමූහය",
+ "cohorts": "සමූහ",
+ "compare": "සංසන්දනය",
+ "compare-dates": "දින සංසන්දනය",
+ "confirm": "තහවුරු කරන්න",
+ "confirm-password": "මුරපදය සත්යාපනය කරන්න",
+ "contains": "අඩංගු වේ",
+ "content": "අන්තර්ගතය",
+ "continue": "ඉදිරියට",
+ "conversion": "පරිවර්තනය",
+ "conversion-rate": "පරිවර්තන අනුපාතය",
+ "conversion-step": "පරිවර්තන පියවර",
+ "count": "ගණන",
+ "countries": "රටවල්",
+ "country": "රට",
+ "create": "සාදන්න",
+ "create-report": "වාර්තාව සාදන්න",
+ "create-team": "කණ්ඩායම සාදන්න",
+ "create-user": "පරිශීලකයා සාදන්න",
+ "created": "සාදන ලදි",
+ "created-by": "සාදන ලද්දේ",
+ "criteria": "නිර්ණායක",
+ "currency": "මුදල් ඒකකය",
+ "current": "වත්මන්",
+ "current-password": "වත්මන් මුරපදය",
+ "custom-range": "අභිරුචි පරාසය",
+ "dashboard": "උපකරණ පුවරුව",
+ "data": "දත්ත",
+ "date": "දිනය",
+ "date-range": "දින පරාසය",
+ "day": "දිනය",
+ "default-date-range": "පෙරනිමි දින පරාසය",
+ "delete": "මකන්න",
+ "delete-report": "වාර්තාව මකන්න",
+ "delete-team": "කණ්ඩායම මකන්න",
+ "delete-user": "පරිශීලකයා මකන්න",
+ "delete-website": "වෙබ් අඩවිය මකන්න",
+ "description": "විස්තරය",
+ "desktop": "ඩෙස්ක්ටොප්",
+ "destination-url": "ගමනාන්ත URL",
+ "details": "විස්තර",
+ "device": "උපාංගය",
+ "devices": "උපාංග",
+ "direct": "සෘජු",
+ "dismiss": "මගහරින්න",
+ "distinct-id": "විශේෂිත ID",
+ "documentation": "ලේඛනගත කිරීම",
+ "does-not-contain": "අඩංගු නොවේ",
+ "does-not-include": "ඇතුළත් නොවේ",
+ "doest-not-exist": "පවතින්නේ නැත",
+ "domain": "වසම",
+ "download": "බාගන්න",
+ "dropoff": "අතහැර යෑම",
+ "duration": "කාලය",
+ "edit": "සංස්කරණය කරන්න",
+ "edit-member": "සාමාජිකයා සංස්කරණය",
+ "email": "විද්යුත් තැපෑල",
+ "enable-share-url": "බෙදාගැනීමේ URL සබල කරන්න",
+ "end-step": "අවසාන පියවර",
+ "entry": "Entry URL",
+ "environment": "පරිසරය",
+ "event": "සිදුවීම",
+ "event-data": "සිදුවීම් දත්ත",
+ "event-name": "සිදුවීම් නාමය",
+ "events": "සිදුවීම්",
+ "exclude-bounce": "ප්රතිචිප්ත බැහැර කරන්න",
+ "exists": "පවතී",
+ "exit": "Exit URL",
+ "false": "අසත්ය",
+ "fcp": "FCP",
+ "field": "ක්ෂේත්රය",
+ "fields": "ක්ෂේත්ර",
+ "filter": "පෙරහන",
+ "filter-combined": "ඒකාබද්ධ",
+ "filter-raw": "අමු",
+ "filters": "පෙරහන්",
+ "first-click": "පළමු ක්ලික්",
+ "first-seen": "මුලින් දුටු",
+ "funnel": "පුනීලය",
+ "funnel-description": "පරිශීලකයින්ගේ පරිවර්තන සහ අතහැර යෑමේ අනුපාතය තේරුම් ගන්න.",
+ "funnels": "පුනීල",
+ "goal": "ඉලක්කය",
+ "goals": "ඉලක්ක",
+ "goals-description": "පිටු නැරඹීම් සහ සිදුවීම් සඳහා ඔබේ ඉලක්ක නිරීක්ෂණය කරන්න.",
+ "good": "හොඳ",
+ "greater-than": "වඩා විශාලයි",
+ "greater-than-equals": "වඩා විශාල හෝ සමානයි",
+ "grouped": "කාණ්ඩගත",
+ "growth": "වර්ධනය",
+ "hostname": "ධාරක නාමය",
+ "hour": "පැය",
+ "includes": "ඇතුළත් වේ",
+ "inp": "INP",
+ "insight": "අවබෝධය",
+ "insights": "අවබෝධ",
+ "insights-description": "ඛණ්ඩ සහ පෙරහන් භාවිතා කර ඔබේ දත්ත ගැඹුරින් බලන්න.",
+ "invalid-url": "වලංගු නොවන URL",
+ "is": "වේ",
+ "is-false": "අසත්යයි",
+ "is-not": "නොවේ",
+ "is-not-set": "සකසා නැත",
+ "is-set": "සකසා ඇත",
+ "is-true": "සත්යයි",
+ "join": "සම්බන්ධ වන්න",
+ "join-team": "කණ්ඩායමට සම්බන්ධ වන්න",
+ "journey": "ගමන",
+ "journey-description": "පරිශීලකයින් ඔබේ වෙබ් අඩවිය හරහා සැරිසරන ආකාරය තේරුම් ගන්න.",
+ "journeys": "ගමන්",
+ "language": "භාෂාව",
+ "languages": "භාෂා",
+ "laptop": "ලැප්ටොප්",
+ "last-click": "අවසාන ක්ලික්",
+ "last-days": "අන්තිම {x} දින",
+ "last-hours": "අන්තිම {x} පැය",
+ "last-months": "අන්තිම {x} මාස",
+ "last-seen": "අවසන් දුටු",
+ "lcp": "LCP",
+ "leave": "ඉවත් වන්න",
+ "leave-team": "කණ්ඩායමෙන් ඉවත් වන්න",
+ "less-than": "වඩා කුඩායි",
+ "less-than-equals": "වඩා කුඩා හෝ සමානයි",
+ "link": "සබැඳිය",
+ "links": "සබැඳි",
+ "location": "ස්ථානය",
+ "login": "ලොග් වෙන්න",
+ "logout": "පිටවීම",
+ "manage": "කළමනාකරණය",
+ "manager": "කළමනාකරු",
+ "mask-level": "මාස් මට්ටම",
+ "match": "ගැළපීම",
+ "match-all": "සියල්ල",
+ "match-any": "ඕනෑම",
+ "max": "උපරිම",
+ "max-duration": "උපරිම කාලය",
+ "maximize": "Expand",
+ "medium": "මාධ්යය",
+ "member": "සාමාජිකයා",
+ "members": "සාමාජිකයින්",
+ "min": "අවම",
+ "minute": "මිනිත්තුව",
+ "mobile": "ජංගම",
+ "model": "ආදර්ශය",
+ "month": "මාසය",
+ "more": "තවත්",
+ "my-account": "මගේ ගිණුම",
+ "my-websites": "මගේ වෙබ් අඩවි",
+ "name": "නම",
+ "needs-improvement": "වැඩිදියුණු කිරීම අවශ්ය",
+ "new-password": "අලුත් මුරපදය",
+ "none": "කිසිවක් නැත",
+ "number-of-records": "{x} {x, plural, one {වාර්තාව} other {වාර්තා}}",
+ "ok": "OK",
+ "online": "සබැඳි",
+ "organic-search": "කාබනික සෙවීම",
+ "organic-shopping": "කාබනික සාප්පු සවාරි",
+ "organic-social": "කාබනික සමාජ",
+ "organic-video": "කාබනික වීඩියෝ",
+ "os": "OS",
+ "other": "වෙනත්",
+ "overview": "දළ විసුරුම",
+ "owner": "හිමිකරු",
+ "page": "පිටුව",
+ "page-of": "පිටුව {current} / {total}",
+ "page-views": "පිටු නැරඹීම්",
+ "pages": "පිටු",
+ "pageTitle": "පිටු මාතෘකාව",
+ "paid-ads": "ගෙවූ දැන්වීම්",
+ "paid-search": "ගෙවූ සෙවීම",
+ "paid-shopping": "ගෙවූ සාප්පු සවාරි",
+ "paid-social": "ගෙවූ සමාජ",
+ "paid-video": "ගෙවූ වීඩියෝ",
+ "password": "මුරපදය",
+ "path": "මාර්ගය",
+ "paths": "මාර්ග",
+ "performance": "කාර්යක්ෂමතාව",
+ "pixel": "පික්සලය",
+ "pixels": "පික්සල",
+ "play": "ධාවනය කරන්න",
+ "poor": "දුර්වල",
+ "powered-by": "{name} මඟින් බලගැන්වේ",
+ "preferences": "මනාප",
+ "previous": "පෙර",
+ "previous-period": "පෙර කාලය",
+ "previous-year": "පෙර වසර",
+ "profile": "පැතිකඩ",
+ "profiles": "පැතිකඩ",
+ "properties": "ගුණාංග",
+ "property": "ගුණාංගය",
+ "queries": "විමසීම්",
+ "query": "විමසුම",
+ "query-parameters": "විමසුම් පරාමිති",
+ "realtime": "තත්ය කාල",
+ "recorded": "පටිගත කළේ",
+ "referral": "යොමු කිරීම",
+ "referrer": "යොමු කරන්නා",
+ "referrers": "යොමු කරන්නන්",
+ "refresh": "නැවුම් කරන්න",
+ "regenerate": "නැවත උත්පාදනය",
+ "regex-match": "Regex සමඟ ගැලපේ",
+ "regex-not-match": "Regex සමඟ නොගැලපේ",
+ "region": "කලාපය",
+ "regions": "කලාප",
+ "remaining": "ඉතිරි",
+ "remove": "ඉවත් කරන්න",
+ "remove-member": "සාමාජිකයා ඉවත් කරන්න",
+ "replay": "නැවත ධාවනය",
+ "replay-enabled": "නැවත ධාවනය සක්රිය",
+ "replay-id": "Replay ID",
+ "replays": "නැවත ධාවනයන්",
+ "reports": "වාර්තා",
+ "required": "අවශ්යයි",
+ "reset": "යළි පිහිටුවන්න",
+ "reset-website": "සංඛ්යා ලේඛන නැවත සකසන්න",
+ "retention": "රඳවා ගැනීම",
+ "retention-days": "රඳවා ගැනීමේ දින",
+ "retention-description": "පරිශීලකයින් කොපමණ වාරයක් නැවත පැමිණෙනවාද යන්න නිරීක්ෂණය කර ඔබේ වෙබ් අඩවියේ ඇලෙන සුළුබව මනින්න.",
+ "revenue": "ආදායම",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "භූමිකාව",
+ "run-query": "විමසුම ධාවනය කරන්න",
+ "sample-rate": "සාම්පල් අනුපාතය",
+ "sample-size": "සාම්පල් ප්රමාණය",
+ "save": "සුරකින්න",
+ "save-cohort": "සමූහය සුරකින්න",
+ "save-segment": "ඛණ්ඩය සුරකින්න",
+ "screen": "තිරය",
+ "screens": "තිර",
+ "search": "සෙවීම",
+ "segment": "ඛණ්ඩය",
+ "segments": "ඛණ්ඩ",
+ "select": "තෝරන්න",
+ "select-component": "කොටසක් තෝරන්න",
+ "select-date": "දිනය තෝරන්න",
+ "select-filter": "පෙරහන තෝරන්න",
+ "select-role": "භූමිකාව තෝරන්න",
+ "select-website": "වෙබ් අඩවිය තෝරන්න",
+ "session": "සැසිය",
+ "session-data": "සැසි දත්ත",
+ "sessions": "සැසි",
+ "settings": "සැකසුම්",
+ "share": "බෙදාගන්න",
+ "share-url": "බෙදාගැනීමේ URL",
+ "single-day": "තනි දවස",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "මූලාශ්රය",
+ "sources": "මූලාශ්ර",
+ "start-step": "ආරම්භක පියවර",
+ "steps": "පියවර",
+ "sum": "එකතුව",
+ "support": "සහාය",
+ "switch-account": "ගිණුම මාරු කරන්න",
+ "table": "වගුව",
+ "tablet": "ටැබ්ලටය",
+ "tag": "ටැගය",
+ "tags": "ටැග්",
+ "team": "කණ්ඩායම",
+ "team-id": "කණ්ඩායම් ID",
+ "team-manager": "කණ්ඩායම් කළමනාකරු",
+ "team-member": "කණ්ඩායම් සාමාජිකයා",
+ "team-name": "කණ්ඩායම් නම",
+ "team-owner": "කණ්ඩායම් හිමිකරු",
+ "team-settings": "කණ්ඩායම් සැකසුම්",
+ "team-view-only": "කණ්ඩායම් බැලීම පමණි",
+ "team-websites": "කණ්ඩායම් වෙබ් අඩවි",
+ "teams": "කණ්ඩායම්",
+ "term": "යෙදුම",
+ "terms": "නියම",
+ "theme": "තේමාව",
+ "this-month": "මෙ මාසය",
+ "this-week": "මේ සතිය",
+ "this-year": "මේ අවුරුද්ද",
+ "timezone": "වේලා කලාපය",
+ "title": "මාතෘකාව",
+ "today": "අද",
+ "toggle-charts": "ප්රස්ථාර ටොගල් කරන්න",
+ "total": "මුළු",
+ "total-records": "මුළු වාර්තා",
+ "tracking-code": "ලුහුබැඳීමේ කේතය",
+ "traffic": "ගමනාගමනය",
+ "transactions": "ගනුදෙනු",
+ "transfer": "මාරු කරන්න",
+ "transfer-website": "වෙබ් අඩවිය මාරු කරන්න",
+ "true": "සත්ය",
+ "ttfb": "TTFB",
+ "type": "වර්ගය",
+ "unique": "අනන්ය",
+ "unique-events": "අනන්ය සිදුවීම්",
+ "unique-visitors": "අනන්ය නරඹන්නන්",
+ "uniqueCustomers": "අනන්ය ගනුදෙනුකරුවන්",
+ "unknown": "නොදනී",
+ "untitled": "නම් නොකළ",
+ "update": "යාවත්කාලීන කරන්න",
+ "url": "URL",
+ "user": "පරිශීලකයා",
+ "username": "පරිශීලක නාමය",
+ "users": "පරිශීලකයින්",
+ "utm": "UTM",
+ "utm-campaign": "UTM ව්යාපාරය",
+ "utm-content": "UTM අන්තර්ගතය",
+ "utm-description": "UTM පරාමිති හරහා ඔබේ ව්යාපාර නිරීක්ෂණය කරන්න.",
+ "utm-medium": "UTM මාධ්යය",
+ "utm-source": "UTM මූලාශ්රය",
+ "utm-term": "UTM යෙදුම",
+ "value": "අගය",
+ "version": "අනුවාදය",
+ "view": "බලන්න",
+ "view-details": "තොරතුරු පෙන්වන්න",
+ "view-only": "බැලීම පමණි",
+ "views": "නැරඹීම්",
+ "views-per-visit": "සංචාරයකට නැරඹීම්",
+ "visit-duration": "සංචාර කාලය",
+ "visitors": "නරඹන්නන්",
+ "visits": "සංචාර",
+ "website": "වෙබ් අඩවිය",
+ "website-id": "වෙබ් අඩවි ID",
+ "websites": "වෙබ් අඩවි",
+ "window": "කවුළුව",
+ "yesterday": "ඊයේ"
+ },
+ "message": {
+ "action-confirmation": "තහවුරු කිරීමට පහත කොටුවේ {confirmation} ටයිප් කරන්න.",
+ "active-users": "{x} දැන් {x, plural, one {අමුත්තා} other {අමුත්තන්}}",
+ "bad-request": "වලංගු නොවන ඉල්ලීමක්",
+ "collected-data": "එකතු කළ දත්ත",
+ "confirm-delete": "{target} මකා දැමීම ගැන විශ්වාසද?",
+ "confirm-leave": "ඔබට {target} වෙතින් ඉවත් වීමට අවශ්ය බව විශ්වාසද?",
+ "confirm-remove": "ඔබට {target} ඉවත් කිරීමට අවශ්ය බව විශ්වාසද?",
+ "confirm-reset": "{target} ට අදාල සංඛ්යාලේඛන නැවත පිහිටුවීමට අවශ්යද?",
+ "delete-team-warning": "කණ්ඩායමක් මකා දැමීමෙන් එහි සියලු වෙබ් අඩවි ද මැකෙනු ඇත.",
+ "delete-website-warning": "සියලුම වෙබ් අඩවි දත්ත මකා දැමෙනු ඇත.",
+ "empty-dashboard": "ඔබේ ඩැෂ්බෝඩ් හිස් ය. ඔබේ පළමු කොටස එක් කිරීමට සංස්කරණය ක්ලික් කරන්න.",
+ "error": "යමක් වැරදී ගියා.",
+ "event-log": "{url} හි {event} ",
+ "forbidden": "තහනම්",
+ "go-to-settings": "සැකසීම් වෙත යන්න",
+ "incorrect-username-password": "වැරදි පරිශීලක නාමය/මුරපදය.",
+ "invalid-domain": "වලංගු නොවන ඩොමේනයකි. http/https ඇතුළත් නොකරන්න.",
+ "min-password-length": "අවම {n} අක්ෂර දිග",
+ "new-version-available": "Umami හි නව අනුවාදයක් {version} ලබා ගත හැකිය!",
+ "no-data-available": "පෙන්වීමට දත්ත නොමැත.",
+ "no-event-data": "සිදුවීම් දත්ත නොමැත.",
+ "no-match-password": "මුරපද නොගැළපේ.",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "මෙම කණ්ඩායමට වෙබ් අඩවි නොමැත.",
+ "no-teams": "ඔබ කිසිදු කණ්ඩායමක් සාදා නැත.",
+ "no-users": "පරිශීලකයින් නොමැත.",
+ "no-websites-configured": "ඔබ වෙබ් අඩවි කිසිවක් සකසා නැත.",
+ "not-found": "සොයා ගත නොහැක",
+ "nothing-selected": "කිසිවක් තෝරා නැත.",
+ "page-not-found": "පිටුව හමු නොවීය.",
+ "reset-website": "මෙම වෙබ් අඩවිය නැවත පිහිටුවීමට, පහත කොටුවේ {confirmation} ටයිප් කර තහවුරු කරන්න.",
+ "reset-website-warning": "මෙම වෙබ් අඩවියට අදාල සියලු සංඛ්යාලේඛන මකා දැමෙනු ඇත, නමුත් ඔබේ සැකසුම් නොවෙනස්ව පවතිනු ඇත.",
+ "saved": "සුරකින ලදි.",
+ "select-component-preview": "පෙරදසුනක් සඳහා කොටසක් තෝරන්න",
+ "select-website-first": "පළමුව වෙබ් අඩවියක් තෝරන්න",
+ "sever-error": "සේවාදායක දෝෂයකි",
+ "share-url": "මේ {target} සඳහා ප්රසිද්ධියේ බෙදාගත් URL එකයි.",
+ "team-already-member": "ඔබ දැනටමත් මෙම කණ්ඩායමේ සාමාජිකයෙකි.",
+ "team-not-found": "කණ්ඩායම සොයා ගත නොහැක.",
+ "team-websites-info": "කණ්ඩායමේ ඕනෑම කෙනෙකුට වෙබ් අඩවි බැලිය හැකිය.",
+ "tracking-code": "මෙම වෙබ් අඩවියේ සංඛ්යාලේඛන නිරීක්ෂණය කිරීමට, පහත කේතය ඔබේ HTML හි ... කොටස තුළ තබන්න.",
+ "transfer-team-website-to-user": "මෙම වෙබ් අඩවිය ඔබේ ගිණුමට මාරු කරන්නද?",
+ "transfer-user-website-to-team": "මෙම වෙබ් අඩවිය මාරු කිරීමට කණ්ඩායම තෝරන්න.",
+ "transfer-website": "වෙබ් අඩවියේ හිමිකාරිත්වය ඔබේ ගිණුමට හෝ වෙනත් කණ්ඩායමකට මාරු කරන්න.",
+ "triggered-event": "අවුලුවන ලද සිදුවීම",
+ "unauthorized": "අනවසරයි",
+ "user-deleted": "පරිශීලකයා මකා දමන ලදි.",
+ "viewed-page": "නැරඹූ පිටුව",
+ "visitor-log": "{country} සිට {os} {device} හි {browser} භාවිතා කරන නරඹන්නා"
+ }
}
diff --git a/public/intl/messages/sk-SK.json b/public/intl/messages/sk-SK.json
index 0908ec4f6..070470190 100644
--- a/public/intl/messages/sk-SK.json
+++ b/public/intl/messages/sk-SK.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Akcie"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Pridať web"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrátor"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Všetko"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Späť"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Okamžité opustenie"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Prehliadač"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Zrušiť"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Zmeniť heslo"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potvrdiť heslo"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Zem"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Aktuálne heslo"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Vlastný rozsah"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Prehlad"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Obdobie"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Predvolené obdobie"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Zmazať"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Zmazať web"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Stolný počítač"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Zariadenie"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Odísť"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Doména"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Upraviť"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Povoliť zdielanie URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Udalosti"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinácie"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Nezpracované"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Prenosný počítač"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Posledných "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dní"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Posledných "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hodín"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Prihlásiť"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Odhlásiť"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobilný telefon"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Viac"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Meno"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nové heslo"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Zobrazenie stánok"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Stránky"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Heslo"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Powered by "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Aktuálne"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Odkazy"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Obnoviť"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Povinné"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Reset"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Uložiť"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Nastavenia"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Zdielanie URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Jeden deň"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Tento mesiac"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Tento týždeň"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Tento rok"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Časová zóna"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Dnes"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Sledovací kód"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Jedinečné návštevy"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Neznámý"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Užívateľské meno"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Zobraziť detaily"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Zobrazení"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Priemerný čas návštevy"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Návštevy"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Weby"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " aktuálne "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "návštevník"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "návštěvníci"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Naozaj zmazať "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Všetky príbuzné data budu tiež zmazané."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Niečo sa pokazilo."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ísť do nastavení"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nesprávné meno/heslo."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Neplatná doména"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Žiadne data."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Hesla se nezhodujú"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nemáte nastavený žiadny web."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Stránka sa nenašla."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Úspešne uložené."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Toto je zdielané URL pre "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Sledovací kód"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Návštevník z "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " s prehliadačom "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Prístupový kód",
+ "account": "Účet",
+ "action": "Akcia",
+ "actions": "Akcie",
+ "activity": "Denník aktivít",
+ "add": "Pridať",
+ "add-board": "Pridať tabuľu",
+ "add-description": "Pridať popis",
+ "add-link": "Pridať odkaz",
+ "add-member": "Pridať člena",
+ "add-pixel": "Pridať pixel",
+ "add-step": "Pridať krok",
+ "add-website": "Pridať web",
+ "admin": "Administrátor",
+ "affiliate": "Partner",
+ "after": "Po",
+ "all": "Všetko",
+ "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",
+ "average": "Priemer",
+ "back": "Späť",
+ "before": "Pred",
+ "behavior": "Správanie",
+ "block-selector": "Výber bloku",
+ "boards": "Tabule",
+ "bounce-rate": "Okamžité opustenie",
+ "breakdown": "Rozpis",
+ "browser": "Prehliadač",
+ "browsers": "Prehliadač",
+ "campaign": "Kampaň",
+ "campaigns": "Kampane",
+ "cancel": "Zrušiť",
+ "change-password": "Zmeniť heslo",
+ "channel": "Kanál",
+ "channels": "Kanály",
+ "chart": "Graf",
+ "cities": "Mestá",
+ "city": "Mesto",
+ "clear-all": "Vymazať všetko",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorty",
+ "compare": "Porovnať",
+ "compare-dates": "Porovnať dátumy",
+ "confirm": "Potvrdiť",
+ "confirm-password": "Potvrdiť heslo",
+ "contains": "Obsahuje",
+ "content": "Obsah",
+ "continue": "Pokračovať",
+ "conversion": "Konverzia",
+ "conversion-rate": "Miera konverzie",
+ "conversion-step": "Krok konverzie",
+ "count": "Počet",
+ "countries": "Zem",
+ "country": "Krajina",
+ "create": "Vytvoriť",
+ "create-report": "Vytvoriť správu",
+ "create-team": "Vytvoriť tím",
+ "create-user": "Vytvoriť používateľa",
+ "created": "Vytvorené",
+ "created-by": "Vytvoril",
+ "criteria": "Kritériá",
+ "currency": "Mena",
+ "current": "Aktuálny",
+ "current-password": "Aktuálne heslo",
+ "custom-range": "Vlastný rozsah",
+ "dashboard": "Prehlad",
+ "data": "Dáta",
+ "date": "Dátum",
+ "date-range": "Obdobie",
+ "day": "Deň",
+ "default-date-range": "Predvolené obdobie",
+ "delete": "Zmazať",
+ "delete-report": "Zmazať správu",
+ "delete-team": "Zmazať tím",
+ "delete-user": "Zmazať používateľa",
+ "delete-website": "Zmazať web",
+ "description": "Popis",
+ "desktop": "Stolný počítač",
+ "destination-url": "Cieľová URL",
+ "details": "Podrobnosti",
+ "device": "Zariadenie",
+ "devices": "Zariadenie",
+ "direct": "Priamy",
+ "dismiss": "Odísť",
+ "distinct-id": "Jedinečné ID",
+ "documentation": "Dokumentácia",
+ "does-not-contain": "Neobsahuje",
+ "does-not-include": "Nezahŕňa",
+ "doest-not-exist": "Neexistuje",
+ "domain": "Doména",
+ "download": "Stiahnuť",
+ "dropoff": "Odchod",
+ "duration": "Trvanie",
+ "edit": "Upraviť",
+ "edit-member": "Upraviť člena",
+ "email": "E-mail",
+ "enable-share-url": "Povoliť zdielanie URL",
+ "end-step": "Konečný krok",
+ "entry": "Vstupná URL",
+ "environment": "Prostredie",
+ "event": "Udalosť",
+ "event-data": "Dáta udalosti",
+ "event-name": "Názov udalosti",
+ "events": "Udalosti",
+ "exclude-bounce": "Vylúčiť odmietnutia",
+ "exists": "Existuje",
+ "exit": "Výstupná URL",
+ "false": "Nepravda",
+ "fcp": "FCP",
+ "field": "Pole",
+ "fields": "Polia",
+ "filter": "Filter",
+ "filter-combined": "Kombinácie",
+ "filter-raw": "Nezpracované",
+ "filters": "Filtre",
+ "first-click": "Prvé kliknutie",
+ "first-seen": "Prvýkrát videné",
+ "funnel": "Lievik",
+ "funnel-description": "Pochopte mieru konverzie a odchodu používateľov.",
+ "funnels": "Lieviky",
+ "goal": "Cieľ",
+ "goals": "Ciele",
+ "goals-description": "Sledujte svoje ciele pre zobrazenia stránok a udalosti.",
+ "good": "Dobré",
+ "greater-than": "Väčšie ako",
+ "greater-than-equals": "Väčšie alebo rovné",
+ "grouped": "Zoskupené",
+ "growth": "Rast",
+ "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.",
+ "invalid-url": "Neplatná URL",
+ "is": "Je",
+ "is-false": "Je nepravda",
+ "is-not": "Nie je",
+ "is-not-set": "Nie je nastavené",
+ "is-set": "Nastavené",
+ "is-true": "Je pravda",
+ "join": "Pripojiť sa",
+ "join-team": "Pripojiť sa k tímu",
+ "journey": "Cesta",
+ "journey-description": "Pochopte, ako používatelia prechádzajú vaším webom.",
+ "journeys": "Cesty",
+ "language": "Jazyk",
+ "languages": "Jazyky",
+ "laptop": "Prenosný počítač",
+ "last-click": "Posledné kliknutie",
+ "last-days": "Posledných {x} dní",
+ "last-hours": "Posledných {x} hodín",
+ "last-months": "Posledných {x} mesiacov",
+ "last-seen": "Naposledy videné",
+ "lcp": "LCP",
+ "leave": "Odísť",
+ "leave-team": "Opustiť tím",
+ "less-than": "Menej ako",
+ "less-than-equals": "Menej alebo rovné",
+ "link": "Odkaz",
+ "links": "Odkazy",
+ "location": "Umiestnenie",
+ "login": "Prihlásiť",
+ "logout": "Odhlásiť",
+ "manage": "Spravovať",
+ "manager": "Manažér",
+ "mask-level": "Úroveň masky",
+ "match": "Zhoda",
+ "match-all": "Všetky",
+ "match-any": "Akýkoľvek",
+ "max": "Maximum",
+ "max-duration": "Maximálne trvanie",
+ "maximize": "Rozbaliť",
+ "medium": "Stredný",
+ "member": "Člen",
+ "members": "Členovia",
+ "min": "Minimum",
+ "minute": "Minúta",
+ "mobile": "Mobilný telefon",
+ "model": "Model",
+ "month": "Mesiac",
+ "more": "Viac",
+ "my-account": "Môj účet",
+ "my-websites": "Moje weby",
+ "name": "Meno",
+ "needs-improvement": "Vyžaduje zlepšenie",
+ "new-password": "Nové heslo",
+ "none": "Žiadny",
+ "number-of-records": "{x} {x, plural, one {záznam} few {záznamy} other {záznamov}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organické vyhľadávanie",
+ "organic-shopping": "Organické nakupovanie",
+ "organic-social": "Organické sociálne siete",
+ "organic-video": "Organické video",
+ "os": "OS",
+ "other": "Iné",
+ "overview": "Prehľad",
+ "owner": "Vlastník",
+ "page": "Stránka",
+ "page-of": "Strana {current} z {total}",
+ "page-views": "Zobrazenie stánok",
+ "pages": "Stránky",
+ "pageTitle": "Názov stránky",
+ "paid-ads": "Platené reklamy",
+ "paid-search": "Platené vyhľadávanie",
+ "paid-shopping": "Platené nakupovanie",
+ "paid-social": "Platené sociálne siete",
+ "paid-video": "Platené video",
+ "password": "Heslo",
+ "path": "Cesta",
+ "paths": "Cesty",
+ "performance": "Výkon",
+ "pixel": "Pixel",
+ "pixels": "Pixely",
+ "play": "Prehrať",
+ "poor": "Zlé",
+ "powered-by": "Poskytuje {name}",
+ "preferences": "Predvoľby",
+ "previous": "Predchádzajúci",
+ "previous-period": "Predchádzajúce obdobie",
+ "previous-year": "Predchádzajúci rok",
+ "profile": "Profil",
+ "profiles": "Profily",
+ "properties": "Vlastnosti",
+ "property": "Vlastnosť",
+ "queries": "Dotazy",
+ "query": "Dotaz",
+ "query-parameters": "Parametre dotazu",
+ "realtime": "Aktuálne",
+ "recorded": "Zaznamenané",
+ "referral": "Odporúčanie",
+ "referrer": "Odkazovateľ",
+ "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",
+ "replay": "Prehrávanie",
+ "replay-enabled": "Prehrávanie povolené",
+ "replay-id": "Replay ID",
+ "replays": "Prehrávanie",
+ "reports": "Správy",
+ "required": "Povinné",
+ "reset": "Resetovať",
+ "reset-website": "Reset statistics",
+ "retention": "Retencia",
+ "retention-days": "Dni uchovávania",
+ "retention-description": "Merajte angažovanosť vašej stránky sledovaním, ako často sa používatelia vracajú.",
+ "revenue": "Príjem",
+ "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-segment": "Uložiť segment",
+ "screen": "Obrazovka",
+ "screens": "Obrazovky",
+ "search": "Hľadať",
+ "segment": "Segment",
+ "segments": "Segmenty",
+ "select": "Vybrať",
+ "select-component": "Vyberte komponent",
+ "select-date": "Vybrať dátum",
+ "select-filter": "Vybrať filter",
+ "select-role": "Vybrať rolu",
+ "select-website": "Vybrať web",
+ "session": "Sedenie",
+ "session-data": "Dáta sedenia",
+ "sessions": "Relácie",
+ "settings": "Nastavenia",
+ "share": "Zdieľať",
+ "share-url": "Zdielanie URL",
+ "single-day": "Jeden deň",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Zdroj",
+ "sources": "Zdroje",
+ "start-step": "Počiatočný krok",
+ "steps": "Kroky",
+ "sum": "Súčet",
+ "support": "Podpora",
+ "switch-account": "Prepnúť účet",
+ "table": "Tabuľka",
+ "tablet": "Tablet",
+ "tag": "Značka",
+ "tags": "Značky",
+ "team": "Tím",
+ "team-id": "ID tímu",
+ "team-manager": "Manažér tímu",
+ "team-member": "Člen tímu",
+ "team-name": "Názov tímu",
+ "team-owner": "Vlastník tímu",
+ "team-settings": "Nastavenia tímu",
+ "team-view-only": "Iba zobrazenie pre tím",
+ "team-websites": "Weby tímu",
+ "teams": "Tímy",
+ "term": "Hľadaný výraz",
+ "terms": "Podmienky",
+ "theme": "Téma",
+ "this-month": "Tento mesiac",
+ "this-week": "Tento týždeň",
+ "this-year": "Tento rok",
+ "timezone": "Časová zóna",
+ "title": "Názov",
+ "today": "Dnes",
+ "toggle-charts": "Prepnúť grafy",
+ "total": "Celkom",
+ "total-records": "Celkom záznamov",
+ "tracking-code": "Sledovací kód",
+ "traffic": "Návštevnosť",
+ "transactions": "Transakcie",
+ "transfer": "Preniesť",
+ "transfer-website": "Preniesť web",
+ "true": "Pravda",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Unikátny",
+ "unique-events": "Unikátne udalosti",
+ "unique-visitors": "Jedinečné návštevy",
+ "uniqueCustomers": "Unikátni zákazníci",
+ "unknown": "Neznámý",
+ "untitled": "Bez názvu",
+ "update": "Aktualizovať",
+ "url": "URL",
+ "user": "Používateľ",
+ "username": "Užívateľské meno",
+ "users": "Používatelia",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampaň",
+ "utm-content": "UTM obsah",
+ "utm-description": "Sledujte svoje kampane pomocou UTM parametrov.",
+ "utm-medium": "UTM médium",
+ "utm-source": "UTM zdroj",
+ "utm-term": "UTM výraz",
+ "value": "Hodnota",
+ "version": "Verzia",
+ "view": "Zobraziť",
+ "view-details": "Zobraziť detaily",
+ "view-only": "Iba zobrazenie",
+ "views": "Zobrazení",
+ "views-per-visit": "Zobrazenia na návštevu",
+ "visit-duration": "Priemerný čas návštevy",
+ "visitors": "Návštevy",
+ "visits": "Návštevy",
+ "website": "Web",
+ "website-id": "ID webu",
+ "websites": "Weby",
+ "window": "Okno",
+ "yesterday": "Včera"
+ },
+ "message": {
+ "action-confirmation": "Zadajte {confirmation} do poľa nižšie na potvrdenie.",
+ "active-users": "{x} aktuálne {x, plural, one {návštevník} other {návštěvníci}}",
+ "bad-request": "Neplatná požiadavka",
+ "collected-data": "Zozbierané dáta",
+ "confirm-delete": "Naozaj zmazať {target}?",
+ "confirm-leave": "Naozaj chcete opustiť {target} ?",
+ "confirm-remove": "Naozaj chcete odstrániť {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Zakázané",
+ "go-to-settings": "Ísť do nastavení",
+ "incorrect-username-password": "Nesprávné meno/heslo.",
+ "invalid-domain": "Neplatná doména",
+ "min-password-length": "Minimálna dĺžka {n} znakov",
+ "new-version-available": "K dispozícii je nová verzia Umami {version}!",
+ "no-data-available": "Žiadne data.",
+ "no-event-data": "Nie sú dostupné žiadne údaje o udalostiach.",
+ "no-match-password": "Hesla se nezhodujú",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "Tento tím nemá žiadne weby.",
+ "no-teams": "Nevytvorili ste žiadne tímy.",
+ "no-users": "Nie sú žiadni používatelia.",
+ "no-websites-configured": "Nemáte nastavený žiadny web.",
+ "not-found": "Nenájdené",
+ "nothing-selected": "Nič nie je vybrané.",
+ "page-not-found": "Stránka sa nenašla.",
+ "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-component-preview": "Vyberte komponent na náhľad",
+ "select-website-first": "Najprv vyberte webovú stránku",
+ "sever-error": "Chyba servera",
+ "share-url": "Toto je zdielané URL pre {target}.",
+ "team-already-member": "Už ste členom tohto tímu.",
+ "team-not-found": "Tím nenájdený.",
+ "team-websites-info": "Weby si môže zobraziť ktokoľvek z tímu.",
+ "tracking-code": "Sledovací kód",
+ "transfer-team-website-to-user": "Preniesť tento web na váš účet?",
+ "transfer-user-website-to-team": "Vyberte tím, na ktorý chcete tento web preniesť.",
+ "transfer-website": "Preneste vlastníctvo webu na svoj účet alebo iný tím.",
+ "triggered-event": "Spustená udalosť",
+ "unauthorized": "Neautorizované",
+ "user-deleted": "Používateľ vymazaný.",
+ "viewed-page": "Zobrazená stránka",
+ "visitor-log": "Návštevník z {country} s prehliadačom {browser} na {os} {device} "
+ }
}
diff --git a/public/intl/messages/sl-SI.json b/public/intl/messages/sl-SI.json
index ae11c067d..58a218858 100644
--- a/public/intl/messages/sl-SI.json
+++ b/public/intl/messages/sl-SI.json
@@ -1,1868 +1,426 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Koda za dostop"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Dejanja"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Dnevnik dejavnosti"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Dodaj"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Dodaj opis"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Dodaj spletno mesto"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Po"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Vsi"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Ves čas"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analitika"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Povprečno"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Nazaj"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Pred"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Odbojna stopnja"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Razčlenitev"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Brskalnik"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Brskalniki"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Prekliči"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Zamenjaj geslo"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Mesta"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Mesto"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Počisti vse"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Potrdi"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Potrdi geslo"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Vsebuje"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Nadaljuj"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Države"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Država"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Ustvari poročilo"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Ustvari ekipo"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Ustvari uporabnika"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Ustvarjeno"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Trenutno geslo"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Obdobje po meri"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Nadzorna plošča"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Podatki"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Časovno obdobje"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dan"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Privzeto časovno obdobje"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Izbriši"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Izbriši ekipo"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Izbriši uporabnika"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Izbriši spletno mesto"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Opis"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Namizni računalnik"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Podrobnosti"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Naprava"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Naprave"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Prezri"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Ne vsebuje"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domena"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Zapustitev"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Uredi"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Uredi nadzorno ploščo"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Uredi povezavo za deljenje"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Dogodek"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Podatki dogodka"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Dogodki"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Napačno"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Polje"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Polja"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Skupaj"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Neobdelano"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtri"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Prodajni lijak"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Večje od"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Večje ali enako kot"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Vpogled"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Je"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Ni"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Ni nastavljeno"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Je nastavljeno"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Pridruži se"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Pridruži se ekipi"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Jezik"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Jeziki"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Prenosni računalnik"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dni"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Zadnjih "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ur"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Zapusti"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Zapusti ekipo"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Manjše kot"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Manjše ali enako kot"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Prijava"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Odjava"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Največ"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Člani"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Najmanj"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobilne naprave"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Več"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Moja spletna mesta"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Ime"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Novo geslo"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Brez"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Pregled"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Lastnik"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Stran "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " od "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Obiski strani"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Naslov strani"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Strani"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Geslo"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Poganja "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Poizvedbe"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Poizvedba"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Parametri poizvedbe"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "V živo"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Vir"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Viri"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Osveži"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Ponovno generiraj"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Regija"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regije"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Odstrani"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Poročila"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Zahtevano"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Ponastavi"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Ponastavi statistiko"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Ohranjanje uporabnikov"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Vloga"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Izvedi poizvedbo"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Shrani"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Zasloni"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Izberi datum"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Izberi spletno mesto"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Seje"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Nastavitve"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Deli povezavo"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "En dan"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Seštevek"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablični računalnik"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Ekipa"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "ID ekipe"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Član ekipe"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Ime ekipe"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Lastnik ekipe"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Spletna mesta ekipe"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Ekipe"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Ta mesec"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Ta teden"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "To leto"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Časovni pas"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Naslov"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Danes"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Preklopi grafe"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Skupaj"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Skupni zapisi"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Koda za sledenje"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Pravilno"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Vrsta"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unikatni"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unikatni obiskovalci"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Neznano"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Brez naslova"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "Povezava"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "Povezave"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Uporabnik"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Uporabniško ime"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Uporabniki"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Vrednost"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Poglej"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Poglej podrobnosti"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Samo ogledovanje"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Obiski"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Povprečni čas obiska"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Obiskovalci"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Spletno mesto"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "ID spletnega mesta"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Spletnih mest"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Okno"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Včeraj"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " trenutni "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "obiskovalec"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "obiskovalcev"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Ste prepričani, da želite izbrisati "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Ste prepričani, da želite zapustiti "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Ste prepričani, da želite ponastaviti statistiko "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Izbrisani bodo tudi vsi pripadajoči podatki."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Nekaj je šlo narobe."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Pojdi v nastavitve"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Nepravilno uporabniško ime/geslo."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Neveljavna domena"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Najmanjša dolžina je "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " znakov"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Na voljo je nova verzija programa Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Podatki niso na voljo."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Podatki o dogodku niso na voljo."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Gesli se ne ujemata"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Rezultatov ni bilo mogoče najti."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Ta ekipa nima spletnih mest."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Niste še ustvarili nobene ekipe."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Ni uporabnikov."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Nimate nastavljenih nobenih spletnih mest."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Stran ni bila najdena."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Za ponastavitev izbrisa tega spletnega mesta vnesite "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " v spodnje polje."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Vse statistike za to spletno mesto bodo izbrisane, koda za sledenje pa bo ostala nespremenjena."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Uspešno shranjeno."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "To je javno dostopna povezava za "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Ste že član ekipe."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Ekipa ni bila najdena."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Spletne strani si lahko ogleda vsak član ekipe."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Koda za sledenje"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Uporabnik je izbrisan."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Obiskovalec iz "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " uporablja "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " na "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Koda za dostop",
+ "account": "Račun",
+ "action": "Dejanje",
+ "actions": "Dejanja",
+ "activity": "Dnevnik dejavnosti",
+ "add": "Dodaj",
+ "add-board": "Dodaj tablo",
+ "add-description": "Dodaj opis",
+ "add-link": "Dodaj povezavo",
+ "add-member": "Dodaj člana",
+ "add-pixel": "Dodaj piksel",
+ "add-step": "Dodaj korak",
+ "add-website": "Dodaj spletno mesto",
+ "admin": "Administrator",
+ "affiliate": "Partner",
+ "after": "Po",
+ "all": "Vsi",
+ "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",
+ "average": "Povprečno",
+ "back": "Nazaj",
+ "before": "Pred",
+ "behavior": "Obnašanje",
+ "block-selector": "Izbirnik blokov",
+ "boards": "Table",
+ "bounce-rate": "Odbojna stopnja",
+ "breakdown": "Razčlenitev",
+ "browser": "Brskalnik",
+ "browsers": "Brskalniki",
+ "campaign": "Kampanja",
+ "campaigns": "Kampanje",
+ "cancel": "Prekliči",
+ "change-password": "Zamenjaj geslo",
+ "channel": "Kanal",
+ "channels": "Kanali",
+ "chart": "Grafikon",
+ "cities": "Mesta",
+ "city": "Mesto",
+ "clear-all": "Počisti vse",
+ "cls": "CLS",
+ "cohort": "Kohorta",
+ "cohorts": "Kohorte",
+ "compare": "Primerjaj",
+ "compare-dates": "Primerjaj datume",
+ "confirm": "Potrdi",
+ "confirm-password": "Potrdi geslo",
+ "contains": "Vsebuje",
+ "content": "Vsebina",
+ "continue": "Nadaljuj",
+ "conversion": "Konverzija",
+ "conversion-rate": "Stopnja konverzije",
+ "conversion-step": "Korak konverzije",
+ "count": "Število",
+ "countries": "Države",
+ "country": "Država",
+ "create": "Ustvari",
+ "create-report": "Ustvari poročilo",
+ "create-team": "Ustvari ekipo",
+ "create-user": "Ustvari uporabnika",
+ "created": "Ustvarjeno",
+ "created-by": "Ustvaril",
+ "criteria": "Merila",
+ "currency": "Valuta",
+ "current": "Trenutno",
+ "current-password": "Trenutno geslo",
+ "custom-range": "Obdobje po meri",
+ "dashboard": "Nadzorna plošča",
+ "data": "Podatki",
+ "date": "Datum",
+ "date-range": "Časovno obdobje",
+ "day": "Dan",
+ "default-date-range": "Privzeto časovno obdobje",
+ "delete": "Izbriši",
+ "delete-report": "Izbriši poročilo",
+ "delete-team": "Izbriši ekipo",
+ "delete-user": "Izbriši uporabnika",
+ "delete-website": "Izbriši spletno mesto",
+ "description": "Opis",
+ "desktop": "Namizni računalnik",
+ "destination-url": "Ciljni URL",
+ "details": "Podrobnosti",
+ "device": "Naprava",
+ "devices": "Naprave",
+ "direct": "Neposredno",
+ "dismiss": "Prezri",
+ "distinct-id": "Unikatni ID",
+ "documentation": "Dokumentacija",
+ "does-not-contain": "Ne vsebuje",
+ "does-not-include": "Ne vključuje",
+ "doest-not-exist": "Ne obstaja",
+ "domain": "Domena",
+ "download": "Prenesi",
+ "dropoff": "Zapustitev",
+ "duration": "Trajanje",
+ "edit": "Uredi",
+ "edit-member": "Uredi člana",
+ "email": "E-pošta",
+ "enable-share-url": "Omogoči povezavo za deljenje",
+ "end-step": "Končni korak",
+ "entry": "Vstopni URL",
+ "environment": "Okolje",
+ "event": "Dogodek",
+ "event-data": "Podatki dogodka",
+ "event-name": "Ime dogodka",
+ "events": "Dogodki",
+ "exclude-bounce": "Izključi odbite",
+ "exists": "Obstaja",
+ "exit": "Izhodni URL",
+ "false": "Napačno",
+ "fcp": "FCP",
+ "field": "Polje",
+ "fields": "Polja",
+ "filter": "Filter",
+ "filter-combined": "Skupaj",
+ "filter-raw": "Neobdelano",
+ "filters": "Filtri",
+ "first-click": "Prvi klik",
+ "first-seen": "Prvič viden",
+ "funnel": "Prodajni lijak",
+ "funnel-description": "Razumite stopnjo konverzije in osipa uporabnikov.",
+ "funnels": "Prodajni lijaki",
+ "goal": "Cilj",
+ "goals": "Cilji",
+ "goals-description": "Spremljajte svoje cilje za oglede strani in dogodke.",
+ "good": "Dobro",
+ "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.",
+ "invalid-url": "Neveljaven URL",
+ "is": "Je",
+ "is-false": "Je napačno",
+ "is-not": "Ni",
+ "is-not-set": "Ni nastavljeno",
+ "is-set": "Je nastavljeno",
+ "is-true": "Je res",
+ "join": "Pridruži se",
+ "join-team": "Pridruži se ekipi",
+ "journey": "Uporabniška pot",
+ "journey-description": "Razumite, kako uporabniki krmarijo po vašem spletnem mestu.",
+ "journeys": "Uporabniške poti",
+ "language": "Jezik",
+ "languages": "Jeziki",
+ "laptop": "Prenosni računalnik",
+ "last-click": "Zadnji klik",
+ "last-days": "Zadnjih {x} dni",
+ "last-hours": "Zadnjih {x} ur",
+ "last-months": "Zadnjih {x} mesecev",
+ "last-seen": "Nazadnje viden",
+ "lcp": "LCP",
+ "leave": "Zapusti",
+ "leave-team": "Zapusti ekipo",
+ "less-than": "Manjše kot",
+ "less-than-equals": "Manjše ali enako kot",
+ "link": "Povezava",
+ "links": "Povezave",
+ "location": "Lokacija",
+ "login": "Prijava",
+ "logout": "Odjava",
+ "manage": "Upravljaj",
+ "manager": "Upravitelj",
+ "mask-level": "Raven maske",
+ "match": "Ujemanje",
+ "match-all": "Vse",
+ "match-any": "Katero koli",
+ "max": "Največ",
+ "max-duration": "Največje trajanje",
+ "maximize": "Povečaj",
+ "medium": "Medij",
+ "member": "Član",
+ "members": "Člani",
+ "min": "Najmanj",
+ "minute": "Minuta",
+ "mobile": "Mobilne naprave",
+ "model": "Model",
+ "month": "Mesec",
+ "more": "Več",
+ "my-account": "Moj račun",
+ "my-websites": "Moja spletna mesta",
+ "name": "Ime",
+ "needs-improvement": "Potrebuje izboljšave",
+ "new-password": "Novo geslo",
+ "none": "Noben",
+ "number-of-records": "{x} {x, plural, one {zapis} two {zapisa} few {zapisi} other {zapisov}}",
+ "ok": "V redu",
+ "online": "Na spletu",
+ "organic-search": "Organsko iskanje",
+ "organic-shopping": "Organski nakupi",
+ "organic-social": "Organska družbena omrežja",
+ "organic-video": "Organski video",
+ "os": "OS",
+ "other": "Drugo",
+ "overview": "Pregled",
+ "owner": "Lastnik",
+ "page": "Stran",
+ "page-of": "Stran {current} od {total}",
+ "page-views": "Obiski strani",
+ "pages": "Strani",
+ "pageTitle": "Naslov strani",
+ "paid-ads": "Plačani oglasi",
+ "paid-search": "Plačano iskanje",
+ "paid-shopping": "Plačani nakupi",
+ "paid-social": "Plačana družbena omrežja",
+ "paid-video": "Plačani video",
+ "password": "Geslo",
+ "path": "Pot",
+ "paths": "Poti",
+ "performance": "Zmogljivost",
+ "pixel": "Piksel",
+ "pixels": "Piksli",
+ "play": "Predvajaj",
+ "poor": "Slabo",
+ "powered-by": "Poganja {name}",
+ "preferences": "Nastavitve",
+ "previous": "Prejšnji",
+ "previous-period": "Prejšnje obdobje",
+ "previous-year": "Prejšnje leto",
+ "profile": "Profil",
+ "profiles": "Profili",
+ "properties": "Lastnosti",
+ "property": "Lastnost",
+ "queries": "Poizvedbe",
+ "query": "Poizvedba",
+ "query-parameters": "Parametri poizvedbe",
+ "realtime": "V živo",
+ "recorded": "Zabeleženo ob",
+ "referral": "Napoten",
+ "referrer": "Vir",
+ "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",
+ "replay": "Predvajanje",
+ "replay-enabled": "Predvajanje omogočeno",
+ "replay-id": "Replay ID",
+ "replays": "Predvajanja",
+ "reports": "Poročila",
+ "required": "Zahtevano",
+ "reset": "Ponastavi",
+ "reset-website": "Ponastavi statistiko",
+ "retention": "Ohranjanje uporabnikov",
+ "retention-days": "Dni hrambe",
+ "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-segment": "Shrani segment",
+ "screen": "Zaslon",
+ "screens": "Zasloni",
+ "search": "Išči",
+ "segment": "Segment",
+ "segments": "Segmenti",
+ "select": "Izberi",
+ "select-component": "Izberite komponento",
+ "select-date": "Izberi datum",
+ "select-filter": "Izberi filter",
+ "select-role": "Izberi vlogo",
+ "select-website": "Izberi spletno mesto",
+ "session": "Seja",
+ "session-data": "Podatki seje",
+ "sessions": "Seje",
+ "settings": "Nastavitve",
+ "share": "Deli",
+ "share-url": "Deli povezavo",
+ "single-day": "En dan",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Vir",
+ "sources": "Viri",
+ "start-step": "Začetni korak",
+ "steps": "Koraki",
+ "sum": "Seštevek",
+ "support": "Podpora",
+ "switch-account": "Zamenjaj račun",
+ "table": "Tabela",
+ "tablet": "Tablični računalnik",
+ "tag": "Oznaka",
+ "tags": "Oznake",
+ "team": "Ekipa",
+ "team-id": "ID ekipe",
+ "team-manager": "Upravitelj ekipe",
+ "team-member": "Član ekipe",
+ "team-name": "Ime ekipe",
+ "team-owner": "Lastnik ekipe",
+ "team-settings": "Nastavitve ekipe",
+ "team-view-only": "Ekipa samo za ogled",
+ "team-websites": "Spletna mesta ekipe",
+ "teams": "Ekipe",
+ "term": "Iskalni izraz",
+ "terms": "Pogoji",
+ "theme": "Tema",
+ "this-month": "Ta mesec",
+ "this-week": "Ta teden",
+ "this-year": "To leto",
+ "timezone": "Časovni pas",
+ "title": "Naslov",
+ "today": "Danes",
+ "toggle-charts": "Preklopi grafe",
+ "total": "Skupaj",
+ "total-records": "Skupni zapisi",
+ "tracking-code": "Koda za sledenje",
+ "traffic": "Promet",
+ "transactions": "Transakcije",
+ "transfer": "Prenesi",
+ "transfer-website": "Prenesi spletno stran",
+ "true": "Pravilno",
+ "ttfb": "TTFB",
+ "type": "Vrsta",
+ "unique": "Unikatni",
+ "unique-events": "Edinstveni dogodki",
+ "unique-visitors": "Unikatni obiskovalci",
+ "uniqueCustomers": "Edinstvene stranke",
+ "unknown": "Neznano",
+ "untitled": "Brez naslova",
+ "update": "Posodobi",
+ "url": "URL",
+ "user": "Uporabnik",
+ "username": "Uporabniško ime",
+ "users": "Uporabniki",
+ "utm": "UTM",
+ "utm-campaign": "UTM kampanja",
+ "utm-content": "UTM vsebina",
+ "utm-description": "Sledite svojim kampanjam s pomočjo UTM parametrov.",
+ "utm-medium": "UTM medij",
+ "utm-source": "UTM vir",
+ "utm-term": "UTM izraz",
+ "value": "Vrednost",
+ "version": "Različica",
+ "view": "Poglej",
+ "view-details": "Poglej podrobnosti",
+ "view-only": "Samo ogledovanje",
+ "views": "Obiski",
+ "views-per-visit": "Ogledov na obisk",
+ "visit-duration": "Povprečni čas obiska",
+ "visitors": "Obiskovalci",
+ "visits": "Obiski",
+ "website": "Spletno mesto",
+ "website-id": "ID spletnega mesta",
+ "websites": "Spletna mesta",
+ "window": "Okno",
+ "yesterday": "Včeraj"
+ },
+ "message": {
+ "action-confirmation": "Za potrditev v spodnje polje vnesite {confirmation}.",
+ "active-users": "{x} trenutni {x, plural, one {obiskovalec} other {obiskovalcev}}",
+ "bad-request": "Napačna zahteva",
+ "collected-data": "Zbrani podatki",
+ "confirm-delete": "Ste prepričani, da želite izbrisati {target}?",
+ "confirm-leave": "Ste prepričani, da želite zapustiti {target} ?",
+ "confirm-remove": "Ali ste prepričani, da želite odstraniti {target} ?",
+ "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.",
+ "event-log": "{event} na {url} ",
+ "forbidden": "Prepovedano",
+ "go-to-settings": "Pojdi v nastavitve",
+ "incorrect-username-password": "Nepravilno uporabniško ime/geslo.",
+ "invalid-domain": "Neveljavna domena",
+ "min-password-length": "Najmanjša dolžina je {n} znakov",
+ "new-version-available": "Na voljo je nova verzija programa Umami {version}!",
+ "no-data-available": "Podatki niso na voljo.",
+ "no-event-data": "Podatki o dogodku niso na voljo.",
+ "no-match-password": "Gesli se ne ujemata",
+ "no-results-found": "Rezultatov ni bilo mogoče najti.",
+ "no-team-websites": "Ta ekipa nima spletnih mest.",
+ "no-teams": "Niste še ustvarili nobene ekipe.",
+ "no-users": "Ni uporabnikov.",
+ "no-websites-configured": "Nimate nastavljenih nobenih spletnih mest.",
+ "not-found": "Ni najdeno",
+ "nothing-selected": "Nič ni izbrano.",
+ "page-not-found": "Stran ni bila najdena.",
+ "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-component-preview": "Izberite komponento za predogled",
+ "select-website-first": "Najprej izberite spletno mesto",
+ "sever-error": "Napaka strežnika",
+ "share-url": "To je javno dostopna povezava za {target}.",
+ "team-already-member": "Ste že član ekipe.",
+ "team-not-found": "Ekipa ni bila najdena.",
+ "team-websites-info": "Spletne strani si lahko ogleda vsak član ekipe.",
+ "tracking-code": "Koda za sledenje",
+ "transfer-team-website-to-user": "Želite prenesti to spletno mesto v svoj račun?",
+ "transfer-user-website-to-team": "Izberite ekipo, na katero želite prenesti to spletno mesto.",
+ "transfer-website": "Prenesite lastništvo spletnega mesta na svoj račun ali drugo ekipo.",
+ "triggered-event": "Sprožen dogodek",
+ "unauthorized": "Nepooblaščen dostop",
+ "user-deleted": "Uporabnik je izbrisan.",
+ "viewed-page": "Ogledana stran",
+ "visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device} ",
+ "visitors-dropped-off": "Osip obiskovalcev"
+ }
}
diff --git a/public/intl/messages/sv-SE.json b/public/intl/messages/sv-SE.json
index 830a7bd32..e54be158c 100644
--- a/public/intl/messages/sv-SE.json
+++ b/public/intl/messages/sv-SE.json
@@ -1,1872 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Åtkomstkod"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Händelser"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Aktivitetslogg"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Lägg till"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Lägg till beskrivning"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Lägg till webbplats"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administratör"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Efter"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Alla"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Sedan början"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Webbplats Analys"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Genomsnitt"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Tillbaka"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Före"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Avvisningsfrekvens"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Analys"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Webbläsare"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Webbläsare"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Avbryt"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Byt lösenord"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Städer"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Stad"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Rensa alla"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Bekräfta"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Bekräfta lösenord"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Innehåller"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Fortsätt"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Länder"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Land"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Skapa"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Skapa rapport"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Skapa team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Skapa användare"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Skapad"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Nuvarande lösenord"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Anpassat urval"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Översikt"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Datum"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Tidsperiod"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Dag"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Standard datum-urval"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Radera"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Radera team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Radera användare"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Radera webbplats"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Beskrivning"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Stationär"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detaljer"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Enhet"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Enheter"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Avbryt"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Innehåller inte"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Domän"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Bortfall"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Redigera"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Redigera översikt"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Aktivera delningslänk"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Händelse"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Händelsedata"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Händelser"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Falskt"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Fält"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fältar"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kombinerade"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Rådata"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Förstå omvandlingen och bortfallsfrekvensen för användare."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Större än"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Större än eller lika med"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insikter"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dyk djupare in i din data genom att använda olika segment och filter."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Är"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Är inte"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Är inte inställd"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Är inställd"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Gå med"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Gå med i team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Språk"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Språk"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Bärbar"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Senaste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " dagarna"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Senaste "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " timmarna"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Lämna"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Lämna team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Mindre än"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Mindre än eller lika med"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Logga in"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Logga ut"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Medlemmar"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobil"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Mer"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Mina webbplatser"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Namn"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Nytt lösenord"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Inga"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "Operativsystem"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Översikt"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Ägare"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Sida "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " av "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Sidvisningar"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Sidtitel"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Sidor"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Lösenord"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Drivs av "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Frågor"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Fråga"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Frågeparametrar"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Realtid"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Hänvisare"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Hänvisare"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Uppdatera"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Förnya"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regioner"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Ta bort"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Rapporter"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Krävs"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Återställ"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Återställ webbplats"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Mät din webbplats engagemang genom att följa hur ofta användare återvänder."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Roll"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Kör sökning"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Spara"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Upplösning"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Sök"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Välj datum"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Välj webbplats"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessioner"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Inställningar"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Delningslänk"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "En dag"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Summa"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Surfplatta"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team-medlem"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team namn"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team-ägare"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team webbplatser"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Denna månad"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Denna vecka"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Detta år"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Tidszon"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Titel"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Idag"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Visa/göm grafer"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Totalt"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Totala poster"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Spårningskod"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Sant"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Typ"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unikt"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Unika besökare"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Okänt"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Namnlös"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "Länk"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "Länkar"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Användare"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Användarnamn"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Användare"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Värde"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Visa"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Visa detaljer"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Endast visning"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Visningar"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Genomsnittlig besökstid"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Besökare"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Webbplats"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Webbplats ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Webbplatser"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Fönster"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Igår"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "besökare"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "besökare"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- },
- {
- "type": 0,
- "value": " just nu"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Är du säker på att du vill radera "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Är du säker på att du vill lämna "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Är du säker på att du vill återställa statistiken för "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "All tillhörande data kommer också att raderas."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Något gick fel."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " på "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Gå till inställningar"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Felaktigt användarnamn/lösenord."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Ogiltig domän"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minst "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " tecken"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "En ny version av Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " är tillgänglig!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Ingen data tillgänglig."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Ingen händelsedata är tillgänglig."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Lösenorden matchar inte"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Inga resultat hittades."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Det här teamet har inga webbplatser."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Du har inte skapat några team."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Det finns inga användare."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Du har inte konfigurerat några webbplatser."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Sidan kunde inte hittas."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "För att återställa webbplatsen, skriv "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " i rutan nedan."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistik för webbplatsen tas bort, men spårningskoden förblir oförändrad."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Sparat!"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Det här är den offentliga delningslänken för "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Du är redan medlem i teamet."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Teamet kunde inte hittas."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Webbplatserna kan ses av alla i teamet."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Spårningskod"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Användaren har raderats."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Besökare från "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " med "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " på "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Åtkomstkod",
+ "account": "Konto",
+ "action": "Åtgärd",
+ "actions": "Händelser",
+ "activity": "Aktivitetslogg",
+ "add": "Lägg till",
+ "add-board": "Lägg till anslagstavla",
+ "add-description": "Lägg till beskrivning",
+ "add-link": "Lägg till länk",
+ "add-member": "Lägg till medlem",
+ "add-pixel": "Lägg till pixel",
+ "add-step": "Lägg till steg",
+ "add-website": "Lägg till webbplats",
+ "admin": "Administratör",
+ "affiliate": "Partner",
+ "after": "Efter",
+ "all": "Alla",
+ "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",
+ "average": "Genomsnitt",
+ "back": "Tillbaka",
+ "before": "Före",
+ "behavior": "Beteende",
+ "block-selector": "Blockväljare",
+ "boards": "Anslagstavlor",
+ "bounce-rate": "Avvisningsfrekvens",
+ "breakdown": "Analys",
+ "browser": "Webbläsare",
+ "browsers": "Webbläsare",
+ "campaign": "Kampanj",
+ "campaigns": "Kampanjer",
+ "cancel": "Avbryt",
+ "change-password": "Byt lösenord",
+ "channel": "Kanal",
+ "channels": "Kanaler",
+ "chart": "Diagram",
+ "cities": "Städer",
+ "city": "Stad",
+ "clear-all": "Rensa alla",
+ "cls": "CLS",
+ "cohort": "Kohort",
+ "cohorts": "Kohorter",
+ "compare": "Jämför",
+ "compare-dates": "Jämför datum",
+ "confirm": "Bekräfta",
+ "confirm-password": "Bekräfta lösenord",
+ "contains": "Innehåller",
+ "content": "Innehåll",
+ "continue": "Fortsätt",
+ "conversion": "Konvertering",
+ "conversion-rate": "Konverteringsfrekvens",
+ "conversion-step": "Konverteringssteg",
+ "count": "Antal",
+ "countries": "Länder",
+ "country": "Land",
+ "create": "Skapa",
+ "create-report": "Skapa rapport",
+ "create-team": "Skapa team",
+ "create-user": "Skapa användare",
+ "created": "Skapad",
+ "created-by": "Skapad av",
+ "criteria": "Kriterier",
+ "currency": "Valuta",
+ "current": "Nuvarande",
+ "current-password": "Nuvarande lösenord",
+ "custom-range": "Anpassat urval",
+ "dashboard": "Översikt",
+ "data": "Data",
+ "date": "Datum",
+ "date-range": "Tidsperiod",
+ "day": "Dag",
+ "default-date-range": "Standard datum-urval",
+ "delete": "Radera",
+ "delete-report": "Radera rapport",
+ "delete-team": "Radera team",
+ "delete-user": "Radera användare",
+ "delete-website": "Radera webbplats",
+ "description": "Beskrivning",
+ "desktop": "Stationär",
+ "destination-url": "Mål-URL",
+ "details": "Detaljer",
+ "device": "Enhet",
+ "devices": "Enheter",
+ "direct": "Direkt",
+ "dismiss": "Avbryt",
+ "distinct-id": "Unikt ID",
+ "documentation": "Dokumentation",
+ "does-not-contain": "Innehåller inte",
+ "does-not-include": "Inkluderar inte",
+ "doest-not-exist": "Existerar inte",
+ "domain": "Domän",
+ "download": "Ladda ner",
+ "dropoff": "Bortfall",
+ "duration": "Varaktighet",
+ "edit": "Redigera",
+ "edit-member": "Redigera medlem",
+ "email": "E-post",
+ "enable-share-url": "Aktivera delningslänk",
+ "end-step": "Slutsteg",
+ "entry": "Ingångs-URL",
+ "environment": "Miljö",
+ "event": "Händelse",
+ "event-data": "Händelsedata",
+ "event-name": "Händelsenamn",
+ "events": "Händelser",
+ "exclude-bounce": "Exkludera avvisning",
+ "exists": "Existerar",
+ "exit": "Exit URL",
+ "false": "Falskt",
+ "fcp": "FCP",
+ "field": "Fält",
+ "fields": "Fältar",
+ "filter": "Filter",
+ "filter-combined": "Kombinerade",
+ "filter-raw": "Rådata",
+ "filters": "Filter",
+ "first-click": "Första klicket",
+ "first-seen": "Först sedd",
+ "funnel": "Tratt",
+ "funnel-description": "Förstå omvandlingen och bortfallsfrekvensen för användare.",
+ "funnels": "Trattar",
+ "goal": "Mål",
+ "goals": "Mål",
+ "goals-description": "Följ dina mål för sidvisningar och händelser.",
+ "good": "Bra",
+ "greater-than": "Större än",
+ "greater-than-equals": "Större än eller lika med",
+ "grouped": "Grupperad",
+ "growth": "Tillväxt",
+ "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.",
+ "invalid-url": "Ogiltig URL",
+ "is": "Är",
+ "is-false": "Är falskt",
+ "is-not": "Är inte",
+ "is-not-set": "Är inte inställd",
+ "is-set": "Är inställd",
+ "is-true": "Är sant",
+ "join": "Gå med",
+ "join-team": "Gå med i team",
+ "journey": "Resa",
+ "journey-description": "Förstå hur användare navigerar på din webbplats.",
+ "journeys": "Resor",
+ "language": "Språk",
+ "languages": "Språk",
+ "laptop": "Bärbar",
+ "last-click": "Sista klicket",
+ "last-days": "Senaste {x} dagarna",
+ "last-hours": "Senaste {x} timmarna",
+ "last-months": "Senaste {x} månaderna",
+ "last-seen": "Senast sedd",
+ "lcp": "LCP",
+ "leave": "Lämna",
+ "leave-team": "Lämna team",
+ "less-than": "Mindre än",
+ "less-than-equals": "Mindre än eller lika med",
+ "link": "Länk",
+ "links": "Länkar",
+ "location": "Plats",
+ "login": "Logga in",
+ "logout": "Logga ut",
+ "manage": "Hantera",
+ "manager": "Ansvarig",
+ "mask-level": "Masknivå",
+ "match": "Matchning",
+ "match-all": "Alla",
+ "match-any": "Vilken som helst",
+ "max": "Max",
+ "max-duration": "Maximal varaktighet",
+ "maximize": "Expandera",
+ "medium": "Medium",
+ "member": "Medlem",
+ "members": "Medlemmar",
+ "min": "Min",
+ "minute": "Minut",
+ "mobile": "Mobil",
+ "model": "Modell",
+ "month": "Månad",
+ "more": "Mer",
+ "my-account": "Mitt konto",
+ "my-websites": "Mina webbplatser",
+ "name": "Namn",
+ "needs-improvement": "Behöver förbättring",
+ "new-password": "Nytt lösenord",
+ "none": "Ingen",
+ "number-of-records": "{x} {x, plural, one {post} other {poster}}",
+ "ok": "OK",
+ "online": "Online",
+ "organic-search": "Organisk sökning",
+ "organic-shopping": "Organisk shopping",
+ "organic-social": "Organisk social",
+ "organic-video": "Organisk video",
+ "os": "Operativsystem",
+ "other": "Annat",
+ "overview": "Översikt",
+ "owner": "Ägare",
+ "page": "Sida",
+ "page-of": "Sida {current} av {total}",
+ "page-views": "Sidvisningar",
+ "pages": "Sidor",
+ "pageTitle": "Sidtitel",
+ "paid-ads": "Betalda annonser",
+ "paid-search": "Betald sökning",
+ "paid-shopping": "Betald shopping",
+ "paid-social": "Betald social",
+ "paid-video": "Betald video",
+ "password": "Lösenord",
+ "path": "Sökväg",
+ "paths": "Sökvägar",
+ "performance": "Prestanda",
+ "pixel": "Pixel",
+ "pixels": "Pixlar",
+ "play": "Spela upp",
+ "poor": "Dålig",
+ "powered-by": "Drivs av {name}",
+ "preferences": "Inställningar",
+ "previous": "Föregående",
+ "previous-period": "Föregående period",
+ "previous-year": "Föregående år",
+ "profile": "Profil",
+ "profiles": "Profiler",
+ "properties": "Egenskaper",
+ "property": "Egenskap",
+ "queries": "Frågor",
+ "query": "Fråga",
+ "query-parameters": "Frågeparametrar",
+ "realtime": "Realtid",
+ "recorded": "Registrerad den",
+ "referral": "Hänvisning",
+ "referrer": "Hänvisare",
+ "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",
+ "replay": "Uppspelning",
+ "replay-enabled": "Uppspelning aktiverad",
+ "replay-id": "Replay ID",
+ "replays": "Uppspelningar",
+ "reports": "Rapporter",
+ "required": "Krävs",
+ "reset": "Återställ",
+ "reset-website": "Återställ webbplats",
+ "retention": "Retention",
+ "retention-days": "Lagringsdagar",
+ "retention-description": "Mät din webbplats engagemang genom att följa hur ofta användare återvänder.",
+ "revenue": "Intäkter",
+ "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-segment": "Spara segment",
+ "screen": "Skärm",
+ "screens": "Upplösning",
+ "search": "Sök",
+ "segment": "Segment",
+ "segments": "Segment",
+ "select": "Välj",
+ "select-component": "Välj komponent",
+ "select-date": "Välj datum",
+ "select-filter": "Välj filter",
+ "select-role": "Välj roll",
+ "select-website": "Välj webbplats",
+ "session": "Session",
+ "session-data": "Sessionsdata",
+ "sessions": "Sessioner",
+ "settings": "Inställningar",
+ "share": "Dela",
+ "share-url": "Delningslänk",
+ "single-day": "En dag",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Källa",
+ "sources": "Källor",
+ "start-step": "Startsteg",
+ "steps": "Steg",
+ "sum": "Summa",
+ "support": "Support",
+ "switch-account": "Byt konto",
+ "table": "Tabell",
+ "tablet": "Surfplatta",
+ "tag": "Tagg",
+ "tags": "Taggar",
+ "team": "Team",
+ "team-id": "Team-ID",
+ "team-manager": "Teamledare",
+ "team-member": "Team-medlem",
+ "team-name": "Team namn",
+ "team-owner": "Team-ägare",
+ "team-settings": "Teaminställningar",
+ "team-view-only": "Endast teamvisning",
+ "team-websites": "Team webbplatser",
+ "teams": "Team",
+ "term": "Sökord",
+ "terms": "Villkor",
+ "theme": "Tema",
+ "this-month": "Denna månad",
+ "this-week": "Denna vecka",
+ "this-year": "Detta år",
+ "timezone": "Tidszon",
+ "title": "Titel",
+ "today": "Idag",
+ "toggle-charts": "Visa/göm grafer",
+ "total": "Totalt",
+ "total-records": "Totala poster",
+ "tracking-code": "Spårningskod",
+ "traffic": "Trafik",
+ "transactions": "Transaktioner",
+ "transfer": "Överför",
+ "transfer-website": "Överför webbplats",
+ "true": "Sant",
+ "ttfb": "TTFB",
+ "type": "Typ",
+ "unique": "Unikt",
+ "unique-events": "Unika händelser",
+ "unique-visitors": "Unika besökare",
+ "uniqueCustomers": "Unika kunder",
+ "unknown": "Okänt",
+ "untitled": "Namnlös",
+ "update": "Uppdatera",
+ "url": "URL",
+ "user": "Användare",
+ "username": "Användarnamn",
+ "users": "Användare",
+ "utm": "UTM",
+ "utm-campaign": "UTM-kampanj",
+ "utm-content": "UTM-innehåll",
+ "utm-description": "Spåra dina kampanjer genom UTM-parametrar.",
+ "utm-medium": "UTM-medium",
+ "utm-source": "UTM-källa",
+ "utm-term": "UTM-sökord",
+ "value": "Värde",
+ "version": "Version",
+ "view": "Visa",
+ "view-details": "Visa detaljer",
+ "view-only": "Endast visning",
+ "views": "Visningar",
+ "views-per-visit": "Visningar per besök",
+ "visit-duration": "Genomsnittlig besökstid",
+ "visitors": "Besökare",
+ "visits": "Besök",
+ "website": "Webbplats",
+ "website-id": "Webbplats ID",
+ "websites": "Webbplatser",
+ "window": "Fönster",
+ "yesterday": "Igår"
+ },
+ "message": {
+ "action-confirmation": "Skriv {confirmation} i rutan nedan för att bekräfta.",
+ "active-users": "{x} {x, plural, one {besökare} other {besökare}} just nu",
+ "bad-request": "Ogiltig förfrågan",
+ "collected-data": "Insamlad data",
+ "confirm-delete": "Är du säker på att du vill radera {target}?",
+ "confirm-leave": "Är du säker på att du vill lämna {target} ?",
+ "confirm-remove": "Är du säker på att du vill ta bort {target} ?",
+ "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.",
+ "event-log": "{event} på {url} ",
+ "forbidden": "Förbjudet",
+ "go-to-settings": "Gå till inställningar",
+ "incorrect-username-password": "Felaktigt användarnamn/lösenord.",
+ "invalid-domain": "Ogiltig domän",
+ "min-password-length": "Minst {n} tecken",
+ "new-version-available": "En ny version av Umami {version} är tillgänglig!",
+ "no-data-available": "Ingen data tillgänglig.",
+ "no-event-data": "Ingen händelsedata är tillgänglig.",
+ "no-match-password": "Lösenorden matchar inte",
+ "no-results-found": "Inga resultat hittades.",
+ "no-team-websites": "Det här teamet har inga webbplatser.",
+ "no-teams": "Du har inte skapat några team.",
+ "no-users": "Det finns inga användare.",
+ "no-websites-configured": "Du har inte konfigurerat några webbplatser.",
+ "not-found": "Hittades inte",
+ "nothing-selected": "Inget valt.",
+ "page-not-found": "Sidan kunde inte hittas.",
+ "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-component-preview": "Välj en komponent för att förhandsgranska",
+ "select-website-first": "Välj en webbplats först",
+ "sever-error": "Serverfel",
+ "share-url": "Det här är den offentliga delningslänken för {target}.",
+ "team-already-member": "Du är redan medlem i teamet.",
+ "team-not-found": "Teamet kunde inte hittas.",
+ "team-websites-info": "Webbplatserna kan ses av alla i teamet.",
+ "tracking-code": "Spårningskod",
+ "transfer-team-website-to-user": "Överför denna webbplats till ditt konto?",
+ "transfer-user-website-to-team": "Välj teamet att överföra denna webbplats till.",
+ "transfer-website": "Överför webbplatsägande till ditt konto eller ett annat team.",
+ "triggered-event": "Utlöst händelse",
+ "unauthorized": "Inte auktoriserad",
+ "user-deleted": "Användaren har raderats.",
+ "viewed-page": "Visad sida",
+ "visitor-log": "Besökare från {country} med {browser} på {os} {device} "
+ }
}
diff --git a/public/intl/messages/ta-IN.json b/public/intl/messages/ta-IN.json
index 87a38137c..5092f810d 100644
--- a/public/intl/messages/ta-IN.json
+++ b/public/intl/messages/ta-IN.json
@@ -1,1864 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "செயல்கள்"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "வலைத்தளத்தைச் சேர்க்க"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "நிர்வாகியைச் சேர்க்க"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "எல்லாம்"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "All time"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "பின்னால்"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "துள்ளல் விகிதம்"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "உலாவிகள்"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "ரத்துசெய்"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "கடவுச்சொல்லை மாற்று"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "கடவுச்சொல்லை உறுதிப்படுத்தவும்"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "நாடுகள்"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "தற்போதைய கடவுச்சொல்"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "தனிப்பயன் வேறுபாட்டெல்லை"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "முகப்பு"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "தேதி வரம்பு"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "இயல்புநிலை தேதி வரம்பு"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "அழி"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "வலைத்தளத்தை நீக்கு"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "மேசை கணினி"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "சாதனங்கள்"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "நீக்கு"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "கள முகவரி"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "திருத்துதல்"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "கள முகவரியை பகிரலாம்"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "நிகழ்வுகள்"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "ஒருங்கிணைந்த"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "மூல"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Languages"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "மடிக்கணினி"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "முந்தைய "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " நாட்கள்"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "முந்தைய "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " மணி"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "உள்நுழைய"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "வெளியேறு"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "கைபேசி"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "மேலும்"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "பெயர்"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "புதிய கடவுச்சொல்"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Owner"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "பக்க காட்சிகள்"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "பக்கங்கள்"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "கடவுச்சொல்"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " ஆல் இயக்கப்படுகிறது"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "சுயவிவரம்"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "தற்போதைய"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "குறிப்பிடுவோர்"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "புதுப்பிப்பு"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "தேவையானவை"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "மீட்டமை"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Reset statistics"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "சேமி"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "அமைப்புகள்"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "வலைத்தள களத்தைப் பகிரவும்"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "ஒரு நாள்"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "கையடக்க கணினி"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "இந்த மாதம்"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "இந்த வாரம்"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "இந்த வருடம்"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "நேர மண்டலம்"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "இன்று"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Toggle charts"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "கண்காணிப்பு குறியீடு"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "தனிப்பட்ட பார்வையாளர்கள்"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "தெரியாத"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "பயனர்பெயர்"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "விபரங்களை பார்"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "பார்வைகள்"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "சராசரி வருகை நேரம்"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "பார்வையாளர்கள்"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "வலைத்தளங்கள்"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " தற்போதைய "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "ஒன்று"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "மற்ற"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "நீங்கள் நிச்சயமாக "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " நீக்க விரும்புகிறீர்களா?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "'s statistics?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "தொடர்புடைய எல்லா தரவும் நீக்கப்படும்."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "ஏதோ தவறு நடந்துவிட்டது."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "அமைப்புகளுக்குச் செல்லவும்"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "தவறான பயனர்பெயர் / கடவுச்சொல்."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "தவறான கள முகவரி"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "தரவு எதுவும் கிடைக்கவில்லை."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "இருக்கடவுச்சொல் பொருந்தவில்லை"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "உங்களிடம் எந்த வலைத்தளங்களும் கட்டமைக்கப்படவில்லை."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "பக்கம் கிடைக்கவில்லை."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "வெற்றிகரமாக சேமிக்கப்பட்டது."
- }
- ],
- "message.share-url": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " இது பொதுவில் பகிரும் வலைத்தள முகவரி."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "கண்காணிப்பு குறியீடு"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": "வில் இருந்து பார்வையாளர் "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " ஐ "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": "லில் பயன்படுத்துகிறார்"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "அணுகல் குறியீடு",
+ "account": "கணக்கு",
+ "action": "செயல்",
+ "actions": "செயல்கள்",
+ "activity": "செயல்பாடு",
+ "add": "சேர்",
+ "add-board": "பலகையைச் சேர்",
+ "add-description": "விளக்கத்தைச் சேர்",
+ "add-link": "இணைப்பைச் சேர்",
+ "add-member": "உறுப்பினரைச் சேர்",
+ "add-pixel": "பிக்சலைச் சேர்",
+ "add-step": "படியைச் சேர்",
+ "add-website": "வலைத்தளத்தைச் சேர்க்க",
+ "admin": "நிர்வாகியைச் சேர்க்க",
+ "affiliate": "இணைத்திட்டம்",
+ "after": "பிறகு",
+ "all": "எல்லாம்",
+ "all-time": "எல்லா நேரமும்",
+ "analysis": "பகுப்பாய்வு",
+ "analytics": "பகுப்பாய்வு",
+ "aov": "AOV",
+ "application": "பயன்பாடு",
+ "apply": "பயன்படுத்து",
+ "arpu": "ARPU",
+ "attribution": "காரணிப்பு",
+ "attribution-description": "பயனர்கள் உங்கள் சந்தைப்படுத்தலுடன் எவ்வாறு ஈடுபடுகிறார்கள் மற்றும் மாற்றங்களை எது ஊக்குவிக்கிறது என்பதைப் பாருங்கள்.",
+ "audience": "பார்வையாளர்",
+ "average": "சராசரி",
+ "back": "பின்னால்",
+ "before": "முன்",
+ "behavior": "நடத்தை",
+ "block-selector": "தொகுதி தேர்வி",
+ "boards": "பலகைகள்",
+ "bounce-rate": "துள்ளல் விகிதம்",
+ "breakdown": "விரிவாக்கம்",
+ "browser": "உலாவி",
+ "browsers": "உலாவிகள்",
+ "campaign": "பிரச்சாரம்",
+ "campaigns": "பிரச்சாரங்கள்",
+ "cancel": "ரத்துசெய்",
+ "change-password": "கடவுச்சொல்லை மாற்று",
+ "channel": "சேனல்",
+ "channels": "சேனல்கள்",
+ "chart": "வரைபடம்",
+ "cities": "நகரங்கள்",
+ "city": "நகரம்",
+ "clear-all": "அனைத்தையும் அழி",
+ "cls": "CLS",
+ "cohort": "குழு",
+ "cohorts": "குழுக்கள்",
+ "compare": "ஒப்பிடு",
+ "compare-dates": "தேதிகளை ஒப்பிடு",
+ "confirm": "உறுதிப்படுத்து",
+ "confirm-password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்",
+ "contains": "உள்ளடக்கியது",
+ "content": "உள்ளடக்கம்",
+ "continue": "தொடர்",
+ "conversion": "மாற்றம்",
+ "conversion-rate": "மாற்ற விகிதம்",
+ "conversion-step": "மாற்றப் படி",
+ "count": "எண்ணிக்கை",
+ "countries": "நாடுகள்",
+ "country": "நாடு",
+ "create": "உருவாக்கு",
+ "create-report": "அறிக்கையை உருவாக்கு",
+ "create-team": "குழுவை உருவாக்கு",
+ "create-user": "பயனரை உருவாக்கு",
+ "created": "உருவாக்கப்பட்டது",
+ "created-by": "உருவாக்கியவர்",
+ "criteria": "அளவுகோல்",
+ "currency": "நாணயம்",
+ "current": "தற்போதைய",
+ "current-password": "தற்போதைய கடவுச்சொல்",
+ "custom-range": "தனிப்பயன் வேறுபாட்டெல்லை",
+ "dashboard": "முகப்பு",
+ "data": "தரவு",
+ "date": "தேதி",
+ "date-range": "தேதி வரம்பு",
+ "day": "நாள்",
+ "default-date-range": "இயல்புநிலை தேதி வரம்பு",
+ "delete": "அழி",
+ "delete-report": "அறிக்கையை நீக்கு",
+ "delete-team": "குழுவை நீக்கு",
+ "delete-user": "பயனரை நீக்கு",
+ "delete-website": "வலைத்தளத்தை நீக்கு",
+ "description": "விளக்கம்",
+ "desktop": "மேசை கணினி",
+ "destination-url": "இலக்கு URL",
+ "details": "விவரங்கள்",
+ "device": "சாதனம்",
+ "devices": "சாதனங்கள்",
+ "direct": "நேரடி",
+ "dismiss": "நீக்கு",
+ "distinct-id": "தனித்துவ ID",
+ "documentation": "ஆவணங்கள்",
+ "does-not-contain": "உள்ளடக்கவில்லை",
+ "does-not-include": "சேர்க்கவில்லை",
+ "doest-not-exist": "இல்லை",
+ "domain": "கள முகவரி",
+ "download": "பதிவிறக்கு",
+ "dropoff": "விலகல்",
+ "duration": "கால அளவு",
+ "edit": "திருத்துதல்",
+ "edit-member": "உறுப்பினரைத் திருத்து",
+ "email": "மின்னஞ்சல்",
+ "enable-share-url": "கள முகவரியை பகிரலாம்",
+ "end-step": "இறுதிப் படி",
+ "entry": "Entry URL",
+ "environment": "சூழல்",
+ "event": "நிகழ்வு",
+ "event-data": "நிகழ்வுத் தரவு",
+ "event-name": "நிகழ்வு பெயர்",
+ "events": "நிகழ்வுகள்",
+ "exclude-bounce": "துள்ளலை விலக்கு",
+ "exists": "உள்ளது",
+ "exit": "Exit URL",
+ "false": "தவறு",
+ "fcp": "FCP",
+ "field": "புலம்",
+ "fields": "புலங்கள்",
+ "filter": "வடிகட்டி",
+ "filter-combined": "ஒருங்கிணைந்த",
+ "filter-raw": "மூல",
+ "filters": "வடிகட்டிகள்",
+ "first-click": "முதல் கிளிக்",
+ "first-seen": "முதலில் பார்த்தது",
+ "funnel": "புனல்",
+ "funnel-description": "பயனர்களின் மாற்ற மற்றும் விலகல் விகிதத்தைப் புரிந்துகொள்ளுங்கள்.",
+ "funnels": "புனல்கள்",
+ "goal": "இலக்கு",
+ "goals": "இலக்குகள்",
+ "goals-description": "பக்க காட்சிகள் மற்றும் நிகழ்வுகளுக்கான உங்கள் இலக்குகளைக் கண்காணிக்கவும்.",
+ "good": "நல்லது",
+ "greater-than": "பெரியது",
+ "greater-than-equals": "பெரியது அல்லது சமம்",
+ "grouped": "தொகுக்கப்பட்டது",
+ "growth": "வளர்ச்சி",
+ "hostname": "புரவலன் பெயர்",
+ "hour": "மணி",
+ "includes": "சேர்க்கிறது",
+ "inp": "INP",
+ "insight": "நுண்ணறிவு",
+ "insights": "நுண்ணறிவுகள்",
+ "insights-description": "பிரிவுகள் மற்றும் வடிகட்டிகளைப் பயன்படுத்தி உங்கள் தரவில் ஆழமாக முழுகுங்கள்.",
+ "invalid-url": "தவறான URL",
+ "is": "ஆகும்",
+ "is-false": "தவறு",
+ "is-not": "அல்ல",
+ "is-not-set": "அமைக்கப்படவில்லை",
+ "is-set": "அமைக்கப்பட்டுள்ளது",
+ "is-true": "உண்மை",
+ "join": "சேர்",
+ "join-team": "குழுவில் சேர்",
+ "journey": "பயணம்",
+ "journey-description": "பயனர்கள் உங்கள் வலைத்தளத்தில் எவ்வாறு வழிசெல்கிறார்கள் என்பதைப் புரிந்துகொள்ளுங்கள்.",
+ "journeys": "பயணங்கள்",
+ "language": "மொழி",
+ "languages": "மொழிகள்",
+ "laptop": "மடிக்கணினி",
+ "last-click": "கடைசி கிளிக்",
+ "last-days": "முந்தைய {x} நாட்கள்",
+ "last-hours": "முந்தைய {x} மணி",
+ "last-months": "முந்தைய {x} மாதங்கள்",
+ "last-seen": "கடைசியாகப் பார்த்தது",
+ "lcp": "LCP",
+ "leave": "வெளியேறு",
+ "leave-team": "குழுவை விட்டு வெளியேறு",
+ "less-than": "சிறியது",
+ "less-than-equals": "சிறியது அல்லது சமம்",
+ "link": "இணைப்பு",
+ "links": "இணைப்புகள்",
+ "location": "இடம்",
+ "login": "உள்நுழைய",
+ "logout": "வெளியேறு",
+ "manage": "நிர்வகி",
+ "manager": "மேலாளர்",
+ "mask-level": "முகமூடி நிலை",
+ "match": "பொருத்தம்",
+ "match-all": "அனைத்தும்",
+ "match-any": "எதுவும்",
+ "max": "அதிகபட்சம்",
+ "max-duration": "அதிகபட்ச கால அளவு",
+ "maximize": "Expand",
+ "medium": "ஊடகம்",
+ "member": "உறுப்பினர்",
+ "members": "உறுப்பினர்கள்",
+ "min": "குறைந்தபட்சம்",
+ "minute": "நிமிடம்",
+ "mobile": "கைபேசி",
+ "model": "மாதிரி",
+ "month": "மாதம்",
+ "more": "மேலும்",
+ "my-account": "எனது கணக்கு",
+ "my-websites": "எனது வலைத்தளங்கள்",
+ "name": "பெயர்",
+ "needs-improvement": "மேம்பாடு தேவை",
+ "new-password": "புதிய கடவுச்சொல்",
+ "none": "எதுவுமில்லை",
+ "number-of-records": "{x} {x, plural, one {பதிவு} other {பதிவுகள்}}",
+ "ok": "OK",
+ "online": "நிகழ்நிலை",
+ "organic-search": "இயற்கையான தேடல்",
+ "organic-shopping": "இயற்கையான ஷாப்பிங்",
+ "organic-social": "இயற்கையான சமூக ஊடகம்",
+ "organic-video": "இயற்கையான வீடியோ",
+ "os": "OS",
+ "other": "பிற",
+ "overview": "மேலோட்டம்",
+ "owner": "உரிமையாளர்",
+ "page": "பக்கம்",
+ "page-of": "பக்கம் {current} / {total}",
+ "page-views": "பக்க காட்சிகள்",
+ "pages": "பக்கங்கள்",
+ "pageTitle": "பக்கத் தலைப்பு",
+ "paid-ads": "கட்டண விளம்பரங்கள்",
+ "paid-search": "கட்டணத் தேடல்",
+ "paid-shopping": "கட்டண ஷாப்பிங்",
+ "paid-social": "கட்டண சமூக ஊடகம்",
+ "paid-video": "கட்டண வீடியோ",
+ "password": "கடவுச்சொல்",
+ "path": "பாதை",
+ "paths": "பாதைகள்",
+ "performance": "செயல்திறன்",
+ "pixel": "பிக்சல்",
+ "pixels": "பிக்சல்கள்",
+ "play": "இயக்கு",
+ "poor": "மோசம்",
+ "powered-by": "{name} ஆல் இயக்கப்படுகிறது",
+ "preferences": "விருப்பத்தேர்வுகள்",
+ "previous": "முந்தைய",
+ "previous-period": "முந்தைய காலம்",
+ "previous-year": "முந்தைய ஆண்டு",
+ "profile": "சுயவிவரம்",
+ "profiles": "சுயவிவரங்கள்",
+ "properties": "பண்புகள்",
+ "property": "பண்பு",
+ "queries": "வினவல்கள்",
+ "query": "வினவல்",
+ "query-parameters": "வினவல் அளவுருக்கள்",
+ "realtime": "தற்போதைய",
+ "recorded": "பதிவுசெய்த நேரம்",
+ "referral": "பரிந்துரை",
+ "referrer": "பரிந்துரையாளர்",
+ "referrers": "குறிப்பிடுவோர்",
+ "refresh": "புதுப்பிப்பு",
+ "regenerate": "மீண்டும் உருவாக்கு",
+ "regex-match": "Regex உடன் பொருந்துகிறது",
+ "regex-not-match": "Regex உடன் பொருந்தாது",
+ "region": "பிராந்தியம்",
+ "regions": "பிராந்தியங்கள்",
+ "remaining": "மீதம்",
+ "remove": "நீக்கு",
+ "remove-member": "உறுப்பினரை நீக்கு",
+ "replay": "மறுபடியும் இயக்கு",
+ "replay-enabled": "மறுபடியும் இயக்கு இயக்கப்பட்டது",
+ "replay-id": "Replay ID",
+ "replays": "மறுபடியும் இயக்குதல்கள்",
+ "reports": "அறிக்கைகள்",
+ "required": "தேவையானவை",
+ "reset": "மீட்டமை",
+ "reset-website": "Reset statistics",
+ "retention": "தக்கவைப்பு",
+ "retention-days": "தக்கவைப்பு நாட்கள்",
+ "retention-description": "பயனர்கள் எவ்வளவு அடிக்கடி திரும்பி வருகிறார்கள் என்பதைக் கண்காணித்து உங்கள் வலைத்தளத்தின் ஒட்டுதலை அளவிடுங்கள்.",
+ "revenue": "வருவாய்",
+ "revenue-description": "உங்கள் வருவாய் தரவையும் பயனர்கள் எவ்வாறு செலவிடுகிறார்கள் என்பதையும் ஆராயுங்கள்.",
+ "role": "பங்கு",
+ "run-query": "வினவலை இயக்கு",
+ "sample-rate": "மாதிரி விகிதம்",
+ "sample-size": "மாதிரி அளவு",
+ "save": "சேமி",
+ "save-cohort": "குழுவைச் சேமி",
+ "save-segment": "பிரிவைச் சேமி",
+ "screen": "திரை",
+ "screens": "திரைகள்",
+ "search": "தேடு",
+ "segment": "பிரிவு",
+ "segments": "பிரிவுகள்",
+ "select": "தேர்ந்தெடு",
+ "select-component": "ஒரு கூறு தேர்ந்தெடுக்கவும்",
+ "select-date": "தேதியைத் தேர்ந்தெடு",
+ "select-filter": "வடிகட்டியைத் தேர்ந்தெடு",
+ "select-role": "பங்கைத் தேர்ந்தெடு",
+ "select-website": "வலைத்தளத்தைத் தேர்ந்தெடு",
+ "session": "அமர்வு",
+ "session-data": "அமர்வுத் தரவு",
+ "sessions": "அமர்வுகள்",
+ "settings": "அமைப்புகள்",
+ "share": "பகிர்",
+ "share-url": "வலைத்தள களத்தைப் பகிரவும்",
+ "single-day": "ஒரு நாள்",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "மூலம்",
+ "sources": "மூலங்கள்",
+ "start-step": "தொடக்கப் படி",
+ "steps": "படிகள்",
+ "sum": "கூட்டுத்தொகை",
+ "support": "ஆதரவு",
+ "switch-account": "கணக்கை மாற்று",
+ "table": "அட்டவணை",
+ "tablet": "கையடக்க கணினி",
+ "tag": "குறிச்சொல்",
+ "tags": "குறிச்சொற்கள்",
+ "team": "குழு",
+ "team-id": "குழு ID",
+ "team-manager": "குழு மேலாளர்",
+ "team-member": "குழு உறுப்பினர்",
+ "team-name": "குழுவின் பெயர்",
+ "team-owner": "குழு உரிமையாளர்",
+ "team-settings": "குழு அமைப்புகள்",
+ "team-view-only": "குழு பார்வை மட்டும்",
+ "team-websites": "குழு வலைத்தளங்கள்",
+ "teams": "குழுக்கள்",
+ "term": "சொல்",
+ "terms": "விதிமுறைகள்",
+ "theme": "தீம்",
+ "this-month": "இந்த மாதம்",
+ "this-week": "இந்த வாரம்",
+ "this-year": "இந்த வருடம்",
+ "timezone": "நேர மண்டலம்",
+ "title": "தலைப்பு",
+ "today": "இன்று",
+ "toggle-charts": "வரைபடங்களை மாற்று",
+ "total": "மொத்தம்",
+ "total-records": "மொத்தப் பதிவுகள்",
+ "tracking-code": "கண்காணிப்பு குறியீடு",
+ "traffic": "பார்வையாளர் போக்குவரத்து",
+ "transactions": "பரிவர்த்தனைகள்",
+ "transfer": "மாற்றம்",
+ "transfer-website": "வலைத்தளத்தை மாற்று",
+ "true": "உண்மை",
+ "ttfb": "TTFB",
+ "type": "வகை",
+ "unique": "தனித்துவ",
+ "unique-events": "தனித்துவ நிகழ்வுகள்",
+ "unique-visitors": "தனிப்பட்ட பார்வையாளர்கள்",
+ "uniqueCustomers": "தனித்துவ வாடிக்கையாளர்கள்",
+ "unknown": "தெரியாத",
+ "untitled": "தலைப்பில்லாத",
+ "update": "புதுப்பி",
+ "url": "URL",
+ "user": "பயனர்",
+ "username": "பயனர்பெயர்",
+ "users": "பயனர்கள்",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaign",
+ "utm-content": "UTM Content",
+ "utm-description": "UTM அளவுருக்கள் மூலம் உங்கள் பிரச்சாரங்களைக் கண்காணிக்கவும்.",
+ "utm-medium": "UTM Medium",
+ "utm-source": "UTM Source",
+ "utm-term": "UTM Term",
+ "value": "மதிப்பு",
+ "version": "பதிப்பு",
+ "view": "பார்",
+ "view-details": "விபரங்களை பார்",
+ "view-only": "பார்வை மட்டும்",
+ "views": "பார்வைகள்",
+ "views-per-visit": "ஒரு வருகைக்கான பார்வைகள்",
+ "visit-duration": "சராசரி வருகை நேரம்",
+ "visitors": "பார்வையாளர்கள்",
+ "visits": "வருகைகள்",
+ "website": "வலைத்தளம்",
+ "website-id": "வலைத்தள ID",
+ "websites": "வலைத்தளங்கள்",
+ "window": "சாளரம்",
+ "yesterday": "நேற்று"
+ },
+ "message": {
+ "action-confirmation": "உறுதிப்படுத்த கீழே உள்ள பெட்டியில் {confirmation} என்று தட்டச்சு செய்யவும்.",
+ "active-users": "{x} தற்போதைய {x, plural, one {ஒன்று} other {மற்ற}}",
+ "bad-request": "தவறான கோரிக்கை",
+ "collected-data": "சேகரிக்கப்பட்ட தரவு",
+ "confirm-delete": "நீங்கள் நிச்சயமாக {target} நீக்க விரும்புகிறீர்களா?",
+ "confirm-leave": "{target} விட்டு வெளியேற விரும்புகிறீர்களா?",
+ "confirm-remove": "{target} நீக்க விரும்புகிறீர்களா?",
+ "confirm-reset": "Are your sure you want to reset {target}'s statistics?",
+ "delete-team-warning": "ஒரு குழுவை நீக்கினால் அனைத்து குழு வலைத்தளங்களும் நீக்கப்படும்.",
+ "delete-website-warning": "தொடர்புடைய எல்லா தரவும் நீக்கப்படும்.",
+ "empty-dashboard": "உங்கள் டாஷ்போர்டு காலியாக உள்ளது. உங்கள் முதல் கூறை சேர்க்க திருத்து கிளிக் செய்யுங்கள்.",
+ "error": "ஏதோ தவறு நடந்துவிட்டது.",
+ "event-log": "{event} {url} இல்",
+ "forbidden": "தடைசெய்யப்பட்டது",
+ "go-to-settings": "அமைப்புகளுக்குச் செல்லவும்",
+ "incorrect-username-password": "தவறான பயனர்பெயர் / கடவுச்சொல்.",
+ "invalid-domain": "தவறான கள முகவரி",
+ "min-password-length": "குறைந்தபட்சம் {n} எழுத்துகள் தேவை",
+ "new-version-available": "Umami {version} புதிய பதிப்பு கிடைக்கிறது!",
+ "no-data-available": "தரவு எதுவும் கிடைக்கவில்லை.",
+ "no-event-data": "நிகழ்வுத் தரவு எதுவும் கிடைக்கவில்லை.",
+ "no-match-password": "இருக்கடவுச்சொல் பொருந்தவில்லை",
+ "no-results-found": "முடிவுகள் எதுவும் கிடைக்கவில்லை.",
+ "no-team-websites": "இந்தக் குழுவில் வலைத்தளங்கள் எதுவும் இல்லை.",
+ "no-teams": "நீங்கள் எந்தக் குழுவையும் உருவாக்கவில்லை.",
+ "no-users": "பயனர்கள் யாரும் இல்லை.",
+ "no-websites-configured": "உங்களிடம் எந்த வலைத்தளங்களும் கட்டமைக்கப்படவில்லை.",
+ "not-found": "கிடைக்கவில்லை",
+ "nothing-selected": "எதுவும் தேர்ந்தெடுக்கப்படவில்லை.",
+ "page-not-found": "பக்கம் கிடைக்கவில்லை.",
+ "reset-website": "இந்த வலைத்தளத்தை மீட்டமைக்க, கீழே உள்ள பெட்டியில் {confirmation} என்று தட்டச்சு செய்து உறுதிப்படுத்தவும்.",
+ "reset-website-warning": "இந்த வலைத்தளத்தின் அனைத்து புள்ளிவிவரங்களும் நீக்கப்படும், ஆனால் உங்கள் அமைப்புகள் அப்படியே இருக்கும்.",
+ "saved": "வெற்றிகரமாக சேமிக்கப்பட்டது.",
+ "select-component-preview": "முன்னோட்டம் பார்க்க ஒரு கூறு தேர்ந்தெடுக்கவும்",
+ "select-website-first": "முதலில் ஒரு வலைத்தளம் தேர்ந்தெடுக்கவும்",
+ "sever-error": "சேவையக பிழை",
+ "share-url": "உங்கள் வலைத்தள புள்ளிவிவரங்கள் பின்வரும் URL இல் பொதுவாகக் கிடைக்கும்:",
+ "team-already-member": "நீங்கள் ஏற்கனவே இந்தக் குழுவின் உறுப்பினர்.",
+ "team-not-found": "குழு கிடைக்கவில்லை.",
+ "team-websites-info": "குழுவில் உள்ள எவரும் வலைத்தளங்களைப் பார்க்கலாம்.",
+ "tracking-code": "இந்த வலைத்தளத்தின் புள்ளிவிவரங்களைக் கண்காணிக்க, பின்வரும் குறியீட்டை உங்கள் HTML இன் ... பகுதியில் வைக்கவும்.",
+ "transfer-team-website-to-user": "இந்த வலைத்தளத்தை உங்கள் கணக்கிற்கு மாற்ற விரும்புகிறீர்களா?",
+ "transfer-user-website-to-team": "இந்த வலைத்தளத்தை மாற்ற குழுவைத் தேர்ந்தெடுக்கவும்.",
+ "transfer-website": "வலைத்தள உரிமையை உங்கள் கணக்கிற்கு அல்லது மற்றொரு குழுவிற்கு மாற்றவும்.",
+ "triggered-event": "தூண்டப்பட்ட நிகழ்வு",
+ "unauthorized": "அங்கீகரிக்கப்படவில்லை",
+ "user-deleted": "பயனர் நீக்கப்பட்டார்.",
+ "viewed-page": "பார்வையிட்ட பக்கம்",
+ "visitor-log": "{country} வில் இருந்து பார்வையாளர் {browser} ஐ {os} {device} லில் பயன்படுத்துகிறார்"
+ }
}
diff --git a/public/intl/messages/th-TH.json b/public/intl/messages/th-TH.json
index a8e68c99f..275152e4b 100644
--- a/public/intl/messages/th-TH.json
+++ b/public/intl/messages/th-TH.json
@@ -1,1864 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "การกระทำ"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "เพิ่มเว็บไซต์"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "ผู้ดูแลระบบ"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "ทั้งหมด"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "ทุกช่วงเวลา"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "ย้อนกลับ"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "อัตราตีกลับ"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "เบราว์เซอร์"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "ยกเลิก"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "เปลี่ยนรหัสผ่าน"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "ยืนยันรหัสผ่าน"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "ประเทศ"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "รหัสผ่านปัจจุบัน"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "กำหนดช่วงเวลา"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "แดชบอร์ด"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "ตั้งแต่วันที่"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "ช่วงเวลา"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "ลบ"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "ลบเว็บไซต์"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "เดสก์ท็อป"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "อุปกรณ์"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "ยกเลิก"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "โดเมน"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "แก้ไข"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "เปิดใช้งานการแชร์ลิงก์"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "เหตุการณ์"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "ข้อมูลรวม"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "ข้อมูลดิบ"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "ภาษา"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "ภาษา"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "แล็ปท็อป"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " วันที่ผ่านมา"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ชั่วโมงที่ผ่านมา"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "เข้าสู่ระบบ"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "ออกจากระบบ"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "โทรศัพท์มือถือ"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "เพิ่มเติม"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "ชื่อ"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "รหัสผ่านใหม่"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "ไม่ได้กำหนด"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "เจ้าของ"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "การเข้าชม"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "หน้าเพจ"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "รหัสผ่าน"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "ขับเคลื่อนโดย "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "โปรไฟล์"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "เรียลไทม์"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "แหล่งที่มา"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "รีเฟรช"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "ต้องการ"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "รีเซต"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "รีเซตข้อมูลสถิติ"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "บันทึก"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "ขนาดหน้าจอ"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "ตั้งค่า"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "แชร์ลิงก์"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "วันที่"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "แท็บเล็ต"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "ธีม"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "เดือนปัจจุบัน"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "สัปดาห์ปัจจุบัน"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "ปีปัจจุบัน"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "เขตเวลา"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "วันนี้"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "เปิด/ปิดแผนภูมิ"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "โค้ดสำหรับใช้ติดตาม"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "ผู้เข้าชม"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "ไม่รู้จัก"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "ชื่อผู้ใช้"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "แสดงรายละเอียด"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "การเข้าชม"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "ระยะเวลาเข้าชมเฉลี่ย"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "ผู้เข้าชม"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "เว็บไซต์"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "มีผู้ใช้งาน "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "คนในขณะนี้"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "คนในขณะนี้"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "คุณแน่ใจหรือไม่ว่าต้องการลบ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "คุณแน่ใจหรือไม่ว่าต้องการรีเซตข้อมูลสถิติของ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบ."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "เกิดข้อผิดพลาด."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "ไปที่การตั้งค่า"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "โดเมนไม่ถูกต้อง"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "ไม่มีข้อมูล."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "รหัสผ่านไม่ตรงกัน"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "คุณยังไม่ได้ตั้งค่าเว็บไซต์ใด ๆ ไว้."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "ไม่พบหน้านี้."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "สถิติทั้งหมดสำหรับเว็บไซต์นี้จะถูกลบออก แต่โค้ดสำหรับใช้ติดตามของคุณจะยังคงอยู่เหมือนเดิม."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "บันทึกข้อมูลเรียบร้อย."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "นี่คือลิงก์ที่แชร์แบบสาธารณะสำหรับ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "โค้ดสำหรับใช้ติดตาม"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "ผู้เข้าชมจาก "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " กำลังใช้งานผ่าน "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " บน "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "รหัสเข้าถึง",
+ "account": "บัญชี",
+ "action": "การกระทำ",
+ "actions": "การกระทำ",
+ "activity": "Activity log",
+ "add": "เพิ่ม",
+ "add-board": "เพิ่มบอร์ด",
+ "add-description": "เพิ่มคำอธิบาย",
+ "add-link": "เพิ่มลิงก์",
+ "add-member": "เพิ่มสมาชิก",
+ "add-pixel": "เพิ่มพิกเซล",
+ "add-step": "เพิ่มขั้นตอน",
+ "add-website": "เพิ่มเว็บไซต์",
+ "admin": "ผู้ดูแลระบบ",
+ "affiliate": "พันธมิตร",
+ "after": "หลัง",
+ "all": "ทั้งหมด",
+ "all-time": "ทุกช่วงเวลา",
+ "analysis": "การวิเคราะห์",
+ "analytics": "การวิเคราะห์ข้อมูล",
+ "aov": "AOV",
+ "application": "แอปพลิเคชัน",
+ "apply": "นำไปใช้",
+ "arpu": "ARPU",
+ "attribution": "การระบุแหล่งที่มา",
+ "attribution-description": "ดูว่าผู้ใช้มีปฏิสัมพันธ์กับการตลาดอย่างไรและอะไรกระตุ้นการแปลง",
+ "audience": "กลุ่มเป้าหมาย",
+ "average": "ค่าเฉลี่ย",
+ "back": "ย้อนกลับ",
+ "before": "ก่อน",
+ "behavior": "พฤติกรรม",
+ "block-selector": "ตัวเลือกบล็อก",
+ "boards": "บอร์ด",
+ "bounce-rate": "อัตราตีกลับ",
+ "breakdown": "การแยกย่อย",
+ "browser": "เบราว์เซอร์",
+ "browsers": "เบราว์เซอร์",
+ "campaign": "แคมเปญ",
+ "campaigns": "แคมเปญ",
+ "cancel": "ยกเลิก",
+ "change-password": "เปลี่ยนรหัสผ่าน",
+ "channel": "ช่องทาง",
+ "channels": "ช่องทาง",
+ "chart": "แผนภูมิ",
+ "cities": "เมือง",
+ "city": "เมือง",
+ "clear-all": "ล้างทั้งหมด",
+ "cls": "CLS",
+ "cohort": "กลุ่มตัวอย่าง",
+ "cohorts": "กลุ่มตัวอย่าง",
+ "compare": "เปรียบเทียบ",
+ "compare-dates": "เปรียบเทียบวันที่",
+ "confirm": "ยืนยัน",
+ "confirm-password": "ยืนยันรหัสผ่าน",
+ "contains": "มี",
+ "content": "เนื้อหา",
+ "continue": "ดำเนินต่อ",
+ "conversion": "การแปลง",
+ "conversion-rate": "อัตราการแปลง",
+ "conversion-step": "ขั้นตอนการแปลง",
+ "count": "จำนวน",
+ "countries": "ประเทศ",
+ "country": "ประเทศ",
+ "create": "สร้าง",
+ "create-report": "สร้างรายงาน",
+ "create-team": "สร้างทีม",
+ "create-user": "สร้างผู้ใช้",
+ "created": "สร้างเมื่อ",
+ "created-by": "สร้างโดย",
+ "criteria": "เกณฑ์",
+ "currency": "สกุลเงิน",
+ "current": "ปัจจุบัน",
+ "current-password": "รหัสผ่านปัจจุบัน",
+ "custom-range": "กำหนดช่วงเวลา",
+ "dashboard": "แดชบอร์ด",
+ "data": "ข้อมูล",
+ "date": "วันที่",
+ "date-range": "ตั้งแต่วันที่",
+ "day": "วัน",
+ "default-date-range": "ช่วงเวลา",
+ "delete": "ลบ",
+ "delete-report": "ลบรายงาน",
+ "delete-team": "ลบทีม",
+ "delete-user": "ลบผู้ใช้",
+ "delete-website": "ลบเว็บไซต์",
+ "description": "คำอธิบาย",
+ "desktop": "เดสก์ท็อป",
+ "destination-url": "URL ปลายทาง",
+ "details": "รายละเอียด",
+ "device": "อุปกรณ์",
+ "devices": "อุปกรณ์",
+ "direct": "ตรง",
+ "dismiss": "ยกเลิก",
+ "distinct-id": "ID เฉพาะ",
+ "documentation": "เอกสาร",
+ "does-not-contain": "ไม่มี",
+ "does-not-include": "ไม่รวม",
+ "doest-not-exist": "ไม่มีอยู่",
+ "domain": "โดเมน",
+ "download": "ดาวน์โหลด",
+ "dropoff": "การออกจากระบบ",
+ "duration": "ระยะเวลา",
+ "edit": "แก้ไข",
+ "edit-member": "แก้ไขสมาชิก",
+ "email": "อีเมล",
+ "enable-share-url": "เปิดใช้งานการแชร์ลิงก์",
+ "end-step": "ขั้นตอนสุดท้าย",
+ "entry": "Entry URL",
+ "environment": "สภาพแวดล้อม",
+ "event": "เหตุการณ์",
+ "event-data": "ข้อมูลเหตุการณ์",
+ "event-name": "ชื่อเหตุการณ์",
+ "events": "เหตุการณ์",
+ "exclude-bounce": "ยกเว้นการตีกลับ",
+ "exists": "มีอยู่",
+ "exit": "Exit URL",
+ "false": "เท็จ",
+ "fcp": "FCP",
+ "field": "ฟิลด์",
+ "fields": "ฟิลด์",
+ "filter": "ตัวกรอง",
+ "filter-combined": "ข้อมูลรวม",
+ "filter-raw": "ข้อมูลดิบ",
+ "filters": "ตัวกรอง",
+ "first-click": "คลิกแรก",
+ "first-seen": "เห็นครั้งแรก",
+ "funnel": "ช่องทางขาย",
+ "funnel-description": "ทำความเข้าใจอัตราการแปลงและการออกจากระบบของผู้ใช้",
+ "funnels": "ช่องทางขาย",
+ "goal": "เป้าหมาย",
+ "goals": "เป้าหมาย",
+ "goals-description": "ติดตามเป้าหมายสำหรับการดูหน้าเว็บและเหตุการณ์",
+ "good": "ดี",
+ "greater-than": "มากกว่า",
+ "greater-than-equals": "มากกว่าหรือเท่ากับ",
+ "grouped": "จัดกลุ่ม",
+ "growth": "การเติบโต",
+ "hostname": "ชื่อโฮสต์",
+ "hour": "ชั่วโมง",
+ "includes": "รวม",
+ "inp": "INP",
+ "insight": "ข้อมูลเชิงลึก",
+ "insights": "ข้อมูลเชิงลึก",
+ "insights-description": "เจาะลึกข้อมูลของคุณโดยใช้กลุ่มและตัวกรอง",
+ "invalid-url": "URL ไม่ถูกต้อง",
+ "is": "คือ",
+ "is-false": "เป็นเท็จ",
+ "is-not": "ไม่ใช่",
+ "is-not-set": "ไม่ได้ตั้งค่า",
+ "is-set": "ตั้งค่าแล้ว",
+ "is-true": "เป็นจริง",
+ "join": "เข้าร่วม",
+ "join-team": "เข้าร่วมทีม",
+ "journey": "เส้นทาง",
+ "journey-description": "ทำความเข้าใจว่าผู้ใช้เดินทางผ่านเว็บไซต์ของคุณอย่างไร",
+ "journeys": "เส้นทาง",
+ "language": "ภาษา",
+ "languages": "ภาษา",
+ "laptop": "แล็ปท็อป",
+ "last-click": "คลิกสุดท้าย",
+ "last-days": "{x} วันที่ผ่านมา",
+ "last-hours": "{x} ชั่วโมงที่ผ่านมา",
+ "last-months": "{x} เดือนล่าสุด",
+ "last-seen": "เห็นล่าสุด",
+ "lcp": "LCP",
+ "leave": "ออก",
+ "leave-team": "ออกจากทีม",
+ "less-than": "น้อยกว่า",
+ "less-than-equals": "น้อยกว่าหรือเท่ากับ",
+ "link": "ลิงก์",
+ "links": "ลิงก์",
+ "location": "ตำแหน่ง",
+ "login": "เข้าสู่ระบบ",
+ "logout": "ออกจากระบบ",
+ "manage": "จัดการ",
+ "manager": "ผู้จัดการ",
+ "mask-level": "ระดับมาสก์",
+ "match": "จับคู่",
+ "match-all": "ทั้งหมด",
+ "match-any": "ใดๆ",
+ "max": "สูงสุด",
+ "max-duration": "ระยะเวลาสูงสุด",
+ "maximize": "Expand",
+ "medium": "สื่อ",
+ "member": "สมาชิก",
+ "members": "สมาชิก",
+ "min": "ต่ำสุด",
+ "minute": "นาที",
+ "mobile": "โทรศัพท์มือถือ",
+ "model": "รุ่น",
+ "month": "เดือน",
+ "more": "เพิ่มเติม",
+ "my-account": "บัญชีของฉัน",
+ "my-websites": "เว็บไซต์ของฉัน",
+ "name": "ชื่อ",
+ "needs-improvement": "ต้องปรับปรุง",
+ "new-password": "รหัสผ่านใหม่",
+ "none": "ไม่ได้กำหนด",
+ "number-of-records": "{x} {x, plural, one {รายการ} other {รายการ}}",
+ "ok": "ตกลง",
+ "online": "ออนไลน์",
+ "organic-search": "ค้นหาแบบออร์แกนิก",
+ "organic-shopping": "ชอปปิ้งแบบออร์แกนิก",
+ "organic-social": "โซเชียลแบบออร์แกนิก",
+ "organic-video": "วิดีโอแบบออร์แกนิก",
+ "os": "ระบบปฏิบัติการ",
+ "other": "อื่นๆ",
+ "overview": "ภาพรวม",
+ "owner": "เจ้าของ",
+ "page": "หน้า",
+ "page-of": "หน้า {current} จาก {total}",
+ "page-views": "การเข้าชม",
+ "pages": "หน้าเพจ",
+ "pageTitle": "ชื่อหน้า",
+ "paid-ads": "โฆษณาแบบจ่ายเงิน",
+ "paid-search": "ค้นหาแบบจ่ายเงิน",
+ "paid-shopping": "ชอปปิ้งแบบจ่ายเงิน",
+ "paid-social": "โซเชียลแบบจ่ายเงิน",
+ "paid-video": "วิดีโอแบบจ่ายเงิน",
+ "password": "รหัสผ่าน",
+ "path": "เส้นทาง",
+ "paths": "เส้นทาง",
+ "performance": "ประสิทธิภาพ",
+ "pixel": "พิกเซล",
+ "pixels": "พิกเซล",
+ "play": "เล่น",
+ "poor": "แย่",
+ "powered-by": "ขับเคลื่อนโดย {name}",
+ "preferences": "การตั้งค่า",
+ "previous": "ก่อนหน้า",
+ "previous-period": "ช่วงก่อนหน้า",
+ "previous-year": "ปีก่อนหน้า",
+ "profile": "โปรไฟล์",
+ "profiles": "โปรไฟล์",
+ "properties": "คุณสมบัติ",
+ "property": "คุณสมบัติ",
+ "queries": "คิวรี",
+ "query": "คิวรี",
+ "query-parameters": "พารามิเตอร์คิวรี",
+ "realtime": "เรียลไทม์",
+ "recorded": "บันทึกเมื่อ",
+ "referral": "การอ้างอิง",
+ "referrer": "ผู้อ้างอิง",
+ "referrers": "แหล่งที่มา",
+ "refresh": "รีเฟรช",
+ "regenerate": "สร้างใหม่",
+ "regex-match": "ตรงกับนิพจน์ทั่วไป",
+ "regex-not-match": "ไม่ตรงกับนิพจน์ทั่วไป",
+ "region": "ภูมิภาค",
+ "regions": "ภูมิภาค",
+ "remaining": "ที่เหลือ",
+ "remove": "ลบ",
+ "remove-member": "ลบสมาชิก",
+ "replay": "เล่นซ้ำ",
+ "replay-enabled": "เปิดใช้งานการเล่นซ้ำ",
+ "replay-id": "Replay ID",
+ "replays": "การเล่นซ้ำ",
+ "reports": "รายงาน",
+ "required": "ต้องการ",
+ "reset": "รีเซต",
+ "reset-website": "รีเซตข้อมูลสถิติ",
+ "retention": "การรักษาผู้ใช้",
+ "retention-days": "วันที่เก็บข้อมูล",
+ "retention-description": "วัดความเหนียวแน่นของเว็บไซต์โดยติดตามว่าผู้ใช้กลับมาบ่อยแค่ไหน",
+ "revenue": "รายได้",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "บทบาท",
+ "run-query": "เรียกใช้คิวรี",
+ "sample-rate": "อัตราการสุ่มตัวอย่าง",
+ "sample-size": "ขนาดตัวอย่าง",
+ "save": "บันทึก",
+ "save-cohort": "บันทึกกลุ่มตัวอย่าง",
+ "save-segment": "บันทึกเซ็กเมนต์",
+ "screen": "หน้าจอ",
+ "screens": "ขนาดหน้าจอ",
+ "search": "ค้นหา",
+ "segment": "เซ็กเมนต์",
+ "segments": "เซ็กเมนต์",
+ "select": "เลือก",
+ "select-component": "เลือกส่วนประกอบ",
+ "select-date": "เลือกวันที่",
+ "select-filter": "เลือกตัวกรอง",
+ "select-role": "เลือกบทบาท",
+ "select-website": "เลือกเว็บไซต์",
+ "session": "เซสชัน",
+ "session-data": "ข้อมูลเซสชัน",
+ "sessions": "เซสชัน",
+ "settings": "ตั้งค่า",
+ "share": "แชร์",
+ "share-url": "แชร์ลิงก์",
+ "single-day": "วันที่",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "แหล่งที่มา",
+ "sources": "แหล่งที่มา",
+ "start-step": "ขั้นตอนเริ่มต้น",
+ "steps": "ขั้นตอน",
+ "sum": "ผลรวม",
+ "support": "การสนับสนุน",
+ "switch-account": "สลับบัญชี",
+ "table": "ตาราง",
+ "tablet": "แท็บเล็ต",
+ "tag": "แท็ก",
+ "tags": "แท็ก",
+ "team": "ทีม",
+ "team-id": "ID ทีม",
+ "team-manager": "ผู้จัดการทีม",
+ "team-member": "สมาชิกทีม",
+ "team-name": "ชื่อทีม",
+ "team-owner": "เจ้าของทีม",
+ "team-settings": "การตั้งค่าทีม",
+ "team-view-only": "ดูเฉพาะทีม",
+ "team-websites": "เว็บไซต์ทีม",
+ "teams": "ทีม",
+ "term": "คำค้นหา",
+ "terms": "เงื่อนไข",
+ "theme": "ธีม",
+ "this-month": "เดือนปัจจุบัน",
+ "this-week": "สัปดาห์ปัจจุบัน",
+ "this-year": "ปีปัจจุบัน",
+ "timezone": "เขตเวลา",
+ "title": "ชื่อ",
+ "today": "วันนี้",
+ "toggle-charts": "เปิด/ปิดแผนภูมิ",
+ "total": "รวม",
+ "total-records": "จำนวนรายการทั้งหมด",
+ "tracking-code": "โค้ดสำหรับใช้ติดตาม",
+ "traffic": "ทราฟฟิก",
+ "transactions": "ธุรกรรม",
+ "transfer": "โอน",
+ "transfer-website": "โอนเว็บไซต์",
+ "true": "จริง",
+ "ttfb": "TTFB",
+ "type": "ประเภท",
+ "unique": "ไม่ซ้ำ",
+ "unique-events": "เหตุการณ์ไม่ซ้ำ",
+ "unique-visitors": "ผู้เข้าชม",
+ "uniqueCustomers": "ลูกค้าไม่ซ้ำ",
+ "unknown": "ไม่รู้จัก",
+ "untitled": "ไม่มีชื่อ",
+ "update": "อัปเดต",
+ "url": "URL",
+ "user": "ผู้ใช้",
+ "username": "ชื่อผู้ใช้",
+ "users": "ผู้ใช้",
+ "utm": "UTM",
+ "utm-campaign": "UTM แคมเปญ",
+ "utm-content": "UTM เนื้อหา",
+ "utm-description": "ติดตามแคมเปญของคุณผ่านพารามิเตอร์ UTM",
+ "utm-medium": "UTM สื่อ",
+ "utm-source": "UTM แหล่งที่มา",
+ "utm-term": "UTM คำค้นหา",
+ "value": "ค่า",
+ "version": "เวอร์ชัน",
+ "view": "ดู",
+ "view-details": "แสดงรายละเอียด",
+ "view-only": "ดูอย่างเดียว",
+ "views": "การเข้าชม",
+ "views-per-visit": "การดูต่อการเยี่ยมชม",
+ "visit-duration": "ระยะเวลาเข้าชมเฉลี่ย",
+ "visitors": "ผู้เข้าชม",
+ "visits": "การเยี่ยมชม",
+ "website": "เว็บไซต์",
+ "website-id": "ID เว็บไซต์",
+ "websites": "เว็บไซต์",
+ "window": "หน้าต่าง",
+ "yesterday": "เมื่อวาน"
+ },
+ "message": {
+ "action-confirmation": "พิมพ์ {confirmation} ในช่องด้านล่างเพื่อยืนยัน",
+ "active-users": "มีผู้ใช้งาน {x} {x, plural, one {คนในขณะนี้} other {คนในขณะนี้}}",
+ "bad-request": "คำขอไม่ถูกต้อง",
+ "collected-data": "ข้อมูลที่เก็บรวบรวม",
+ "confirm-delete": "คุณแน่ใจหรือไม่ว่าต้องการลบ {target} ?",
+ "confirm-leave": "คุณแน่ใจหรือไม่ว่าต้องการออกจาก {target} ?",
+ "confirm-remove": "คุณแน่ใจหรือไม่ว่าต้องการลบ {target} ?",
+ "confirm-reset": "คุณแน่ใจหรือไม่ว่าต้องการรีเซตข้อมูลสถิติของ {target} ?",
+ "delete-team-warning": "การลบทีมจะลบเว็บไซต์ทั้งหมดของทีมด้วย",
+ "delete-website-warning": "ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบ.",
+ "empty-dashboard": "แดชบอร์ดของคุณว่างเปล่า คลิกแก้ไขเพื่อเพิ่มส่วนประกอบแรก",
+ "error": "เกิดข้อผิดพลาด.",
+ "event-log": "{event} บน {url} ",
+ "forbidden": "ไม่ได้รับอนุญาต",
+ "go-to-settings": "ไปที่การตั้งค่า",
+ "incorrect-username-password": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง.",
+ "invalid-domain": "โดเมนไม่ถูกต้อง",
+ "min-password-length": "ความยาวขั้นต่ำ {n} ตัวอักษร",
+ "new-version-available": "Umami เวอร์ชันใหม่ {version} พร้อมใช้งานแล้ว!",
+ "no-data-available": "ไม่มีข้อมูล.",
+ "no-event-data": "ไม่มีข้อมูลเหตุการณ์",
+ "no-match-password": "รหัสผ่านไม่ตรงกัน",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "ทีมนี้ไม่มีเว็บไซต์",
+ "no-teams": "คุณยังไม่ได้สร้างทีม",
+ "no-users": "ไม่มีผู้ใช้",
+ "no-websites-configured": "คุณยังไม่ได้ตั้งค่าเว็บไซต์ใด ๆ ไว้.",
+ "not-found": "ไม่พบ",
+ "nothing-selected": "ไม่ได้เลือกอะไร",
+ "page-not-found": "ไม่พบหน้านี้.",
+ "reset-website": "เพื่อรีเซ็ตเว็บไซต์นี้ พิมพ์ {confirmation} ในช่องด้านล่าง",
+ "reset-website-warning": "สถิติทั้งหมดสำหรับเว็บไซต์นี้จะถูกลบออก แต่โค้ดสำหรับใช้ติดตามของคุณจะยังคงอยู่เหมือนเดิม.",
+ "saved": "บันทึกข้อมูลเรียบร้อย.",
+ "select-component-preview": "เลือกส่วนประกอบเพื่อดูตัวอย่าง",
+ "select-website-first": "เลือกเว็บไซต์ก่อน",
+ "sever-error": "เกิดข้อผิดพลาดของเซิร์ฟเวอร์",
+ "share-url": "นี่คือลิงก์ที่แชร์แบบสาธารณะสำหรับ {target}.",
+ "team-already-member": "คุณเป็นสมาชิกของทีมอยู่แล้ว",
+ "team-not-found": "ไม่พบทีม",
+ "team-websites-info": "เว็บไซต์สามารถดูได้โดยทุกคนในทีม",
+ "tracking-code": "โค้ดสำหรับใช้ติดตาม",
+ "transfer-team-website-to-user": "โอนเว็บไซต์นี้ไปยังบัญชีของคุณ?",
+ "transfer-user-website-to-team": "เลือกทีมเพื่อโอนเว็บไซต์นี้",
+ "transfer-website": "โอนความเป็นเจ้าของเว็บไซต์ไปยังบัญชีหรือทีมอื่น",
+ "triggered-event": "เหตุการณ์ที่ถูกเรียก",
+ "unauthorized": "ไม่ได้รับอนุญาต",
+ "user-deleted": "ผู้ใช้ถูกลบแล้ว",
+ "viewed-page": "หน้าที่ดู",
+ "visitor-log": "ผู้เข้าชมจาก {country} กำลังใช้งานผ่าน {browser} บน {os} {device} "
+ }
}
diff --git a/public/intl/messages/tr-TR.json b/public/intl/messages/tr-TR.json
index 9b23b29c3..2aa104940 100644
--- a/public/intl/messages/tr-TR.json
+++ b/public/intl/messages/tr-TR.json
@@ -1,1824 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Erişim Kodu"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Hareketler"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Aktivite Kaydı"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Ekle"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Açıklama ekle"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Üye ekle"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Adım ekle"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Web sitesi ekle"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Administrator"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Sonra"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Tümü"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Tüm zamanlar"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analitik"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Ortalama"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Geri"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Önce"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Tek sayfa ziyaret oranı"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Dağılım"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Tarayıcı"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Tarayıcılar"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "İptal"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Şifre değiştir"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Şehirler"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Şehir"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Hepsini temizle"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Onayla"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Parolayı onayla"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "İçeriği"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Devam et"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Ülkeler"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Ülke"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Oluştur"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Rapor oluştur"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Takım oluştur"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Kullanıcı oluştur"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Oluşturuldu"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Tarafından oluşturldu"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Mevcut parola"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Özelleştirilmiş aralık"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Kontrol Paneli"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Veri"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Tarih"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Tarih aralığı"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Gün"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Varsayılan tarih aralığı"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Sil"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Rapor sil"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Takım sil"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Kullanıcı sil"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Web sitesini sil"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Açıklama"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Masaüstü"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Detaylar"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Cihaz"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Cihazlar"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Reddet"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "İçermez"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Alan adı"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Bırakma"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Düzenle"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Kontrol panelini düzenle"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Üyeyi düzenle"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Anonim paylaşım URL'i aktif"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Olay"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Olay verisi"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Olaylar"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "Yanlış"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Alan"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Alanlar"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filtre"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Birleşik filtre"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Ham filtre"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filtreler"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Huni"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Kullanıcıların dönüşüm ve ayrılma oranlarını anlayın."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Büyüktür"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Büyük veya eşittir"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Segmentleri ve filtreleri kullanarak verilerinizi derinlemesine inceleyin."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Değil"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Ayarlanmamış"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Ayarlandı"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Katıl"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Takıma katıl"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Dil"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Diller"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Dizüstü"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Son "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " gün"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Son "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " saat"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Son "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ay"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Ayrıl"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Takımdan Ayrıl"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Küçüktür"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Küçük veya eşittir"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Giriş Yap"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Çıkış Yap"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Yönet"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Üye"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Üyeler"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Mobil Cihaz"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Detaylı göster"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Hesabım"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Web sitelerim"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "İsim"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Yeni parola"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Yok"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "TAMAM"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Genel bakış"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Sahibi"
- }
- ],
- "label.page-of": [
- {
- "type": 1,
- "value": "total"
- },
- {
- "type": 0,
- "value": " sayfada "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " "
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Sayfa görünümü"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Sayfa başlığı"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Sayfalar"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Parola"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Sağlayıcı: "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Profil"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Sorgular"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Sorgu"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Sorgu parametreleri"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Gerçek Zamanlı"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Yönlendirenler"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Yenile"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Yeniden Oluştur"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Bölge"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Bölgeler"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Kaldır"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Üyeyi kaldır"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Raporlar"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Zorunlu alan"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Sıfırla"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "İstatistikleri sıfırla"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Geri dönüş"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Kullanıcıların ne sıklıkla geri döndüğünü takip ederek web sitenizin kalıcılığını ölçün."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Rol"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Sorgu çalıştır"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Kaydet"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Ekranlar"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Ara"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Seç"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Tarih seç"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Rol seç"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Web sitesi seç"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Ayarlar"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Paylaşım adresi"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Tekil gün"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Adımlar"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Toplam"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Tablet"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Takım"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Takım ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Takım üyesi"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Takım ismi"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Takım sahibi"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Yalnızca ekip görünümü"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Takım web siteleri"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Takımlar"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Tema"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Bu ay"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Bu hafta"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Bu yıl"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Zaman dilimi"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Başlık"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Bugün"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Grafikleri değiştir"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Toplam"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Toplam kayıt"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "İzleme kodu"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer web sitesi"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "Doğru"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Tip"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Benzersiz"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Tekil kullanıcı"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Bilinmeyen"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "İsimsiz"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Güncelle"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Kullanıcı"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Kullanıcı adı"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Kullanıcılar"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Kampanyalarınızı UTM parametreleri aracılığıyla takip edin."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Değer"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Görünüm"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Detayı incele"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Sadece görünüm"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Görüntüleme"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Ziyaret başına görüntüleme"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Ortalama ziyaret süresi"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Ziyaretçi"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Ziyaretler"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Web sitesi"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Web siteleri"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Pencere"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Dün"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Onaylamak için aşağıdaki kutuya "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " yazın."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " aktif ziyaretçi"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " kaydını silmek istediğinizden emin misiniz?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " kaydından ayrılmak istediğinizden emin misiniz?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " kaydını kaldırmak istediğinizden emin misiniz?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " istatistiklerini sıfırlamak istediğinizden emin misiniz?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Bir takımı silmek tüm takım web sitelerini de silecektir."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "İlişkili tüm veriler de silinecektir."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Bir şeyler ters gitti!"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Ayarlara git"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Hatalı kullanıcı adı ya da parola."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Geçersiz alan adı"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " karakter uzunluğu"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Yeni versiyon Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " mevcut!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Henüz hiç veri yok."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Hiçbir olay verisi mevcut değil."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Parolalar uyuşmuyor"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Hiçbir sonuç bulunamadı."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "Bu takımın herhangi bir web sitesi yok."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Herhangi bir takım oluşturmadınız."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Kullanıcı yok."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Henüz hiç web sitesi tanımlamadınız"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Sayfa bulunamadı."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Bu websitesini sıfılamak için aşağıdaki kutuya "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " yazın."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Bu web sitesi için tüm istatistikler silinecek, ancak izleme kodunuz bozulmadan kalacaktır."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Başarıyla kaydedildi."
- }
- ],
- "message.share-url": [
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " için kullanılabilir anonim paylaşım adresidir."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Zaten bu takımın üyesisiniz"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Takım bulunamadı"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Web siteleri takımdaki herkes tarafından görüntülenebilir."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "İzleme kodu"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Bu web sitesi hesbınıza aktarılsın mı?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Bu web sitesinin aktarılacağı takımı seçin."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Web sitesi sahipliğini hesabınıza veya başka bir takıma aktarın"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Tetiklenen olay"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Kullanıcı silindi."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Görüntülenen sayfa"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Yeni ziyaretçi: "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": ", "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": ", "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": ", "
- },
- {
- "type": 1,
- "value": "browser"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Bırakan ziyaretçiler"
- }
- ]
+ "label": {
+ "access-code": "Erişim Kodu",
+ "account": "Hesap",
+ "action": "Eylem",
+ "actions": "Hareketler",
+ "activity": "Aktivite Kaydı",
+ "add": "Ekle",
+ "add-board": "Pano ekle",
+ "add-description": "Açıklama ekle",
+ "add-link": "Bağlantı ekle",
+ "add-member": "Üye ekle",
+ "add-pixel": "Piksel ekle",
+ "add-step": "Adım ekle",
+ "add-website": "Web sitesi ekle",
+ "admin": "Administrator",
+ "affiliate": "Ortak",
+ "after": "Sonra",
+ "all": "Tümü",
+ "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",
+ "average": "Ortalama",
+ "back": "Geri",
+ "before": "Önce",
+ "behavior": "Davranış",
+ "block-selector": "Blok seçici",
+ "boards": "Panolar",
+ "bounce-rate": "Tek sayfa ziyaret oranı",
+ "breakdown": "Dağılım",
+ "browser": "Tarayıcı",
+ "browsers": "Tarayıcılar",
+ "campaign": "Kampanya",
+ "campaigns": "Kampanyalar",
+ "cancel": "İptal",
+ "change-password": "Şifre değiştir",
+ "channel": "Kanal",
+ "channels": "Kanallar",
+ "chart": "Grafik",
+ "cities": "Şehirler",
+ "city": "Şehir",
+ "clear-all": "Hepsini temizle",
+ "cls": "CLS",
+ "cohort": "Kohort",
+ "cohorts": "Kohortlar",
+ "compare": "Karşılaştır",
+ "compare-dates": "Tarihleri karşılaştır",
+ "confirm": "Onayla",
+ "confirm-password": "Parolayı onayla",
+ "contains": "İçeriği",
+ "content": "İçerik",
+ "continue": "Devam et",
+ "conversion": "Dönüşüm",
+ "conversion-rate": "Dönüşüm oranı",
+ "conversion-step": "Dönüşüm adımı",
+ "count": "Adet",
+ "countries": "Ülkeler",
+ "country": "Ülke",
+ "create": "Oluştur",
+ "create-report": "Rapor oluştur",
+ "create-team": "Takım oluştur",
+ "create-user": "Kullanıcı oluştur",
+ "created": "Oluşturuldu",
+ "created-by": "Tarafından oluşturldu",
+ "criteria": "Kriterler",
+ "currency": "Para birimi",
+ "current": "Mevcut",
+ "current-password": "Mevcut parola",
+ "custom-range": "Özelleştirilmiş aralık",
+ "dashboard": "Kontrol Paneli",
+ "data": "Veri",
+ "date": "Tarih",
+ "date-range": "Tarih aralığı",
+ "day": "Gün",
+ "default-date-range": "Varsayılan tarih aralığı",
+ "delete": "Sil",
+ "delete-report": "Rapor sil",
+ "delete-team": "Takım sil",
+ "delete-user": "Kullanıcı sil",
+ "delete-website": "Web sitesini sil",
+ "description": "Açıklama",
+ "desktop": "Masaüstü",
+ "destination-url": "Hedef URL",
+ "details": "Detaylar",
+ "device": "Cihaz",
+ "devices": "Cihazlar",
+ "direct": "Doğrudan",
+ "dismiss": "Reddet",
+ "distinct-id": "Benzersiz ID",
+ "documentation": "Dokümantasyon",
+ "does-not-contain": "İçermez",
+ "does-not-include": "İçermiyor",
+ "doest-not-exist": "Mevcut değil",
+ "domain": "Alan adı",
+ "download": "İndir",
+ "dropoff": "Bırakma",
+ "duration": "Süre",
+ "edit": "Düzenle",
+ "edit-member": "Üyeyi düzenle",
+ "email": "E-posta",
+ "enable-share-url": "Anonim paylaşım URL'i aktif",
+ "end-step": "Son adım",
+ "entry": "Entry URL",
+ "environment": "Ortam",
+ "event": "Olay",
+ "event-data": "Olay verisi",
+ "event-name": "Olay adı",
+ "events": "Olaylar",
+ "exclude-bounce": "Hemen çıkışı hariç tut",
+ "exists": "Mevcut",
+ "exit": "Exit URL",
+ "false": "Yanlış",
+ "fcp": "FCP",
+ "field": "Alan",
+ "fields": "Alanlar",
+ "filter": "Filtre",
+ "filter-combined": "Birleşik filtre",
+ "filter-raw": "Ham filtre",
+ "filters": "Filtreler",
+ "first-click": "İlk tıklama",
+ "first-seen": "İlk görülme",
+ "funnel": "Huni",
+ "funnel-description": "Kullanıcıların dönüşüm ve ayrılma oranlarını anlayın.",
+ "funnels": "Huniler",
+ "goal": "Hedef",
+ "goals": "Hedefler",
+ "goals-description": "Sayfa görüntüleme ve olaylar için hedeflerinizi takip edin.",
+ "good": "İyi",
+ "greater-than": "Büyüktür",
+ "greater-than-equals": "Büyük veya eşittir",
+ "grouped": "Gruplandırılmış",
+ "growth": "Büyüme",
+ "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.",
+ "invalid-url": "Geçersiz URL",
+ "is": "Eşittir",
+ "is-false": "Yanlış",
+ "is-not": "Değil",
+ "is-not-set": "Ayarlanmamış",
+ "is-set": "Ayarlandı",
+ "is-true": "Doğru",
+ "join": "Katıl",
+ "join-team": "Takıma katıl",
+ "journey": "Yolculuk",
+ "journey-description": "Kullanıcıların sitenizde nasıl gezindiğini anlayın.",
+ "journeys": "Yolculuklar",
+ "language": "Dil",
+ "languages": "Diller",
+ "laptop": "Dizüstü",
+ "last-click": "Son tıklama",
+ "last-days": "Son {x} gün",
+ "last-hours": "Son {x} saat",
+ "last-months": "Son {x} ay",
+ "last-seen": "Son görüldü",
+ "lcp": "LCP",
+ "leave": "Ayrıl",
+ "leave-team": "Takımdan Ayrıl",
+ "less-than": "Küçüktür",
+ "less-than-equals": "Küçük veya eşittir",
+ "link": "Bağlantı",
+ "links": "Bağlantılar",
+ "location": "Konum",
+ "login": "Giriş Yap",
+ "logout": "Çıkış Yap",
+ "manage": "Yönet",
+ "manager": "Yönetici",
+ "mask-level": "Maske seviyesi",
+ "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",
+ "members": "Üyeler",
+ "min": "Min",
+ "minute": "Dakika",
+ "mobile": "Mobil Cihaz",
+ "model": "Model",
+ "month": "Ay",
+ "more": "Detaylı göster",
+ "my-account": "Hesabım",
+ "my-websites": "Web sitelerim",
+ "name": "İsim",
+ "needs-improvement": "İyileştirme gerekiyor",
+ "new-password": "Yeni parola",
+ "none": "Yok",
+ "number-of-records": "{x} {x, plural, one {kayıt} other {kayıt}}",
+ "ok": "TAMAM",
+ "online": "Çevrimiçi",
+ "organic-search": "Organik arama",
+ "organic-shopping": "Organik alışveriş",
+ "organic-social": "Organik sosyal",
+ "organic-video": "Organik video",
+ "os": "İşletim Sistemi",
+ "other": "Diğer",
+ "overview": "Genel bakış",
+ "owner": "Sahibi",
+ "page": "Sayfa",
+ "page-of": "{total} sayfada {current} ",
+ "page-views": "Sayfa görünümü",
+ "pages": "Sayfalar",
+ "pageTitle": "Sayfa başlığı",
+ "paid-ads": "Ücretli reklamlar",
+ "paid-search": "Ücretli arama",
+ "paid-shopping": "Ücretli alışveriş",
+ "paid-social": "Ücretli sosyal",
+ "paid-video": "Ücretli video",
+ "password": "Parola",
+ "path": "Yol",
+ "paths": "Yollar",
+ "performance": "Performans",
+ "pixel": "Piksel",
+ "pixels": "Pikseller",
+ "play": "Oynat",
+ "poor": "Kötü",
+ "powered-by": "Sağlayıcı: {name}",
+ "preferences": "Tercihler",
+ "previous": "Önceki",
+ "previous-period": "Önceki dönem",
+ "previous-year": "Önceki yıl",
+ "profile": "Profil",
+ "profiles": "Profiller",
+ "properties": "Özellikler",
+ "property": "Özellik",
+ "queries": "Sorgular",
+ "query": "Sorgu",
+ "query-parameters": "Sorgu parametreleri",
+ "realtime": "Gerçek Zamanlı",
+ "recorded": "Kaydedildi",
+ "referral": "Yönlendirme",
+ "referrer": "Yönlendiren",
+ "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",
+ "replay": "Tekrar oynatma",
+ "replay-enabled": "Tekrar oynatma etkin",
+ "replay-id": "Replay ID",
+ "replays": "Tekrar oynatmalar",
+ "reports": "Raporlar",
+ "required": "Zorunlu alan",
+ "reset": "Sıfırla",
+ "reset-website": "İstatistikleri sıfırla",
+ "retention": "Geri dönüş",
+ "retention-days": "Saklama günleri",
+ "retention-description": "Kullanıcıların ne sıklıkla geri döndüğünü takip ederek web sitenizin kalıcılığını ölçün.",
+ "revenue": "Gelir",
+ "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-segment": "Segmenti kaydet",
+ "screen": "Ekran",
+ "screens": "Ekranlar",
+ "search": "Ara",
+ "segment": "Segment",
+ "segments": "Segmentler",
+ "select": "Seç",
+ "select-component": "Bileşen seçin",
+ "select-date": "Tarih seç",
+ "select-filter": "Filtre seç",
+ "select-role": "Rol seç",
+ "select-website": "Web sitesi seç",
+ "session": "Oturum",
+ "session-data": "Oturum verisi",
+ "sessions": "Oturumlar",
+ "settings": "Ayarlar",
+ "share": "Paylaş",
+ "share-url": "Paylaşım adresi",
+ "single-day": "Tekil gün",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Kaynak",
+ "sources": "Kaynaklar",
+ "start-step": "Başlangıç adımı",
+ "steps": "Adımlar",
+ "sum": "Toplam",
+ "support": "Destek",
+ "switch-account": "Hesap değiştir",
+ "table": "Tablo",
+ "tablet": "Tablet",
+ "tag": "Etiket",
+ "tags": "Etiketler",
+ "team": "Takım",
+ "team-id": "Takım ID",
+ "team-manager": "Takım yöneticisi",
+ "team-member": "Takım üyesi",
+ "team-name": "Takım ismi",
+ "team-owner": "Takım sahibi",
+ "team-settings": "Takım ayarları",
+ "team-view-only": "Yalnızca ekip görünümü",
+ "team-websites": "Takım web siteleri",
+ "teams": "Takımlar",
+ "term": "Arama terimi",
+ "terms": "Koşullar",
+ "theme": "Tema",
+ "this-month": "Bu ay",
+ "this-week": "Bu hafta",
+ "this-year": "Bu yıl",
+ "timezone": "Zaman dilimi",
+ "title": "Başlık",
+ "today": "Bugün",
+ "toggle-charts": "Grafikleri değiştir",
+ "total": "Toplam",
+ "total-records": "Toplam kayıt",
+ "tracking-code": "İzleme kodu",
+ "traffic": "Trafik",
+ "transactions": "İşlemler",
+ "transfer": "Transfer",
+ "transfer-website": "Transfer web sitesi",
+ "true": "Doğru",
+ "ttfb": "TTFB",
+ "type": "Tip",
+ "unique": "Benzersiz",
+ "unique-events": "Benzersiz etkinlikler",
+ "unique-visitors": "Tekil kullanıcı",
+ "uniqueCustomers": "Benzersiz müşteriler",
+ "unknown": "Bilinmeyen",
+ "untitled": "İsimsiz",
+ "update": "Güncelle",
+ "url": "URL",
+ "user": "Kullanıcı",
+ "username": "Kullanıcı adı",
+ "users": "Kullanıcılar",
+ "utm": "UTM",
+ "utm-campaign": "UTM Kampanya",
+ "utm-content": "UTM İçerik",
+ "utm-description": "Kampanyalarınızı UTM parametreleri aracılığıyla takip edin.",
+ "utm-medium": "UTM Ortam",
+ "utm-source": "UTM Kaynak",
+ "utm-term": "UTM Terim",
+ "value": "Değer",
+ "version": "Sürüm",
+ "view": "Görünüm",
+ "view-details": "Detayı incele",
+ "view-only": "Sadece görünüm",
+ "views": "Görüntüleme",
+ "views-per-visit": "Ziyaret başına görüntüleme",
+ "visit-duration": "Ortalama ziyaret süresi",
+ "visitors": "Ziyaretçi",
+ "visits": "Ziyaretler",
+ "website": "Web sitesi",
+ "website-id": "Web sitesi ID",
+ "websites": "Web siteleri",
+ "window": "Pencere",
+ "yesterday": "Dün"
+ },
+ "message": {
+ "action-confirmation": "Onaylamak için aşağıdaki kutuya {confirmation} yazın.",
+ "active-users": "{x} aktif ziyaretçi",
+ "bad-request": "Geçersiz istek",
+ "collected-data": "Toplanan veriler",
+ "confirm-delete": "{target} kaydını silmek istediğinizden emin misiniz?",
+ "confirm-leave": "{target} kaydından ayrılmak istediğinizden emin misiniz?",
+ "confirm-remove": "{target} kaydını kaldırmak istediğinizden emin misiniz?",
+ "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!",
+ "event-log": "{event} sayfasında {url} ",
+ "forbidden": "Yasaklandı",
+ "go-to-settings": "Ayarlara git",
+ "incorrect-username-password": "Hatalı kullanıcı adı ya da parola.",
+ "invalid-domain": "Geçersiz alan adı",
+ "min-password-length": "Minimum {n} karakter uzunluğu",
+ "new-version-available": "Yeni versiyon Umami {version} mevcut!",
+ "no-data-available": "Henüz hiç veri yok.",
+ "no-event-data": "Hiçbir olay verisi mevcut değil.",
+ "no-match-password": "Parolalar uyuşmuyor",
+ "no-results-found": "Hiçbir sonuç bulunamadı.",
+ "no-team-websites": "Bu takımın herhangi bir web sitesi yok.",
+ "no-teams": "Herhangi bir takım oluşturmadınız.",
+ "no-users": "Kullanıcı yok.",
+ "no-websites-configured": "Henüz hiç web sitesi tanımlamadınız",
+ "not-found": "Bulunamadı",
+ "nothing-selected": "Hiçbir şey seçilmedi.",
+ "page-not-found": "Sayfa bulunamadı.",
+ "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-component-preview": "Önizleme için bir bileşen seçin",
+ "select-website-first": "Önce bir web sitesi seçin",
+ "sever-error": "Sunucu hatası",
+ "share-url": "{target} için kullanılabilir anonim paylaşım adresidir.",
+ "team-already-member": "Zaten bu takımın üyesisiniz",
+ "team-not-found": "Takım bulunamadı",
+ "team-websites-info": "Web siteleri takımdaki herkes tarafından görüntülenebilir.",
+ "tracking-code": "İzleme kodu",
+ "transfer-team-website-to-user": "Bu web sitesi hesbınıza aktarılsın mı?",
+ "transfer-user-website-to-team": "Bu web sitesinin aktarılacağı takımı seçin.",
+ "transfer-website": "Web sitesi sahipliğini hesabınıza veya başka bir takıma aktarın",
+ "triggered-event": "Tetiklenen olay",
+ "unauthorized": "Yetkisiz",
+ "user-deleted": "Kullanıcı silindi.",
+ "viewed-page": "Görüntülenen sayfa",
+ "visitor-log": "Yeni ziyaretçi: {country} , {os} , {device} , {browser} "
+ }
}
diff --git a/public/intl/messages/uk-UA.json b/public/intl/messages/uk-UA.json
index 0f68c8052..9d298a3f3 100644
--- a/public/intl/messages/uk-UA.json
+++ b/public/intl/messages/uk-UA.json
@@ -1,1844 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Код доступу"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Дії"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Журнал"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Додати"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Додати опис"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Додати учасника"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Додати крок"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Додати сайт"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Адміністратор"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "Після"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Всі"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Весь час"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Аналітика"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Середній"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Назад"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "До"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Показник відмов"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Розподіл"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Браузер"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Браузери"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Відмінити"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Змінити пароль"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Міста"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "Місто"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Очистити все"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Підтвердити"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Підтвердити пароль"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Містить"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Продовжити"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Країни"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Країна"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Створити"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Створити звіт"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Створити команду"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Створити користувача"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Створено"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Створено"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Поточний пароль"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Довільний період"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Інформаційна панель"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Дані"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Дата"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Діапазон дат"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "День"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Діапазон дат за замовчуванням"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Видалити"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Видалити звіт"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Видалити команду"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Видалити користувача"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Видалити сайт"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Опис"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Настільний ПК"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Деталі"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Пристрій"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Пристрої"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Відхилити"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Не містить"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Домен"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Відсів"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Редагувати"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Enable share URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Подія"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Дані події"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Події"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Поле"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Поля"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Фільтр"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Об'єднані"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Сирі дані"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Фільтри"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Воронка"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Зрозуміти рівень конверсії та відсіву користувачів."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Більше ніж"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Більше або рівно"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Інсайти"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Зануртеся глибше у свої дані за допомогою сегментів та фільтрів."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Є"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Не є"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Не встановлено"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Встановлено"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Приєднатись"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Приєднатись до команди"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Мова"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Мови"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Ноутбук"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "Останні "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " днів"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "Останні "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " годин"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Останні "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " місяців"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Покинути"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Покинути команду"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Менше ніж"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Менше або дорівнює"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Увійти"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Вийти"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Керувати"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Макс."
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Учасник"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Учасники"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Мін."
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Мобільний"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Більше"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "Мій обліковий запис"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "Мої сайти"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Ім'я"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Новий пароль"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "Нічого"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "ОС"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Огляд"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Власник"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Сторінка "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " з "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Перегляди сторінок"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Заголовок сторінки"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Сторінки"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Пароль"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "На базі "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Профіль"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Запити"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Запит"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Параметри запиту"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "У реальному часі"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Джерело"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Джерела"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Оновити"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Згенерувати знову"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Регіон"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Регіони"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Видалити"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Видалити користувача"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Звіти"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Обов'язкове"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Скинути"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Скинути статистику сайту"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Липкість"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Виміряйте липкість вашого сайту, відстежуючи, як часто користувачі повертаються на нього."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Роль"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Виконати запит"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Зберегти"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Екрани"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Пошук"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Вибрати"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Вибрати дату"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Вибрати роль"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Вибрати сайт"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Сесії"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Налаштування"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Поділитися посилання"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Один день"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Кроки"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Сума"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Планшет"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Команда"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Ідентифікатор команди"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Учасник команди"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Назва команди"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Власник команди"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Тільки для командного перегляду"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Сайти команди"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Команди"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Тема"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Цього місяця"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Цього тижня"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Цього ріку"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Часовий пояс"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Заголовок"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Сьогодні"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Переключити графіки"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Всього"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Всього записів"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Код для відслідковування"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Передати"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Передати сайт"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Тип"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Унікальний"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Унікальні відвідувачі"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Невідомо"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Без заголовку"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Оновлення"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "Користувач"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Ім'я користувача"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Користувачі"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Відстежуйте свої кампанії за допомогою параметрів UTM."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Значення"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "Перегляд"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Переглянути деталі"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "Тільки для перегляду"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Перегляди"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Перегляди за одне відвідування"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Visit duration"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Відвідувачі"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Відвідування"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Сайт"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Ідентифікатор сайту"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Сайти"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Вікно"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Вчора"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Введіть "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " у полі нижче, щоб підтвердити."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " поточних відвідувачів"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Ви впевнені, що бажаєте видалити "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Ви впевнені, що бажаєте покинути "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Ви впевнені, що бажаєте видалити "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Ви впевнені, що бажаєте скинути статистику для "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Видалення команди також призведе до видалення всіх її веб-сайтів."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Усі пов'язані дані будуть видалені також."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Щось пішло не так."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Перейти до налаштувань"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Невірне ім'я користувача або пароль."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Некоректний домен"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Мінімальна довжина "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " символів"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Вийшла нова версія Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": "!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Немає даних."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "Дані про події відсутні."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Паролі не співпадають"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "Не знайдено жодного результату."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "У цієї команди немає жодного веб-сайту."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "Ви не створили жодної команди."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "Немає жодного користувача."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "У вас немає налаштованих сайтів."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Сторінку не знайдено."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "Щоб скинути налаштування цього веб-сайту, введіть "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " у полі нижче для підтвердження."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Вся статистика для цього сайту буде видалена, проте код відслідковування буде продовжувати працювати."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Збережено успішно."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Це публічне посилання для "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "Ви вже є членом команди."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Команду не знайдено."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Веб-сайти може переглядати будь-хто з команди."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Код для відслідковування"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Перенести цей сайт до свого облікового запису?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Виберіть команду, до якої ви хочете передати цей веб-сайт."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Передайте право власності на сайт своєму акаунту або іншій команді."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Подія, що спрацювала"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "Користувача видалено."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Переглянута сторінка"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Відвідувач з "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " використовуючи "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " на "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Користувачі що відсіялись"
- }
- ]
+ "label": {
+ "access-code": "Код доступу",
+ "account": "Обліковий запис",
+ "action": "Дія",
+ "actions": "Дії",
+ "activity": "Журнал",
+ "add": "Додати",
+ "add-board": "Додати дошку",
+ "add-description": "Додати опис",
+ "add-link": "Додати посилання",
+ "add-member": "Додати учасника",
+ "add-pixel": "Додати піксель",
+ "add-step": "Додати крок",
+ "add-website": "Додати сайт",
+ "admin": "Адміністратор",
+ "affiliate": "Партнер",
+ "after": "Після",
+ "all": "Всі",
+ "all-time": "Весь час",
+ "analysis": "Аналіз",
+ "analytics": "Аналітика",
+ "aov": "AOV",
+ "application": "Додаток",
+ "apply": "Застосувати",
+ "arpu": "ARPU",
+ "attribution": "Атрибуція",
+ "attribution-description": "Дивіться, як користувачі взаємодіють з вашим маркетингом і що сприяє конверсіям.",
+ "audience": "Аудиторія",
+ "average": "Середній",
+ "back": "Назад",
+ "before": "До",
+ "behavior": "Поведінка",
+ "block-selector": "Вибір блоку",
+ "boards": "Дошки",
+ "bounce-rate": "Показник відмов",
+ "breakdown": "Розподіл",
+ "browser": "Браузер",
+ "browsers": "Браузери",
+ "campaign": "Кампанія",
+ "campaigns": "Кампанії",
+ "cancel": "Відмінити",
+ "change-password": "Змінити пароль",
+ "channel": "Канал",
+ "channels": "Канали",
+ "chart": "Діаграма",
+ "cities": "Міста",
+ "city": "Місто",
+ "clear-all": "Очистити все",
+ "cls": "CLS",
+ "cohort": "Когорта",
+ "cohorts": "Когорти",
+ "compare": "Порівняти",
+ "compare-dates": "Порівняти дати",
+ "confirm": "Підтвердити",
+ "confirm-password": "Підтвердити пароль",
+ "contains": "Містить",
+ "content": "Вміст",
+ "continue": "Продовжити",
+ "conversion": "Конверсія",
+ "conversion-rate": "Рівень конверсії",
+ "conversion-step": "Крок конверсії",
+ "count": "Кількість",
+ "countries": "Країни",
+ "country": "Країна",
+ "create": "Створити",
+ "create-report": "Створити звіт",
+ "create-team": "Створити команду",
+ "create-user": "Створити користувача",
+ "created": "Створено",
+ "created-by": "Створено",
+ "criteria": "Критерії",
+ "currency": "Валюта",
+ "current": "Поточний",
+ "current-password": "Поточний пароль",
+ "custom-range": "Довільний період",
+ "dashboard": "Інформаційна панель",
+ "data": "Дані",
+ "date": "Дата",
+ "date-range": "Діапазон дат",
+ "day": "День",
+ "default-date-range": "Діапазон дат за замовчуванням",
+ "delete": "Видалити",
+ "delete-report": "Видалити звіт",
+ "delete-team": "Видалити команду",
+ "delete-user": "Видалити користувача",
+ "delete-website": "Видалити сайт",
+ "description": "Опис",
+ "desktop": "Настільний ПК",
+ "destination-url": "URL призначення",
+ "details": "Деталі",
+ "device": "Пристрій",
+ "devices": "Пристрої",
+ "direct": "Прямий",
+ "dismiss": "Відхилити",
+ "distinct-id": "Унікальний ID",
+ "documentation": "Документація",
+ "does-not-contain": "Не містить",
+ "does-not-include": "Не включає",
+ "doest-not-exist": "Не існує",
+ "domain": "Домен",
+ "download": "Завантажити",
+ "dropoff": "Відсів",
+ "duration": "Тривалість",
+ "edit": "Редагувати",
+ "edit-member": "Редагувати учасника",
+ "email": "Електронна пошта",
+ "enable-share-url": "Увімкнути спільне посилання",
+ "end-step": "Кінцевий крок",
+ "entry": "Вхідний URL",
+ "environment": "Середовище",
+ "event": "Подія",
+ "event-data": "Дані події",
+ "event-name": "Назва події",
+ "events": "Події",
+ "exclude-bounce": "Виключити відмови",
+ "exists": "Існує",
+ "exit": "Exit URL",
+ "false": "Хибно",
+ "fcp": "FCP",
+ "field": "Поле",
+ "fields": "Поля",
+ "filter": "Фільтр",
+ "filter-combined": "Об'єднані",
+ "filter-raw": "Сирі дані",
+ "filters": "Фільтри",
+ "first-click": "Перший клік",
+ "first-seen": "Перший візит",
+ "funnel": "Воронка",
+ "funnel-description": "Зрозуміти рівень конверсії та відсіву користувачів.",
+ "funnels": "Воронки",
+ "goal": "Мета",
+ "goals": "Мети",
+ "goals-description": "Відстежуйте свої цілі для переглядів сторінок і подій.",
+ "good": "Добре",
+ "greater-than": "Більше ніж",
+ "greater-than-equals": "Більше або рівно",
+ "grouped": "Груповано",
+ "growth": "Зростання",
+ "hostname": "Ім'я хоста",
+ "hour": "Година",
+ "includes": "Включає",
+ "inp": "INP",
+ "insight": "Інсайт",
+ "insights": "Інсайти",
+ "insights-description": "Зануртеся глибше у свої дані за допомогою сегментів та фільтрів.",
+ "invalid-url": "Недійсний URL",
+ "is": "Є",
+ "is-false": "Хибно",
+ "is-not": "Не є",
+ "is-not-set": "Не встановлено",
+ "is-set": "Встановлено",
+ "is-true": "Правдиво",
+ "join": "Приєднатись",
+ "join-team": "Приєднатись до команди",
+ "journey": "Шлях",
+ "journey-description": "Зрозумійте, як користувачі переміщаються вашим сайтом.",
+ "journeys": "Шляхи",
+ "language": "Мова",
+ "languages": "Мови",
+ "laptop": "Ноутбук",
+ "last-click": "Останній клік",
+ "last-days": "Останні {x} днів",
+ "last-hours": "Останні {x} годин",
+ "last-months": "Останні {x} місяців",
+ "last-seen": "Останній перегляд",
+ "lcp": "LCP",
+ "leave": "Покинути",
+ "leave-team": "Покинути команду",
+ "less-than": "Менше ніж",
+ "less-than-equals": "Менше або дорівнює",
+ "link": "Посилання",
+ "links": "Посилання",
+ "location": "Місцезнаходження",
+ "login": "Увійти",
+ "logout": "Вийти",
+ "manage": "Керувати",
+ "manager": "Менеджер",
+ "mask-level": "Рівень маскування",
+ "match": "Відповідність",
+ "match-all": "Усі",
+ "match-any": "Будь-який",
+ "max": "Макс.",
+ "max-duration": "Максимальна тривалість",
+ "maximize": "Розгорнути",
+ "medium": "Середній",
+ "member": "Учасник",
+ "members": "Учасники",
+ "min": "Мін.",
+ "minute": "Хвилина",
+ "mobile": "Мобільний",
+ "model": "Модель",
+ "month": "Місяць",
+ "more": "Більше",
+ "my-account": "Мій обліковий запис",
+ "my-websites": "Мої сайти",
+ "name": "Ім'я",
+ "needs-improvement": "Потребує покращення",
+ "new-password": "Новий пароль",
+ "none": "Нічого",
+ "number-of-records": "{x} {x, plural, one {запис} few {записи} other {записів}}",
+ "ok": "ОК",
+ "online": "Онлайн",
+ "organic-search": "Органічний пошук",
+ "organic-shopping": "Органічні покупки",
+ "organic-social": "Органічні соцмережі",
+ "organic-video": "Органічне відео",
+ "os": "ОС",
+ "other": "Інше",
+ "overview": "Огляд",
+ "owner": "Власник",
+ "page": "Сторінка",
+ "page-of": "Сторінка {current} з {total}",
+ "page-views": "Перегляди сторінок",
+ "pages": "Сторінки",
+ "pageTitle": "Заголовок сторінки",
+ "paid-ads": "Платна реклама",
+ "paid-search": "Платний пошук",
+ "paid-shopping": "Платні покупки",
+ "paid-social": "Платні соцмережі",
+ "paid-video": "Платне відео",
+ "password": "Пароль",
+ "path": "Шлях",
+ "paths": "Шляхи",
+ "performance": "Продуктивність",
+ "pixel": "Піксель",
+ "pixels": "Пікселі",
+ "play": "Відтворити",
+ "poor": "Погано",
+ "powered-by": "На базі {name}",
+ "preferences": "Налаштування",
+ "previous": "Попередній",
+ "previous-period": "Попередній період",
+ "previous-year": "Попередній рік",
+ "profile": "Профіль",
+ "profiles": "Профілі",
+ "properties": "Властивості",
+ "property": "Властивість",
+ "queries": "Запити",
+ "query": "Запит",
+ "query-parameters": "Параметри запиту",
+ "realtime": "У реальному часі",
+ "recorded": "Записано о",
+ "referral": "Реферал",
+ "referrer": "Джерело",
+ "referrers": "Джерела",
+ "refresh": "Оновити",
+ "regenerate": "Згенерувати знову",
+ "regex-match": "Відповідає регулярному виразу",
+ "regex-not-match": "Не відповідає регулярному виразу",
+ "region": "Регіон",
+ "regions": "Регіони",
+ "remaining": "Залишилось",
+ "remove": "Видалити",
+ "remove-member": "Видалити користувача",
+ "replay": "Відтворення",
+ "replay-enabled": "Відтворення увімкнено",
+ "replay-id": "Replay ID",
+ "replays": "Відтворення",
+ "reports": "Звіти",
+ "required": "Обов'язкове",
+ "reset": "Скинути",
+ "reset-website": "Скинути статистику сайту",
+ "retention": "Липкість",
+ "retention-days": "Дні зберігання",
+ "retention-description": "Виміряйте липкість вашого сайту, відстежуючи, як часто користувачі повертаються на нього.",
+ "revenue": "Дохід",
+ "revenue-description": "Перегляньте свій дохід за певний період.",
+ "role": "Роль",
+ "run-query": "Виконати запит",
+ "sample-rate": "Частота вибірки",
+ "sample-size": "Розмір вибірки",
+ "save": "Зберегти",
+ "save-cohort": "Зберегти когорту",
+ "save-segment": "Зберегти сегмент",
+ "screen": "Екран",
+ "screens": "Екрани",
+ "search": "Пошук",
+ "segment": "Сегмент",
+ "segments": "Сегменти",
+ "select": "Вибрати",
+ "select-component": "Виберіть компонент",
+ "select-date": "Вибрати дату",
+ "select-filter": "Вибрати фільтр",
+ "select-role": "Вибрати роль",
+ "select-website": "Вибрати сайт",
+ "session": "Сесія",
+ "session-data": "Дані сесії",
+ "sessions": "Сесії",
+ "settings": "Налаштування",
+ "share": "Поділитися",
+ "share-url": "Поділитися посилання",
+ "single-day": "Один день",
+ "slug": "Slug",
+ "sms": "СМС",
+ "source": "Джерело",
+ "sources": "Джерела",
+ "start-step": "Початковий крок",
+ "steps": "Кроки",
+ "sum": "Сума",
+ "support": "Підтримка",
+ "switch-account": "Змінити обліковий запис",
+ "table": "Таблиця",
+ "tablet": "Планшет",
+ "tag": "Тег",
+ "tags": "Теги",
+ "team": "Команда",
+ "team-id": "Ідентифікатор команди",
+ "team-manager": "Менеджер команди",
+ "team-member": "Учасник команди",
+ "team-name": "Назва команди",
+ "team-owner": "Власник команди",
+ "team-settings": "Налаштування команди",
+ "team-view-only": "Тільки для командного перегляду",
+ "team-websites": "Сайти команди",
+ "teams": "Команди",
+ "term": "Пошуковий запит",
+ "terms": "Умови",
+ "theme": "Тема",
+ "this-month": "Цього місяця",
+ "this-week": "Цього тижня",
+ "this-year": "Цього ріку",
+ "timezone": "Часовий пояс",
+ "title": "Заголовок",
+ "today": "Сьогодні",
+ "toggle-charts": "Переключити графіки",
+ "total": "Всього",
+ "total-records": "Всього записів",
+ "tracking-code": "Код для відслідковування",
+ "traffic": "Трафік",
+ "transactions": "Транзакції",
+ "transfer": "Передати",
+ "transfer-website": "Передати сайт",
+ "true": "Істинно",
+ "ttfb": "TTFB",
+ "type": "Тип",
+ "unique": "Унікальний",
+ "unique-events": "Унікальні події",
+ "unique-visitors": "Унікальні відвідувачі",
+ "uniqueCustomers": "Унікальні клієнти",
+ "unknown": "Невідомо",
+ "untitled": "Без заголовку",
+ "update": "Оновлення",
+ "url": "URL",
+ "user": "Користувач",
+ "username": "Ім'я користувача",
+ "users": "Користувачі",
+ "utm": "UTM",
+ "utm-campaign": "UTM-кампанія",
+ "utm-content": "UTM-контент",
+ "utm-description": "Відстежуйте свої кампанії за допомогою параметрів UTM.",
+ "utm-medium": "UTM-канал",
+ "utm-source": "UTM-джерело",
+ "utm-term": "UTM-запит",
+ "value": "Значення",
+ "version": "Версія",
+ "view": "Перегляд",
+ "view-details": "Переглянути деталі",
+ "view-only": "Тільки для перегляду",
+ "views": "Перегляди",
+ "views-per-visit": "Перегляди за одне відвідування",
+ "visit-duration": "Тривалість візиту",
+ "visitors": "Відвідувачі",
+ "visits": "Відвідування",
+ "website": "Сайт",
+ "website-id": "Ідентифікатор сайту",
+ "websites": "Сайти",
+ "window": "Вікно",
+ "yesterday": "Вчора"
+ },
+ "message": {
+ "action-confirmation": "Введіть {confirmation} у полі нижче, щоб підтвердити.",
+ "active-users": "{x} поточних відвідувачів",
+ "bad-request": "Невірний запит",
+ "collected-data": "Зібрані дані",
+ "confirm-delete": "Ви впевнені, що бажаєте видалити {target}?",
+ "confirm-leave": "Ви впевнені, що бажаєте покинути {target} ?",
+ "confirm-remove": "Ви впевнені, що бажаєте видалити {target} ?",
+ "confirm-reset": "Ви впевнені, що бажаєте скинути статистику для {target}?",
+ "delete-team-warning": "Видалення команди також призведе до видалення всіх її веб-сайтів.",
+ "delete-website-warning": "Усі пов'язані дані будуть видалені також.",
+ "empty-dashboard": "Ваша панель інструментів порожня. Натисніть Редагувати, щоб додати перший компонент.",
+ "error": "Щось пішло не так.",
+ "event-log": "{event} на {url} ",
+ "forbidden": "Доступ заборонено",
+ "go-to-settings": "Перейти до налаштувань",
+ "incorrect-username-password": "Невірне ім'я користувача або пароль.",
+ "invalid-domain": "Некоректний домен",
+ "min-password-length": "Мінімальна довжина {n} символів",
+ "new-version-available": "Вийшла нова версія Umami {version}!",
+ "no-data-available": "Немає даних.",
+ "no-event-data": "Дані про події відсутні.",
+ "no-match-password": "Паролі не співпадають",
+ "no-results-found": "Не знайдено жодного результату.",
+ "no-team-websites": "У цієї команди немає жодного веб-сайту.",
+ "no-teams": "Ви не створили жодної команди.",
+ "no-users": "Немає жодного користувача.",
+ "no-websites-configured": "У вас немає налаштованих сайтів.",
+ "not-found": "Не знайдено",
+ "nothing-selected": "Нічого не вибрано.",
+ "page-not-found": "Сторінку не знайдено.",
+ "reset-website": "Щоб скинути налаштування цього веб-сайту, введіть {confirmation} у полі нижче для підтвердження.",
+ "reset-website-warning": "Вся статистика для цього сайту буде видалена, проте код відслідковування буде продовжувати працювати.",
+ "saved": "Збережено успішно.",
+ "select-component-preview": "Виберіть компонент для попереднього перегляду",
+ "select-website-first": "Спочатку виберіть веб-сайт",
+ "sever-error": "Помилка сервера",
+ "share-url": "Це публічне посилання для {target}.",
+ "team-already-member": "Ви вже є членом команди.",
+ "team-not-found": "Команду не знайдено.",
+ "team-websites-info": "Веб-сайти може переглядати будь-хто з команди.",
+ "tracking-code": "Код для відслідковування",
+ "transfer-team-website-to-user": "Перенести цей сайт до свого облікового запису?",
+ "transfer-user-website-to-team": "Виберіть команду, до якої ви хочете передати цей веб-сайт.",
+ "transfer-website": "Передайте право власності на сайт своєму акаунту або іншій команді.",
+ "triggered-event": "Подія, що спрацювала",
+ "unauthorized": "Не авторизовано",
+ "user-deleted": "Користувача видалено.",
+ "viewed-page": "Переглянута сторінка",
+ "visitor-log": "Відвідувач з {country} використовуючи {browser} на {os} {device} "
+ }
}
diff --git a/public/intl/messages/ur-PK.json b/public/intl/messages/ur-PK.json
index 2652fcfa2..016af6ee0 100644
--- a/public/intl/messages/ur-PK.json
+++ b/public/intl/messages/ur-PK.json
@@ -1,1868 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "اعمال"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "ویب سائٹ کا اضافہ کریں"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "منتظم"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "تمام"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "تمام وقت"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "پیچھے"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "اچھال کی شرح"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "براؤزرز"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "منسوخ"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "پاس ورڈ تبدیل کریں"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "پاس ورڈ کی تصدیق کریں"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "ممالک"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "موجودہ پاس ورڈ"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "اپنی مرضی کی حد"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "ڈیش بورڈ"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "تاریخ کی حد"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "پہلے سے طے شدہ تاریخ کی حد"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "حذف کریں"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "ویب سائٹ مٹایں"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "ڈیسک ٹاپ"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "آلات"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "مسترد کریں"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "ڈومین"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "ترمیم"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "شیئر یو آر ایل کو فعال کریں"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "واقعات"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "مشترکہ"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "خام"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "زبانیں"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "لیپ ٹاپ"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "پچھلے "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " دن"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "پچھلے "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " گھنٹے"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "لاگ ان"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "لاگ آوٹ"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "موبائل"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "مزید"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "نام"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "نیا پاس ورڈ"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "مالک"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "صفحہ کے نظارے"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "صفحات"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "پاس ورڈ"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "تقویت یافتہ بذریعہ "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "پروفائل"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "براہ راست"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "بھیجنے والے"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "تازہ دم کریں"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "درکار ہے"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "دوبارہ ترتیب دیں"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "اعدادوشمار کو دوبارہ ترتیب دیں"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "محفوظ کریں"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "ترتیبات"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "URL کا اشتراک کریں"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "ایک دن"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "ٹیبلیٹ"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Theme"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "اس مہینے"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "اس ہفتے"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "اس سال"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "ٹائم زون"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "آج"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "چارٹ تبدیل کریں"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "ٹریکنگ کوڈ"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "منفرد زائرین"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "نامعلوم"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "صارف نام"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "تفصیلات دیکھیں"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "مناظر"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "وزٹ کا اوسط وقت"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "زائرین"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "ویب سائٹس"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " موجودہ "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "زائر"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "زائرین"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "کیا آپ واقعی "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " کو حذف کرنا چاہتے ہیں؟"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "کیا آپ واقعی "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " کے اعدادوشمار کو دوبارہ ترتیب دینا چاہتے ہیں؟"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "تمام متعلقہ ڈیٹا بھی حذف کر دیا جائے گا۔"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "کچھ غلط ہو گیا."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "ترتیبات پر جائیں"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "غلط صارف نام/پاس ورڈ۔"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "غلط ڈومین"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "مواد موجود نہیں ہے."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "پاس ورڈز مماثل نہیں ہیں"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "آپ کے پاس کوئی ویب سائٹ کنفیگر نہیں ہے۔"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "صفحہ نہیں ملا."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "اس ویب سائٹ کے تمام اعدادوشمار کو حذف کر دیا جائے گا، لیکن آپ کا ٹریکنگ کوڈ برقرار رہے گا۔"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "کامیابی سے محفوظ ہو گیا۔"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "یہ "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " کے لیے عوامی طور پر اشتراک کردہ URL ہے۔"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "ٹریکنگ کوڈ"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " پر "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " کا استعمال کرتے ہوئے "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " سے آنے والا"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "رسائی کوڈ",
+ "account": "اکاؤنٹ",
+ "action": "عمل",
+ "actions": "اعمال",
+ "activity": "Activity log",
+ "add": "شامل کریں",
+ "add-board": "بورڈ شامل کریں",
+ "add-description": "تفصیل شامل کریں",
+ "add-link": "لنک شامل کریں",
+ "add-member": "رکن شامل کریں",
+ "add-pixel": "پکسل شامل کریں",
+ "add-step": "مرحلہ شامل کریں",
+ "add-website": "ویب سائٹ کا اضافہ کریں",
+ "admin": "منتظم",
+ "affiliate": "ملحقہ",
+ "after": "بعد",
+ "all": "تمام",
+ "all-time": "تمام وقت",
+ "analysis": "تجزیہ",
+ "analytics": "تجزیات",
+ "aov": "AOV",
+ "application": "ایپلیکیشن",
+ "apply": "لاگو کریں",
+ "arpu": "ARPU",
+ "attribution": "انتساب",
+ "attribution-description": "دیکھیں کہ صارفین آپ کی مارکیٹنگ کے ساتھ کیسے جڑتے ہیں اور تبدیلیوں کی وجہ کیا ہے۔",
+ "audience": "سامعین",
+ "average": "اوسط",
+ "back": "پیچھے",
+ "before": "پہلے",
+ "behavior": "رویے",
+ "block-selector": "بلاک منتخب کنندہ",
+ "boards": "بورڈز",
+ "bounce-rate": "اچھال کی شرح",
+ "breakdown": "تفصیلی تجزیہ",
+ "browser": "براؤزر",
+ "browsers": "براؤزرز",
+ "campaign": "مہم",
+ "campaigns": "مہمات",
+ "cancel": "منسوخ",
+ "change-password": "پاس ورڈ تبدیل کریں",
+ "channel": "چینل",
+ "channels": "چینلز",
+ "chart": "چارٹ",
+ "cities": "شہر",
+ "city": "شہر",
+ "clear-all": "سب صاف کریں",
+ "cls": "CLS",
+ "cohort": "کوہارٹ",
+ "cohorts": "کوہارٹس",
+ "compare": "موازنہ کریں",
+ "compare-dates": "تاریخوں کا موازنہ",
+ "confirm": "تصدیق کریں",
+ "confirm-password": "پاس ورڈ کی تصدیق کریں",
+ "contains": "شامل ہے",
+ "content": "مواد",
+ "continue": "جاری رکھیں",
+ "conversion": "تبدیلی",
+ "conversion-rate": "تبدیلی کی شرح",
+ "conversion-step": "تبدیلی کا مرحلہ",
+ "count": "شمار",
+ "countries": "ممالک",
+ "country": "ملک",
+ "create": "بنائیں",
+ "create-report": "رپورٹ بنائیں",
+ "create-team": "ٹیم بنائیں",
+ "create-user": "صارف بنائیں",
+ "created": "بنایا گیا",
+ "created-by": "بنانے والا",
+ "criteria": "معیار",
+ "currency": "کرنسی",
+ "current": "موجودہ",
+ "current-password": "موجودہ پاس ورڈ",
+ "custom-range": "اپنی مرضی کی حد",
+ "dashboard": "ڈیش بورڈ",
+ "data": "ڈیٹا",
+ "date": "تاریخ",
+ "date-range": "تاریخ کی حد",
+ "day": "دن",
+ "default-date-range": "پہلے سے طے شدہ تاریخ کی حد",
+ "delete": "حذف کریں",
+ "delete-report": "رپورٹ حذف کریں",
+ "delete-team": "ٹیم حذف کریں",
+ "delete-user": "صارف حذف کریں",
+ "delete-website": "ویب سائٹ مٹایں",
+ "description": "تفصیل",
+ "desktop": "ڈیسک ٹاپ",
+ "destination-url": "منزل URL",
+ "details": "تفصیلات",
+ "device": "آلہ",
+ "devices": "آلات",
+ "direct": "براہ راست",
+ "dismiss": "مسترد کریں",
+ "distinct-id": "منفرد ID",
+ "documentation": "دستاویزات",
+ "does-not-contain": "شامل نہیں ہے",
+ "does-not-include": "مشتمل نہیں ہے",
+ "doest-not-exist": "موجود نہیں ہے",
+ "domain": "ڈومین",
+ "download": "ڈاؤن لوڈ",
+ "dropoff": "ڈراپ آف",
+ "duration": "مدت",
+ "edit": "ترمیم",
+ "edit-member": "رکن میں ترمیم",
+ "email": "ای میل",
+ "enable-share-url": "شیئر یو آر ایل کو فعال کریں",
+ "end-step": "آخری مرحلہ",
+ "entry": "Entry URL",
+ "environment": "ماحول",
+ "event": "واقعہ",
+ "event-data": "واقعہ ڈیٹا",
+ "event-name": "واقعہ کا نام",
+ "events": "واقعات",
+ "exclude-bounce": "اچھال خارج کریں",
+ "exists": "موجود ہے",
+ "exit": "Exit URL",
+ "false": "غلط",
+ "fcp": "FCP",
+ "field": "فیلڈ",
+ "fields": "فیلڈز",
+ "filter": "فلٹر",
+ "filter-combined": "مشترکہ",
+ "filter-raw": "خام",
+ "filters": "فلٹرز",
+ "first-click": "پہلا کلک",
+ "first-seen": "پہلی بار دیکھا گیا",
+ "funnel": "فنل",
+ "funnel-description": "صارفین کی تبدیلی اور ڈراپ آف شرح کو سمجھیں۔",
+ "funnels": "فنلز",
+ "goal": "ہدف",
+ "goals": "اہداف",
+ "goals-description": "صفحہ کے نظاروں اور واقعات کے لیے اپنے اہداف کی نگرانی کریں۔",
+ "good": "اچھا",
+ "greater-than": "سے زیادہ",
+ "greater-than-equals": "سے زیادہ یا مساوی",
+ "grouped": "گروپ شدہ",
+ "growth": "نمو",
+ "hostname": "ہوسٹ نام",
+ "hour": "گھنٹہ",
+ "includes": "مشتمل ہے",
+ "inp": "INP",
+ "insight": "بصیرت",
+ "insights": "بصیرتیں",
+ "insights-description": "سیگمنٹس اور فلٹرز استعمال کرکے اپنے ڈیٹا میں گہرائی سے جائیں۔",
+ "invalid-url": "غلط URL",
+ "is": "ہے",
+ "is-false": "غلط ہے",
+ "is-not": "نہیں ہے",
+ "is-not-set": "سیٹ نہیں ہے",
+ "is-set": "سیٹ ہے",
+ "is-true": "درست ہے",
+ "join": "شامل ہوں",
+ "join-team": "ٹیم میں شامل ہوں",
+ "journey": "سفر",
+ "journey-description": "سمجھیں کہ صارفین آپ کی ویب سائٹ پر کیسے تشریف لے جاتے ہیں۔",
+ "journeys": "سفر",
+ "language": "زبان",
+ "languages": "زبانیں",
+ "laptop": "لیپ ٹاپ",
+ "last-click": "آخری کلک",
+ "last-days": "پچھلے {x} دن",
+ "last-hours": "پچھلے {x} گھنٹے",
+ "last-months": "پچھلے {x} مہینے",
+ "last-seen": "آخری بار دیکھا گیا",
+ "lcp": "LCP",
+ "leave": "چھوڑیں",
+ "leave-team": "ٹیم چھوڑیں",
+ "less-than": "سے کم",
+ "less-than-equals": "سے کم یا مساوی",
+ "link": "لنک",
+ "links": "لنکس",
+ "location": "مقام",
+ "login": "لاگ ان",
+ "logout": "لاگ آوٹ",
+ "manage": "انتظام کریں",
+ "manager": "منتظم",
+ "mask-level": "ماسک کی سطح",
+ "match": "مطابقت",
+ "match-all": "سب",
+ "match-any": "کوئی بھی",
+ "max": "زیادہ سے زیادہ",
+ "max-duration": "زیادہ سے زیادہ مدت",
+ "maximize": "Expand",
+ "medium": "میڈیم",
+ "member": "رکن",
+ "members": "اراکین",
+ "min": "کم سے کم",
+ "minute": "منٹ",
+ "mobile": "موبائل",
+ "model": "ماڈل",
+ "month": "مہینہ",
+ "more": "مزید",
+ "my-account": "میرا اکاؤنٹ",
+ "my-websites": "میری ویب سائٹس",
+ "name": "نام",
+ "needs-improvement": "بہتری کی ضرورت ہے",
+ "new-password": "نیا پاس ورڈ",
+ "none": "کوئی نہیں",
+ "number-of-records": "{x} {x, plural, one {ریکارڈ} other {ریکارڈز}}",
+ "ok": "OK",
+ "online": "آن لائن",
+ "organic-search": "نامیاتی تلاش",
+ "organic-shopping": "نامیاتی خریداری",
+ "organic-social": "نامیاتی سوشل",
+ "organic-video": "نامیاتی ویڈیو",
+ "os": "OS",
+ "other": "دیگر",
+ "overview": "جائزہ",
+ "owner": "مالک",
+ "page": "صفحہ",
+ "page-of": "صفحہ {current} از {total}",
+ "page-views": "صفحہ کے نظارے",
+ "pages": "صفحات",
+ "pageTitle": "صفحہ کا عنوان",
+ "paid-ads": "ادا شدہ اشتہارات",
+ "paid-search": "ادا شدہ تلاش",
+ "paid-shopping": "ادا شدہ خریداری",
+ "paid-social": "ادا شدہ سوشل",
+ "paid-video": "ادا شدہ ویڈیو",
+ "password": "پاس ورڈ",
+ "path": "راستہ",
+ "paths": "راستے",
+ "performance": "کارکردگی",
+ "pixel": "پکسل",
+ "pixels": "پکسلز",
+ "play": "چلائیں",
+ "poor": "خراب",
+ "powered-by": "تقویت یافتہ بذریعہ {name}",
+ "preferences": "ترجیحات",
+ "previous": "پچھلا",
+ "previous-period": "پچھلا عرصہ",
+ "previous-year": "پچھلا سال",
+ "profile": "پروفائل",
+ "profiles": "پروفائلز",
+ "properties": "خصوصیات",
+ "property": "خصوصیت",
+ "queries": "استفسارات",
+ "query": "استفسار",
+ "query-parameters": "استفسار پیرامیٹرز",
+ "realtime": "براہ راست",
+ "recorded": "ریکارڈ کیا گیا",
+ "referral": "حوالہ",
+ "referrer": "حوالہ دہندہ",
+ "referrers": "بھیجنے والے",
+ "refresh": "تازہ دم کریں",
+ "regenerate": "دوبارہ بنائیں",
+ "regex-match": "ریجیکس سے مطابقت رکھتا ہے",
+ "regex-not-match": "ریجیکس سے مطابقت نہیں رکھتا",
+ "region": "علاقہ",
+ "regions": "علاقے",
+ "remaining": "باقی",
+ "remove": "ہٹائیں",
+ "remove-member": "رکن ہٹائیں",
+ "replay": "دوبارہ چلائیں",
+ "replay-enabled": "دوبارہ چلانا فعال",
+ "replay-id": "Replay ID",
+ "replays": "دوبارہ چلانے",
+ "reports": "رپورٹیں",
+ "required": "درکار ہے",
+ "reset": "دوبارہ ترتیب دیں",
+ "reset-website": "اعدادوشمار کو دوبارہ ترتیب دیں",
+ "retention": "برقراری",
+ "retention-days": "برقراری کے دن",
+ "retention-description": "یہ جانچیں کہ صارفین کتنی بار واپس آتے ہیں اور آپ کی ویب سائٹ کتنی پرکشش ہے۔",
+ "revenue": "آمدنی",
+ "revenue-description": "Look into your revenue across time.",
+ "role": "کردار",
+ "run-query": "استفسار چلائیں",
+ "sample-rate": "نمونہ کی شرح",
+ "sample-size": "نمونے کا حجم",
+ "save": "محفوظ کریں",
+ "save-cohort": "کوہارٹ محفوظ کریں",
+ "save-segment": "سیگمنٹ محفوظ کریں",
+ "screen": "اسکرین",
+ "screens": "اسکرینز",
+ "search": "تلاش",
+ "segment": "سیگمنٹ",
+ "segments": "سیگمنٹس",
+ "select": "منتخب کریں",
+ "select-component": "اجزاء منتخب کریں",
+ "select-date": "تاریخ منتخب کریں",
+ "select-filter": "فلٹر منتخب کریں",
+ "select-role": "کردار منتخب کریں",
+ "select-website": "ویب سائٹ منتخب کریں",
+ "session": "سیشن",
+ "session-data": "سیشن ڈیٹا",
+ "sessions": "سیشنز",
+ "settings": "ترتیبات",
+ "share": "شیئر کریں",
+ "share-url": "URL کا اشتراک کریں",
+ "single-day": "ایک دن",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "ذریعہ",
+ "sources": "ذرائع",
+ "start-step": "شروعاتی مرحلہ",
+ "steps": "مراحل",
+ "sum": "کل",
+ "support": "معاونت",
+ "switch-account": "اکاؤنٹ تبدیل کریں",
+ "table": "ٹیبل",
+ "tablet": "ٹیبلیٹ",
+ "tag": "ٹیگ",
+ "tags": "ٹیگز",
+ "team": "ٹیم",
+ "team-id": "Team ID",
+ "team-manager": "ٹیم منتظم",
+ "team-member": "ٹیم رکن",
+ "team-name": "ٹیم کا نام",
+ "team-owner": "ٹیم مالک",
+ "team-settings": "ٹیم ترتیبات",
+ "team-view-only": "ٹیم صرف دیکھنے کے لیے",
+ "team-websites": "ٹیم ویب سائٹس",
+ "teams": "ٹیمیں",
+ "term": "اصطلاح",
+ "terms": "شرائط",
+ "theme": "تھیم",
+ "this-month": "اس مہینے",
+ "this-week": "اس ہفتے",
+ "this-year": "اس سال",
+ "timezone": "ٹائم زون",
+ "title": "عنوان",
+ "today": "آج",
+ "toggle-charts": "چارٹ تبدیل کریں",
+ "total": "کل",
+ "total-records": "کل ریکارڈز",
+ "tracking-code": "ٹریکنگ کوڈ",
+ "traffic": "ٹریفک",
+ "transactions": "لین دین",
+ "transfer": "منتقلی",
+ "transfer-website": "ویب سائٹ منتقل کریں",
+ "true": "درست",
+ "ttfb": "TTFB",
+ "type": "قسم",
+ "unique": "منفرد",
+ "unique-events": "منفرد واقعات",
+ "unique-visitors": "منفرد زائرین",
+ "uniqueCustomers": "منفرد گاہک",
+ "unknown": "نامعلوم",
+ "untitled": "بے عنوان",
+ "update": "اپ ڈیٹ",
+ "url": "URL",
+ "user": "صارف",
+ "username": "صارف نام",
+ "users": "صارفین",
+ "utm": "UTM",
+ "utm-campaign": "UTM Campaign",
+ "utm-content": "UTM Content",
+ "utm-description": "UTM پیرامیٹرز کے ذریعے اپنی مہمات کی نگرانی کریں۔",
+ "utm-medium": "UTM Medium",
+ "utm-source": "UTM Source",
+ "utm-term": "UTM Term",
+ "value": "قدر",
+ "version": "ورژن",
+ "view": "دیکھیں",
+ "view-details": "تفصیلات دیکھیں",
+ "view-only": "صرف دیکھیں",
+ "views": "مناظر",
+ "views-per-visit": "فی وزٹ نظارے",
+ "visit-duration": "وزٹ کا اوسط وقت",
+ "visitors": "زائرین",
+ "visits": "وزٹس",
+ "website": "ویب سائٹ",
+ "website-id": "Website ID",
+ "websites": "ویب سائٹس",
+ "window": "ونڈو",
+ "yesterday": "کل"
+ },
+ "message": {
+ "action-confirmation": "تصدیق کے لیے نیچے دیے گئے خانے میں {confirmation} ٹائپ کریں۔",
+ "active-users": "{x} موجودہ {x, plural, one {زائر} other {زائرین}}",
+ "bad-request": "غلط درخواست",
+ "collected-data": "جمع شدہ ڈیٹا",
+ "confirm-delete": "کیا آپ واقعی {target} کو حذف کرنا چاہتے ہیں؟",
+ "confirm-leave": "کیا آپ واقعی {target} چھوڑنا چاہتے ہیں؟",
+ "confirm-remove": "کیا آپ واقعی {target} کو ہٹانا چاہتے ہیں؟",
+ "confirm-reset": "کیا آپ واقعی {target} کے اعدادوشمار کو دوبارہ ترتیب دینا چاہتے ہیں؟",
+ "delete-team-warning": "ٹیم حذف کرنے سے ٹیم کی تمام ویب سائٹس بھی حذف ہو جائیں گی۔",
+ "delete-website-warning": "تمام متعلقہ ڈیٹا بھی حذف کر دیا جائے گا۔",
+ "empty-dashboard": "آپ کا ڈیش بورڈ خالی ہے۔ اپنا پہلا جزو شامل کرنے کے لیے ترمیم پر کلک کریں۔",
+ "error": "کچھ غلط ہو گیا.",
+ "event-log": "{url} پر {event} ",
+ "forbidden": "ممنوع",
+ "go-to-settings": "ترتیبات پر جائیں",
+ "incorrect-username-password": "غلط صارف نام/پاس ورڈ۔",
+ "invalid-domain": "غلط ڈومین",
+ "min-password-length": "کم از کم {n} حروف کی لمبائی",
+ "new-version-available": "Umami کا نیا ورژن {version} دستیاب ہے!",
+ "no-data-available": "مواد موجود نہیں ہے.",
+ "no-event-data": "واقعہ کا کوئی ڈیٹا دستیاب نہیں ہے۔",
+ "no-match-password": "پاس ورڈز مماثل نہیں ہیں",
+ "no-results-found": "No results were found.",
+ "no-team-websites": "اس ٹیم کے پاس کوئی ویب سائٹ نہیں ہے۔",
+ "no-teams": "آپ نے ابھی تک کوئی ٹیم نہیں بنائی۔",
+ "no-users": "کوئی صارف نہیں ہے۔",
+ "no-websites-configured": "آپ کے پاس کوئی ویب سائٹ کنفیگر نہیں ہے۔",
+ "not-found": "نہیں ملا",
+ "nothing-selected": "کچھ بھی منتخب نہیں کیا گیا۔",
+ "page-not-found": "صفحہ نہیں ملا.",
+ "reset-website": "اس ویب سائٹ کو دوبارہ ترتیب دینے کے لیے تصدیق کے خانے میں {confirmation} ٹائپ کریں۔",
+ "reset-website-warning": "اس ویب سائٹ کے تمام اعدادوشمار کو حذف کر دیا جائے گا، لیکن آپ کا ٹریکنگ کوڈ برقرار رہے گا۔",
+ "saved": "کامیابی سے محفوظ ہو گیا۔",
+ "select-component-preview": "پیش نظارہ کے لیے ایک جزو منتخب کریں",
+ "select-website-first": "پہلے ایک ویب سائٹ منتخب کریں",
+ "sever-error": "سرور کی خرابی",
+ "share-url": "یہ {target} کے لیے عوامی طور پر اشتراک کردہ URL ہے۔",
+ "team-already-member": "آپ پہلے سے اس ٹیم کے رکن ہیں۔",
+ "team-not-found": "ٹیم نہیں ملی۔",
+ "team-websites-info": "ویب سائٹس ٹیم کا کوئی بھی رکن دیکھ سکتا ہے۔",
+ "tracking-code": "ٹریکنگ کوڈ",
+ "transfer-team-website-to-user": "اس ویب سائٹ کو اپنے اکاؤنٹ میں منتقل کریں؟",
+ "transfer-user-website-to-team": "اس ویب سائٹ کو منتقل کرنے کے لیے ٹیم منتخب کریں۔",
+ "transfer-website": "ویب سائٹ کی ملکیت اپنے اکاؤنٹ یا کسی اور ٹیم کو منتقل کریں۔",
+ "triggered-event": "متحرک واقعہ",
+ "unauthorized": "غیر مجاز",
+ "user-deleted": "صارف حذف ہو گیا۔",
+ "viewed-page": "دیکھا گیا صفحہ",
+ "visitor-log": "{os} {device} پر {browser} کا استعمال کرتے ہوئے {country} سے آنے والا"
+ }
}
diff --git a/public/intl/messages/uz-UZ.json b/public/intl/messages/uz-UZ.json
new file mode 100644
index 000000000..2a1d7479a
--- /dev/null
+++ b/public/intl/messages/uz-UZ.json
@@ -0,0 +1,428 @@
+{
+ "label": {
+ "access-code": "Kirish kodi",
+ "account": "Hisob",
+ "action": "Harakat",
+ "actions": "Amallar",
+ "activity": "Faoliyat",
+ "add": "Qoʻshish",
+ "add-board": "Taxta qoʻshish",
+ "add-description": "Tavsif qoʻshish",
+ "add-link": "Havola qo'shish",
+ "add-member": "A'zo qoʻshish",
+ "add-pixel": "Piksel qo'shish",
+ "add-step": "Qadam qoʻshish",
+ "add-website": "Veb-sayt qoʻshish",
+ "admin": "Administrator",
+ "affiliate": "Sherik",
+ "after": "Keyin",
+ "all": "Barchasi",
+ "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",
+ "average": "Oʻrtacha",
+ "back": "Orqaga",
+ "before": "Oldin",
+ "behavior": "Xulq-atvor",
+ "block-selector": "Blok tanlash",
+ "boards": "Taxtalar",
+ "bounce-rate": "Chiqib ketish darajasi",
+ "breakdown": "Tahlil",
+ "browser": "Brauzer",
+ "browsers": "Brauzerlar",
+ "campaign": "Kampaniya",
+ "campaigns": "Kampaniyalar",
+ "cancel": "Bekor qilish",
+ "change-password": "Parolni oʻzgartirish",
+ "channel": "Kanal",
+ "channels": "Kanallar",
+ "chart": "Grafik",
+ "cities": "Shaharlar",
+ "city": "Shahar",
+ "clear-all": "Barchasini tozalash",
+ "cls": "CLS",
+ "cohort": "Kogorta",
+ "cohorts": "Kogortalar",
+ "compare": "Taqqoslash",
+ "compare-dates": "Sanalarni taqqoslash",
+ "confirm": "Tasdiqlash",
+ "confirm-password": "Parolni tasdiqlash",
+ "contains": "Oʻz ichiga oladi",
+ "content": "Kontent",
+ "continue": "Davom etish",
+ "conversion": "Konversiya",
+ "conversion-rate": "Konversiya darajasi",
+ "conversion-step": "Konversiya qadami",
+ "count": "Soni",
+ "countries": "Davlatlar",
+ "country": "Davlat",
+ "create": "Yaratish",
+ "create-report": "Hisobot yaratish",
+ "create-team": "Jamoa yaratish",
+ "create-user": "Foydalanuvchi yaratish",
+ "created": "Yaratilgan",
+ "created-by": "Kim tomonidan yaratilgan",
+ "criteria": "Mezonlar",
+ "currency": "Valyuta",
+ "current": "Joriy",
+ "current-password": "Joriy parol",
+ "custom-range": "Maxsus oraliq",
+ "dashboard": "Boshqaruv paneli",
+ "data": "Ma'lumotlar",
+ "date": "Sana",
+ "date-range": "Sana oraligʻi",
+ "day": "Kun",
+ "default-date-range": "Standart sana oraligʻi",
+ "delete": "Oʻchirish",
+ "delete-report": "Hisobotni oʻchirish",
+ "delete-team": "Jamoani oʻchirish",
+ "delete-user": "Foydalanuvchini oʻchirish",
+ "delete-website": "Veb-saytni oʻchirish",
+ "description": "Tavsif",
+ "desktop": "Ish stoli",
+ "destination-url": "Maqsad URL",
+ "details": "Batafsil ma'lumot",
+ "device": "Qurilma",
+ "devices": "Qurilmalar",
+ "direct": "Toʻgʻridantoʻgʻri",
+ "dismiss": "Yopish",
+ "distinct-id": "Noyob ID",
+ "documentation": "Hujjatlar",
+ "does-not-contain": "Oʻz ichiga olmaydi",
+ "does-not-include": "Oʻz ichiga olmaydi",
+ "doest-not-exist": "Mavjud emas",
+ "domain": "Domen",
+ "download": "Yuklab olish",
+ "dropoff": "Tashlab ketish",
+ "duration": "Davomiylik",
+ "edit": "Tahrirlash",
+ "edit-member": "A'zoni tahrirlash",
+ "email": "Elektron pochta",
+ "enable-share-url": "Ulashish URL'ini yoqish",
+ "end-step": "Yakuniy qadam",
+ "entry": "Kirish yoʻli",
+ "environment": "Muhit",
+ "event": "Hodisa",
+ "event-data": "Hodisa ma'lumotlari",
+ "event-name": "Hodisa nomi",
+ "events": "Hodisalar",
+ "exclude-bounce": "Chiqib ketishni istisno qilish",
+ "exists": "Mavjud",
+ "exit": "Chiqish yoʻli",
+ "false": "Yolgʻon",
+ "fcp": "FCP",
+ "field": "Maydon",
+ "fields": "Maydonlar",
+ "filter": "Filtr",
+ "filter-combined": "Birlashtirilgan",
+ "filter-raw": "Xom",
+ "filters": "Filtrlar",
+ "first-click": "Birinchi bosish",
+ "first-seen": "Birinchi koʻrilgan",
+ "funnel": "Voronka",
+ "funnel-description": "Foydalanuvchilarning konversiya va tashlab ketish darajasini tushunish.",
+ "funnels": "Voronkalar",
+ "goal": "Maqsad",
+ "goals": "Maqsadlar",
+ "goals-description": "Sahifa koʻrishlari va hodisalar uchun maqsadlaringizni kuzatib boring.",
+ "good": "Yaxshi",
+ "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.",
+ "invalid-url": "Noto'g'ri URL",
+ "is": "Teng",
+ "is-false": "Yolgʻon",
+ "is-not": "Teng emas",
+ "is-not-set": "Oʻrnatilmagan",
+ "is-set": "Oʻrnatilgan",
+ "is-true": "Rost",
+ "join": "Qoʻshilish",
+ "join-team": "Jamoaga qoʻshilish",
+ "journey": "Sayohat",
+ "journey-description": "Foydalanuvchilar veb-saytingizda qanday harakat qilishlarini tushunish.",
+ "journeys": "Sayohatlar",
+ "language": "Til",
+ "languages": "Tillar",
+ "laptop": "Noutbuk",
+ "last-click": "Oxirgi bosish",
+ "last-days": "Oxirgi {x} kun",
+ "last-hours": "Oxirgi {x} soat",
+ "last-months": "Oxirgi {x} oy",
+ "last-seen": "Oxirgi koʻrilgan",
+ "lcp": "LCP",
+ "leave": "Tark etish",
+ "leave-team": "Jamoani tark etish",
+ "less-than": "Kichikroq",
+ "less-than-equals": "Kichikroq yoki teng",
+ "link": "Havola",
+ "links": "Havolalar",
+ "location": "Joylashuv",
+ "login": "Kirish",
+ "logout": "Chiqish",
+ "manage": "Boshqarish",
+ "manager": "Menejer",
+ "mask-level": "Niqob darajasi",
+ "match": "Moslik",
+ "match-all": "Barchasi",
+ "match-any": "Istalgan",
+ "max": "Maksimal",
+ "max-duration": "Maksimal davomiylik",
+ "maximize": "Kattalashtirish",
+ "medium": "Vosita",
+ "member": "A'zo",
+ "members": "A'zolar",
+ "min": "Minimal",
+ "minute": "Daqiqa",
+ "mobile": "Mobil",
+ "model": "Model",
+ "month": "Oy",
+ "more": "Koʻproq",
+ "my-account": "Mening hisobim",
+ "my-websites": "Mening veb-saytlarim",
+ "name": "Ism",
+ "needs-improvement": "Yaxshilash kerak",
+ "new-password": "Yangi parol",
+ "none": "Hech biri",
+ "number-of-records": "{x} yozuv",
+ "ok": "OK",
+ "online": "Onlayn",
+ "organic-search": "Organik qidiruv",
+ "organic-shopping": "Organik xarid",
+ "organic-social": "Organik ijtimoiy",
+ "organic-video": "Organik video",
+ "os": "OT (Operatsion tizim)",
+ "other": "Boshqa",
+ "overview": "Umumiy koʻrinish",
+ "owner": "Egasi",
+ "page": "Sahifa",
+ "page-of": "Sahifa {current} dan {total}",
+ "page-views": "Sahifa koʻrishlari",
+ "pages": "Sahifalar",
+ "pageTitle": "Sahifa sarlavhasi",
+ "paid-ads": "Pullik reklamalar",
+ "paid-search": "Pullik qidiruv",
+ "paid-shopping": "Pullik xarid",
+ "paid-social": "Pullik ijtimoiy",
+ "paid-video": "Pullik video",
+ "password": "Parol",
+ "path": "Yoʻl",
+ "paths": "Yoʻllar",
+ "performance": "Ishlash",
+ "pixel": "Piksel",
+ "pixels": "Piksellar",
+ "play": "Ijro etish",
+ "poor": "Yomon",
+ "powered-by": "{name} tomonidan quvvatlanadi",
+ "preferences": "Sozlamalar",
+ "previous": "Oldingi",
+ "previous-period": "Oldingi davr",
+ "previous-year": "Oldingi yil",
+ "profile": "Profil",
+ "profiles": "Profillar",
+ "properties": "Xususiyatlar",
+ "property": "Xususiyat",
+ "queries": "Soʻrovlar",
+ "query": "Soʻrov",
+ "query-parameters": "Soʻrov parametrlari",
+ "realtime": "Haqiqiy vaqt",
+ "recorded": "Yozib olingan",
+ "referral": "Tavsiya",
+ "referrer": "Tavsiya etuvchi",
+ "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",
+ "replay": "Qayta ijro",
+ "replay-enabled": "Qayta ijro yoqilgan",
+ "replay-id": "Replay ID",
+ "replays": "Qayta ijrolar",
+ "reports": "Hisobotlar",
+ "required": "Majburiy",
+ "reset": "Qayta tiklash",
+ "reset-website": "Veb-saytni qayta tiklash",
+ "retention": "Saqlanish",
+ "retention-days": "Saqlash kunlari",
+ "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-segment": "Segmentni saqlash",
+ "screen": "Ekran",
+ "screens": "Ekranlar",
+ "search": "Qidiruv",
+ "segment": "Segment",
+ "segments": "Segmentlar",
+ "select": "Tanlash",
+ "select-component": "Komponent tanlash",
+ "select-date": "Sanani tanlash",
+ "select-filter": "Filtrni tanlash",
+ "select-role": "Rolni tanlash",
+ "select-website": "Veb-saytni tanlash",
+ "session": "Sessiya",
+ "session-data": "Sessiya maʼlumotlari",
+ "sessions": "Sessiyalar",
+ "settings": "Sozlamalar",
+ "share": "Ulashish",
+ "share-url": "Ulashish URL'i",
+ "single-day": "Bir kun",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Manba",
+ "sources": "Manbalar",
+ "start-step": "Boshlanish qadami",
+ "steps": "Qadamlar",
+ "sum": "Yigʻindi",
+ "support": "Qo'llab-quvvatlash",
+ "switch-account": "Hisobni almashtirish",
+ "table": "Jadval",
+ "tablet": "Planshet",
+ "tag": "Yorliq",
+ "tags": "Yorliqlar",
+ "team": "Jamoa",
+ "team-id": "Jamoa ID'si",
+ "team-manager": "Jamoa menejeri",
+ "team-member": "Jamoa a'zosi",
+ "team-name": "Jamoa nomi",
+ "team-owner": "Jamoa egasi",
+ "team-settings": "Jamoa sozlamalari",
+ "team-view-only": "Jamoa faqat koʻrish",
+ "team-websites": "Jamoa veb-saytlari",
+ "teams": "Jamoalar",
+ "term": "Qidiruv iborasi",
+ "terms": "Shartlar",
+ "theme": "Mavzu",
+ "this-month": "Shu oy",
+ "this-week": "Shu hafta",
+ "this-year": "Shu yil",
+ "timezone": "Vaqt zonasi",
+ "title": "Sarlavha",
+ "today": "Bugun",
+ "toggle-charts": "Grafiklarni almashtirish",
+ "total": "Jami",
+ "total-records": "Jami yozuvlar",
+ "tracking-code": "Kuzatuv kodi",
+ "traffic": "Trafik",
+ "transactions": "Tranzaksiyalar",
+ "transfer": "Oʻtkazish",
+ "transfer-website": "Veb-saytni oʻtkazish",
+ "true": "Rost",
+ "ttfb": "TTFB",
+ "type": "Tur",
+ "unique": "Noyob",
+ "unique-events": "Noyob hodisalar",
+ "unique-visitors": "Noyob tashrif buyuruvchilar",
+ "uniqueCustomers": "Noyob mijozlar",
+ "unknown": "Noma'lum",
+ "untitled": "Sarlavhasiz",
+ "update": "Yangilash",
+ "url": "URL",
+ "urls": "URL'lar",
+ "user": "Foydalanuvchi",
+ "user-property": "Foydalanuvchi xususiyati",
+ "username": "Foydalanuvchi nomi",
+ "users": "Foydalanuvchilar",
+ "utm": "UTM",
+ "utm-campaign": "UTM Kampaniya",
+ "utm-content": "UTM Kontent",
+ "utm-description": "UTM parametrlari orqali kampaniyalaringizni kuzatib boring.",
+ "utm-medium": "UTM Vosita",
+ "utm-source": "UTM Manba",
+ "utm-term": "UTM Ibora",
+ "value": "Qiymat",
+ "version": "Versiya",
+ "view": "Koʻrish",
+ "view-details": "Batafsil koʻrish",
+ "view-only": "Faqat koʻrish",
+ "views": "Koʻrishlar",
+ "views-per-visit": "Tashrifga koʻrishlar soni",
+ "visit-duration": "Tashrif davomiyligi",
+ "visitors": "Tashrif buyuruvchilar",
+ "visits": "Tashriflar",
+ "website": "Veb-sayt",
+ "website-id": "Veb-sayt ID'si",
+ "websites": "Veb-saytlar",
+ "window": "Oyna",
+ "yesterday": "Kecha"
+ },
+ "message": {
+ "action-confirmation": "Tasdiqlash uchun pastdagi qutiga **{confirmation}** yozing.",
+ "active-users": "{x} joriy {x, plural, one {tashrif buyuruvchi} other {tashrif buyuruvchilar}}",
+ "bad-request": "Notoʻgʻri soʻrov",
+ "collected-data": "Yigʻilgan ma'lumotlar",
+ "confirm-delete": "**{target}** ni oʻchirmoqchi ekanligingizga ishonchingiz komilmi?",
+ "confirm-leave": "**{target} ** ni tark etmoqchi ekanligingizga ishonchingiz komilmi?",
+ "confirm-remove": "**{target} ** ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?",
+ "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.",
+ "event-log": "**{url} ** da **{event} ** hodisasi",
+ "forbidden": "Taqiqlangan",
+ "go-to-settings": "Sozlamalarga oʻtish",
+ "incorrect-username-password": "Notoʻgʻri foydalanuvchi nomi va/yoki parol.",
+ "invalid-domain": "Notoʻgʻri domen. http/https qoʻshmang.",
+ "min-password-length": "Minimal uzunligi {n} belgidan",
+ "new-version-available": "Umami'ning yangi **{version}** versiyasi mavjud!",
+ "no-data-available": "Ma'lumotlar mavjud emas.",
+ "no-event-data": "Hodisa ma'lumotlari mavjud emas.",
+ "no-match-password": "Parollar mos kelmadi.",
+ "no-results-found": "Hech qanday natija topilmadi.",
+ "no-team-websites": "Bu jamoada hech qanday veb-sayt yoʻq.",
+ "no-teams": "Siz hech qanday jamoa yaratmagansiz.",
+ "no-users": "Hech qanday foydalanuvchi yoʻq.",
+ "no-websites-configured": "Sizda hech qanday veb-sayt sozlanmagan.",
+ "not-found": "Topilmadi",
+ "nothing-selected": "Hech narsa tanlanmagan.",
+ "page-not-found": "Sahifa topilmadi",
+ "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-component-preview": "Ko'rib chiqish uchun komponent tanlang",
+ "select-website-first": "Avval veb-sayt tanlang",
+ "sever-error": "Server xatosi",
+ "share-url": "Sizning veb-sayt statistikalaringiz quyidagi URL'da ochiqdir:",
+ "team-already-member": "Siz allaqachon jamoa a'zosisiz.",
+ "team-not-found": "Jamoa topilmadi.",
+ "team-websites-info": "Veb-saytlarni jamoaning har bir a'zosi koʻrishi mumkin.",
+ "tracking-code": "Bu veb-sayt uchun statistikani kuzatish uchun quyidagi kodni HTML'ingizdagi **...** qismiga joylashtiring.",
+ "transfer-team-website-to-user": "Bu veb-saytni oʻz hisobingizga oʻtkazasizmi?",
+ "transfer-user-website-to-team": "Bu veb-saytni oʻtkazish uchun jamoani tanlang.",
+ "transfer-website": "Veb-sayt egaligini oʻz hisobingizga yoki boshqa jamoaga oʻtkazish.",
+ "triggered-event": "Hodisa ishga tushirildi",
+ "unauthorized": "Ruxsatsiz",
+ "user-deleted": "Foydalanuvchi oʻchirildi.",
+ "viewed-page": "Sahifa koʻrildi",
+ "visitor-log": "{os} {device} da {browser} dan foydalanayotgan {country} dan tashrif buyuruvchi",
+ "visitors-dropped-off": "Tashrif buyuruvchilar tashlab ketishdi"
+ }
+}
diff --git a/public/intl/messages/vi-VN.json b/public/intl/messages/vi-VN.json
index 68a301ae5..eec7e013b 100644
--- a/public/intl/messages/vi-VN.json
+++ b/public/intl/messages/vi-VN.json
@@ -1,1860 +1,428 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "Access code"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "Hành động"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "Activity log"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "Add"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "Add description"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "Add member"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "Add step"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "Thêm website"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "Quản trị"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "After"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "Tất cả"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "Toàn thời gian"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "Analytics"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "Average"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "Quay về"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "Before"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "Tỷ lệ thoát trang"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "Breakdown"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "Browser"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "Trình duyệt"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "Huỷ bỏ"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "Đổi mật khẩu"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "Cities"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "City"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "Clear all"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "Compare"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "Confirm"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "Xác nhận mật khẩu"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "Contains"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "Continue"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "Count"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "Quốc gia"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "Country"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "Create"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "Create report"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "Create team"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "Create user"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "Created"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "Created By"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "Current"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "Mật khẩu hiện tại"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "Phạm vi ngày tuỳ chọn"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "Bảng điều khiển"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "Data"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "Date"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "Phạm vi ngày"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "Day"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "Khoảng thời gian mặc định"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "Xoá"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "Delete report"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "Delete team"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "Delete user"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "Xóa website"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "Description"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "Máy bàn"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "Details"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "Device"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "Thiết bị"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "Loại trừ"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "Does not contain"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "Tên miền"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "Dropoff"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "Chỉnh sửa"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "Edit dashboard"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "Edit member"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "Bật khả năng chia sẻ URL"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "End Step"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "Entry URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "Event"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "Event data"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "Sự kiện"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "Exit URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "False"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "Field"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "Fields"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "Filter"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "Kết hợp"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "Gốc"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "Filters"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "First seen"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "Funnel"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "Understand the conversion and drop-off rate of users."
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "Goal"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "Goals"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "Track your goals for pageviews and events."
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "Greater than"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "Greater than or equals"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "Host"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "Hosts"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "Insights"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "Dive deeper into your data by using segments and filters."
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "Is"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "Is not"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "Is not set"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "Is set"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "Join"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "Join team"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "Journey"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "Understand how users navigate through your website."
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "Language"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "Ngôn ngữ"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "Laptop"
- }
- ],
- "label.last-days": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " ngày gần nhất"
- }
- ],
- "label.last-hours": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " giờ gần nhất"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "Last "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " months"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "Last seen"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "Leave"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "Leave team"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "Less than"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "Less than or equals"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "Đăng nhập"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "Đăng xuất"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "Manage"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "Manager"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "Max"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "Member"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "Members"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "Min"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "Di động"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "Thêm"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "My account"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "My websites"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "Tên"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "Mật khẩu mới"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "None"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "OS"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "Overview"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "Chủ sở hữu"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "Page "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "Lượt xem"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "Page title"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "Trang"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "Mật khẩu"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "Bản quyền thuộc về "
- },
- {
- "type": 1,
- "value": "name"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "Previous"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "Previous period"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "Previous year"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "Hồ sơ"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "Properties"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "Property"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "Queries"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "Query"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "Query parameters"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "Thời gian thực"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "Referrer"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "Liên kết giới thiệu"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "Làm mới"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "Regenerate"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "Region"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "Regions"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "Remove"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "Remove member"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "Reports"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "Yêu cầu"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "Tái thiết lập"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "Tái thiết lập thống kê"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "Retention"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "Revenue"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "Look into your revenue across time."
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "Revenue Property"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "Role"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "Run query"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "Lưu"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "Screens"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "Search"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "Select"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "Select date"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "Select role"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "Select website"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "Sessions"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "Cài đặt"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "Chia sẻ URL"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "Trong ngày"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "Start Step"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "Steps"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "Sum"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "Máy tính bảng"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "Team"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "Team ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "Team manager"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "Team member"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "Team name"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "Team owner"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "Team view only"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "Team websites"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "Teams"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "Giao diện"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "Tháng này"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "Tuần này"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "Năm nay"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "Múi giờ"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "Title"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "Hôm nay"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "Bật/tắt biểu đồ"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "Total"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "Total records"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "Mã theo dõi"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "Transactions"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "Transfer"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "True"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "Type"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "Unique"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "Khách truy cập một lần"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "Unique Customers"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "Không rõ"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "Untitled"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "Update"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "URL"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "URLs"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "User"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "User Property"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "Tên đăng nhập"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "Users"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "Track your campaigns through UTM parameters."
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "Value"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "View"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "Xem chi tiết"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "View only"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "Xem"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "Views per visit"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "Thời gian truy cập trung bình"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "Khách"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "Visits"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "Website"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "Website ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "Websites"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "Window"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "Yesterday"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "Type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.active-users": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " hiện tại "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "một"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "trên"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "Collected data"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "Bạn có chắc chắn muốn xoá "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "Bạn có chắc chắn muốn tái thiết lập thống kê "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "Deleting a team will also delete all team websites."
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "Tất cả các dữ liệu liên quan cũng sẽ bị xoá."
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "Đã xảy ra lỗi."
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "event"
- },
- {
- "type": 0,
- "value": " on "
- },
- {
- "type": 1,
- "value": "url"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "Chuyển tới cài đặt"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "Sai tên đăng nhập/mật khẩu."
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "Tên miền không hợp lệ"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "Minimum length of "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " characters"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "A new version of Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "Không có dữ liệu."
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "No event data is available."
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "Mật khẩu không đồng nhất"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "No results were found."
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "This team does not have any websites."
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "You have not created any teams."
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "There are no users."
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "Bạn chưa có bất cứ website nào."
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "Trang không tìm thấy."
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "To reset this website, type "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " in the box below to confirm."
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "Tất cả số liệu thống kê của website này sẽ bị xoá, nhưng mã theo dõi sẽ vẫn giữ nguyên."
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "Đã lưu thành công."
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "Đây là đường dẫn URL cho "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "."
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "You are already a member of the team."
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "Team not found."
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "Websites can be viewed by anyone on the team."
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "Mã theo dõi"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "Transfer this website to your account?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "Select the team to transfer this website to."
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "Transfer website ownership to your account or another team."
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "Triggered event"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "User deleted."
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "Viewed page"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "Khách từ "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " đang dùng "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " trên "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "type": 1,
- "value": "device"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "Visitors dropped off"
- }
- ]
+ "label": {
+ "access-code": "Mã truy cập",
+ "account": "Tài khoản",
+ "action": "Hành động",
+ "actions": "Hành động",
+ "activity": "Nhật ký hoạt động",
+ "add": "Thêm",
+ "add-board": "Thêm bảng",
+ "add-description": "Thêm mô tả",
+ "add-link": "Thêm liên kết",
+ "add-member": "Thêm thành viên",
+ "add-pixel": "Thêm pixel",
+ "add-step": "Thêm bước",
+ "add-website": "Thêm website",
+ "admin": "Quản trị",
+ "affiliate": "Liên kết",
+ "after": "Sau đó",
+ "all": "Tất cả",
+ "all-time": "Toàn thời gian",
+ "analysis": "Phân tích",
+ "analytics": "Phân tích",
+ "aov": "AOV",
+ "application": "Ứng dụng",
+ "apply": "Áp dụng",
+ "arpu": "ARPU",
+ "attribution": "Phân bổ",
+ "attribution-description": "Xem cách người dùng tương tác với marketing của bạn và điều gì thúc đẩy chuyển đổi.",
+ "audience": "Đối tượng",
+ "average": "Trung bình",
+ "back": "Quay lại",
+ "before": "Trước đó",
+ "behavior": "Hành vi",
+ "block-selector": "Bộ chọn khối",
+ "boards": "Các bảng",
+ "bounce-rate": "Tỷ lệ thoát trang",
+ "breakdown": "Phân tích chi tiết",
+ "browser": "Trình duyệt",
+ "browsers": "Các trình duyệt",
+ "campaign": "Chiến dịch",
+ "campaigns": "Các chiến dịch",
+ "cancel": "Hủy bỏ",
+ "change-password": "Đổi mật khẩu",
+ "channel": "Kênh",
+ "channels": "Các kênh",
+ "chart": "Biểu đồ",
+ "cities": "Các thành phố",
+ "city": "Thành phố",
+ "clear-all": "Xóa tất cả",
+ "cls": "CLS",
+ "cohort": "Nhóm thuần tập",
+ "cohorts": "Nhóm thuần tập",
+ "compare": "So sánh",
+ "compare-dates": "So sánh ngày",
+ "confirm": "Xác nhận",
+ "confirm-password": "Xác nhận mật khẩu",
+ "contains": "Chứa",
+ "content": "Nội dung",
+ "continue": "Tiếp tục",
+ "conversion": "Chuyển đổi",
+ "conversion-rate": "Tỷ lệ chuyển đổi",
+ "conversion-step": "Bước chuyển đổi",
+ "count": "Số lượng",
+ "countries": "Các quốc gia",
+ "country": "Quốc gia",
+ "create": "Tạo",
+ "create-report": "Tạo báo cáo",
+ "create-team": "Tạo nhóm",
+ "create-user": "Tạo người dùng",
+ "created": "Đã tạo",
+ "created-by": "Được tạo bởi",
+ "criteria": "Tiêu chí",
+ "currency": "Tiền tệ",
+ "current": "Hiện tại",
+ "current-password": "Mật khẩu hiện tại",
+ "custom-range": "Phạm vi tùy chỉnh",
+ "dashboard": "Bảng điều khiển",
+ "data": "Dữ liệu",
+ "date": "Ngày",
+ "date-range": "Phạm vi ngày",
+ "day": "Ngày",
+ "default-date-range": "Khoảng thời gian mặc định",
+ "delete": "Xóa",
+ "delete-report": "Xóa báo cáo",
+ "delete-team": "Xóa nhóm",
+ "delete-user": "Xóa người dùng",
+ "delete-website": "Xóa website",
+ "description": "Mô tả",
+ "desktop": "Máy tính để bàn",
+ "destination-url": "URL đích",
+ "details": "Chi tiết",
+ "device": "Thiết bị",
+ "devices": "Các thiết bị",
+ "direct": "Trực tiếp",
+ "dismiss": "Bỏ qua",
+ "distinct-id": "ID riêng biệt",
+ "documentation": "Tài liệu",
+ "does-not-contain": "Không chứa",
+ "does-not-include": "Không bao gồm",
+ "doest-not-exist": "Không tồn tại",
+ "domain": "Tên miền",
+ "download": "Tải xuống",
+ "dropoff": "Tỷ lệ bỏ qua",
+ "duration": "Thời lượng",
+ "edit": "Chỉnh sửa",
+ "edit-member": "Chỉnh sửa thành viên",
+ "email": "Email",
+ "enable-share-url": "Bật chia sẻ URL",
+ "end-step": "Bước kết thúc",
+ "entry": "URL truy cập",
+ "environment": "Môi trường",
+ "event": "Sự kiện",
+ "event-data": "Dữ liệu sự kiện",
+ "event-name": "Tên sự kiện",
+ "events": "Các sự kiện",
+ "exclude-bounce": "Loại trừ thoát trang",
+ "exists": "Tồn tại",
+ "exit": "URL thoát",
+ "false": "Sai",
+ "fcp": "FCP",
+ "field": "Trường",
+ "fields": "Các trường",
+ "filter": "Lọc",
+ "filter-combined": "Kết hợp lọc",
+ "filter-raw": "Lọc thô",
+ "filters": "Bộ lọc",
+ "first-click": "Nhấp đầu tiên",
+ "first-seen": "Lần đầu tiên nhìn thấy",
+ "funnel": "Phễu",
+ "funnel-description": "Tìm hiểu tỷ lệ chuyển đổi và bỏ qua của người dùng.",
+ "funnels": "Các phễu",
+ "goal": "Mục tiêu",
+ "goals": "Các mục tiêu",
+ "goals-description": "Theo dõi các mục tiêu của bạn cho lượt xem trang và sự kiện.",
+ "good": "Tốt",
+ "greater-than": "Lớn hơn",
+ "greater-than-equals": "Lớn hơn hoặc bằng",
+ "grouped": "Đã nhóm",
+ "growth": "Tăng trưởng",
+ "host": "Máy chủ",
+ "hostname": "Tên máy chủ",
+ "hosts": "Các máy chủ",
+ "hour": "Giờ",
+ "includes": "Bao gồm",
+ "inp": "INP",
+ "insight": "Thông tin chi tiết",
+ "insights": "Thông tin chi tiết",
+ "insights-description": "Tìm hiểu sâu hơn về dữ liệu của bạn bằng cách sử dụng phân đoạn và bộ lọc.",
+ "invalid-url": "URL không hợp lệ",
+ "is": "Là",
+ "is-false": "Là sai",
+ "is-not": "Không phải là",
+ "is-not-set": "Chưa được đặt",
+ "is-set": "Đã đặt",
+ "is-true": "Là đúng",
+ "join": "Tham gia",
+ "join-team": "Tham gia nhóm",
+ "journey": "Hành trình",
+ "journey-description": "Hiểu cách người dùng điều hướng qua website của bạn.",
+ "journeys": "Các hành trình",
+ "language": "Ngôn ngữ",
+ "languages": "Các ngôn ngữ",
+ "laptop": "Máy tính xách tay",
+ "last-click": "Nhấp cuối cùng",
+ "last-days": "{x} ngày gần nhất",
+ "last-hours": "{x} giờ gần nhất",
+ "last-months": "{x} tháng gần nhất",
+ "last-seen": "Lần cuối cùng nhìn thấy",
+ "lcp": "LCP",
+ "leave": "Rời khỏi",
+ "leave-team": "Rời nhóm",
+ "less-than": "Nhỏ hơn",
+ "less-than-equals": "Nhỏ hơn hoặc bằng",
+ "link": "Liên kết",
+ "links": "Các liên kết",
+ "location": "Vị trí",
+ "login": "Đăng nhập",
+ "logout": "Đăng xuất",
+ "manage": "Quản lý",
+ "manager": "Quản lý",
+ "mask-level": "Mức che",
+ "match": "Khớp",
+ "match-all": "Tất cả",
+ "match-any": "Bất kỳ",
+ "max": "Tối đa",
+ "max-duration": "Thời lượng tối đa",
+ "maximize": "Phóng to",
+ "medium": "Phương tiện",
+ "member": "Thành viên",
+ "members": "Các thành viên",
+ "min": "Tối thiểu",
+ "minute": "Phút",
+ "mobile": "Di động",
+ "model": "Mô hình",
+ "month": "Tháng",
+ "more": "Thêm",
+ "my-account": "Tài khoản của tôi",
+ "my-websites": "Các website của tôi",
+ "name": "Tên",
+ "needs-improvement": "Cần cải thiện",
+ "new-password": "Mật khẩu mới",
+ "none": "Không",
+ "number-of-records": "{x} {x, plural, one {bản ghi} other {bản ghi}}",
+ "ok": "OK",
+ "online": "Trực tuyến",
+ "organic-search": "Tìm kiếm tự nhiên",
+ "organic-shopping": "Mua sắm tự nhiên",
+ "organic-social": "Mạng xã hội tự nhiên",
+ "organic-video": "Video tự nhiên",
+ "os": "Hệ điều hành",
+ "other": "Khác",
+ "overview": "Tổng quan",
+ "owner": "Chủ sở hữu",
+ "page": "Trang",
+ "page-of": "Trang {current} trên {total}",
+ "page-views": "Lượt xem trang",
+ "pages": "Các trang",
+ "pageTitle": "Tiêu đề trang",
+ "paid-ads": "Quảng cáo trả phí",
+ "paid-search": "Tìm kiếm trả phí",
+ "paid-shopping": "Mua sắm trả phí",
+ "paid-social": "Mạng xã hội trả phí",
+ "paid-video": "Video trả phí",
+ "password": "Mật khẩu",
+ "path": "Đường dẫn",
+ "paths": "Các đường dẫn",
+ "performance": "Hiệu suất",
+ "pixel": "Pixel",
+ "pixels": "Các pixel",
+ "play": "Phát",
+ "poor": "Kém",
+ "powered-by": "Được cung cấp bởi {name}",
+ "preferences": "Tùy chọn",
+ "previous": "Trước",
+ "previous-period": "Kỳ trước",
+ "previous-year": "Năm trước",
+ "profile": "Hồ sơ",
+ "profiles": "Hồ sơ",
+ "properties": "Thuộc tính",
+ "property": "Thuộc tính",
+ "queries": "Truy vấn",
+ "query": "Truy vấn",
+ "query-parameters": "Tham số truy vấn",
+ "realtime": "Thời gian thực",
+ "recorded": "Được ghi vào",
+ "referral": "Giới thiệu",
+ "referrer": "Nguồn giới thiệu",
+ "referrers": "Các nguồn giới thiệu",
+ "refresh": "Làm mới",
+ "regenerate": "Tạo lại",
+ "regex-match": "Khớp với biểu thức chính quy",
+ "regex-not-match": "Không khớp với biểu thức chính quy",
+ "region": "Vùng",
+ "regions": "Các vùng",
+ "remaining": "Còn lại",
+ "remove": "Xóa",
+ "remove-member": "Xóa thành viên",
+ "replay": "Phát lại",
+ "replay-enabled": "Phát lại được bật",
+ "replay-id": "Replay ID",
+ "replays": "Phát lại",
+ "reports": "Báo cáo",
+ "required": "Yêu cầu",
+ "reset": "Đặt lại",
+ "reset-website": "Đặt lại thống kê website",
+ "retention": "Tỷ lệ giữ chân",
+ "retention-days": "Ngày lưu trữ",
+ "retention-description": "Đo lường mức độ gắn bó của website bằng cách theo dõi tần suất người dùng quay lại.",
+ "revenue": "Doanh thu",
+ "revenue-description": "Xem xét doanh thu của bạn theo thời gian.",
+ "revenue-property": "Thuộc tính doanh thu",
+ "role": "Vai trò",
+ "run-query": "Chạy truy vấn",
+ "sample-rate": "Tỷ lệ mẫu",
+ "sample-size": "Kích thước mẫu",
+ "save": "Lưu",
+ "save-cohort": "Lưu nhóm thuần tập",
+ "save-segment": "Lưu phân đoạn",
+ "screen": "Màn hình",
+ "screens": "Màn hình",
+ "search": "Tìm kiếm",
+ "segment": "Phân đoạn",
+ "segments": "Phân đoạn",
+ "select": "Chọn",
+ "select-component": "Chọn thành phần",
+ "select-date": "Chọn ngày",
+ "select-filter": "Chọn bộ lọc",
+ "select-role": "Chọn vai trò",
+ "select-website": "Chọn website",
+ "session": "Phiên",
+ "session-data": "Dữ liệu phiên",
+ "sessions": "Các phiên",
+ "settings": "Cài đặt",
+ "share": "Chia sẻ",
+ "share-url": "Chia sẻ URL",
+ "single-day": "Một ngày",
+ "slug": "Slug",
+ "sms": "SMS",
+ "source": "Nguồn",
+ "sources": "Các nguồn",
+ "start-step": "Bước bắt đầu",
+ "steps": "Các bước",
+ "sum": "Tổng",
+ "support": "Hỗ trợ",
+ "switch-account": "Chuyển tài khoản",
+ "table": "Bảng",
+ "tablet": "Máy tính bảng",
+ "tag": "Thẻ",
+ "tags": "Các thẻ",
+ "team": "Nhóm",
+ "team-id": "ID nhóm",
+ "team-manager": "Quản lý nhóm",
+ "team-member": "Thành viên nhóm",
+ "team-name": "Tên nhóm",
+ "team-owner": "Chủ sở hữu nhóm",
+ "team-settings": "Cài đặt nhóm",
+ "team-view-only": "Chỉ xem nhóm",
+ "team-websites": "Các website của nhóm",
+ "teams": "Các nhóm",
+ "term": "Từ khóa",
+ "terms": "Điều khoản",
+ "theme": "Chủ đề",
+ "this-month": "Tháng này",
+ "this-week": "Tuần này",
+ "this-year": "Năm nay",
+ "timezone": "Múi giờ",
+ "title": "Tiêu đề",
+ "today": "Hôm nay",
+ "toggle-charts": "Bật/tắt biểu đồ",
+ "total": "Tổng",
+ "total-records": "Tổng số bản ghi",
+ "tracking-code": "Mã theo dõi",
+ "traffic": "Lưu lượng truy cập",
+ "transactions": "Giao dịch",
+ "transfer": "Chuyển giao",
+ "transfer-website": "Chuyển giao website",
+ "true": "Đúng",
+ "ttfb": "TTFB",
+ "type": "Loại",
+ "unique": "Duy nhất",
+ "unique-events": "Sự kiện duy nhất",
+ "unique-visitors": "Khách truy cập duy nhất",
+ "uniqueCustomers": "Khách hàng duy nhất",
+ "unknown": "Không rõ",
+ "untitled": "Không có tiêu đề",
+ "update": "Cập nhật",
+ "url": "URL",
+ "urls": "Các URL",
+ "user": "Người dùng",
+ "user-property": "Thuộc tính người dùng",
+ "username": "Tên đăng nhập",
+ "users": "Người dùng",
+ "utm": "UTM",
+ "utm-campaign": "UTM Chiến dịch",
+ "utm-content": "UTM Nội dung",
+ "utm-description": "Theo dõi các chiến dịch của bạn thông qua các tham số UTM.",
+ "utm-medium": "UTM Phương tiện",
+ "utm-source": "UTM Nguồn",
+ "utm-term": "UTM Từ khóa",
+ "value": "Giá trị",
+ "version": "Phiên bản",
+ "view": "Xem",
+ "view-details": "Xem chi tiết",
+ "view-only": "Chỉ xem",
+ "views": "Lượt xem",
+ "views-per-visit": "Lượt xem trên mỗi lượt truy cập",
+ "visit-duration": "Thời lượng truy cập",
+ "visitors": "Khách truy cập",
+ "visits": "Lượt truy cập",
+ "website": "Trang web",
+ "website-id": "ID website",
+ "websites": "Các website",
+ "window": "Cửa sổ",
+ "yesterday": "Hôm qua"
+ },
+ "message": {
+ "action-confirmation": "Nhập {confirmation} vào ô bên dưới để xác nhận.",
+ "active-users": "{x} {x, plural, one {người dùng} other {người dùng}} đang hoạt động",
+ "bad-request": "Yêu cầu không hợp lệ",
+ "collected-data": "Dữ liệu đã thu thập",
+ "confirm-delete": "Bạn có chắc chắn muốn xóa {target}?",
+ "confirm-leave": "Bạn có chắc chắn muốn rời {target} ?",
+ "confirm-remove": "Bạn có chắc chắn muốn xóa {target} ?",
+ "confirm-reset": "Bạn có chắc chắn muốn đặt lại thống kê {target}?",
+ "delete-team-warning": "Việc xóa một nhóm cũng sẽ xóa tất cả các website của nhóm.",
+ "delete-website-warning": "Tất cả dữ liệu liên quan cũng sẽ bị xóa.",
+ "empty-dashboard": "Bảng điều khiển của bạn đang trống. Nhấp Chỉnh sửa để thêm thành phần đầu tiên.",
+ "error": "Đã xảy ra lỗi.",
+ "event-log": "{event} trên {url} ",
+ "forbidden": "Bị cấm",
+ "go-to-settings": "Chuyển đến cài đặt",
+ "incorrect-username-password": "Sai tên đăng nhập/mật khẩu.",
+ "invalid-domain": "Tên miền không hợp lệ",
+ "min-password-length": "Độ dài tối thiểu {n} ký tự",
+ "new-version-available": "Có phiên bản mới của Umami {version}!",
+ "no-data-available": "Không có dữ liệu.",
+ "no-event-data": "Không có dữ liệu sự kiện.",
+ "no-match-password": "Mật khẩu không khớp",
+ "no-results-found": "Không tìm thấy kết quả nào.",
+ "no-team-websites": "Nhóm này không có bất kỳ website nào.",
+ "no-teams": "Bạn chưa tạo nhóm nào.",
+ "no-users": "Không có người dùng nào.",
+ "no-websites-configured": "Bạn chưa cấu hình bất kỳ website nào.",
+ "not-found": "Không tìm thấy",
+ "nothing-selected": "Chưa chọn gì.",
+ "page-not-found": "Không tìm thấy trang.",
+ "reset-website": "Để đặt lại website này, nhập {confirmation} vào ô bên dưới để xác nhận.",
+ "reset-website-warning": "Tất cả số liệu thống kê của website này sẽ bị xóa, nhưng mã theo dõi sẽ vẫn giữ nguyên.",
+ "saved": "Đã lưu thành công.",
+ "select-component-preview": "Chọn một thành phần để xem trước",
+ "select-website-first": "Chọn một trang web trước",
+ "sever-error": "Lỗi máy chủ",
+ "share-url": "Đây là đường dẫn URL cho {target}.",
+ "team-already-member": "Bạn đã là thành viên của nhóm.",
+ "team-not-found": "Không tìm thấy nhóm.",
+ "team-websites-info": "Bất kỳ ai trong nhóm đều có thể xem các website.",
+ "tracking-code": "Mã theo dõi",
+ "transfer-team-website-to-user": "Chuyển website này sang tài khoản của bạn?",
+ "transfer-user-website-to-team": "Chọn nhóm để chuyển website này đến.",
+ "transfer-website": "Chuyển quyền sở hữu website sang tài khoản của bạn hoặc một nhóm khác.",
+ "triggered-event": "Sự kiện được kích hoạt",
+ "unauthorized": "Chưa được xác thực",
+ "user-deleted": "Người dùng đã bị xóa.",
+ "viewed-page": "Đã xem trang",
+ "visitor-log": "Khách từ {country} đang sử dụng {browser} trên {os} {device} ",
+ "visitors-dropped-off": "Khách truy cập đã rời đi"
+ }
}
diff --git a/public/intl/messages/zh-CN.json b/public/intl/messages/zh-CN.json
index 6826a7b15..e552cf158 100644
--- a/public/intl/messages/zh-CN.json
+++ b/public/intl/messages/zh-CN.json
@@ -1,1866 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "访问代码"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "用户行为"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "活动日志"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "添加"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "添加描述"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "添加成员"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "添加步骤"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "添加网站"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "管理员"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "之后"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "所有"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "所有时间段"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "分析"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "平均"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "返回"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "之前"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "跳出率"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "故障"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "浏览器"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "浏览器"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "取消"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "修改密码"
- }
- ],
- "label.channels": [
- {
- "type": 0,
- "value": "渠道"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "市/县"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "市/县"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "清除全部"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "比较"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "确认"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "确认密码"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "包含"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "继续"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "统计"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "国家/地区"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "国家/地区"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "创建"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "创建报告"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "创建团队"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "创建用户"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "已创建"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "创建者"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "当前"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "当前密码"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "自定义时间段"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "仪表盘"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "统计数据"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "日期"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "时间段"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "日"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "默认时间段"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "删除"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "删除报告"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "删除团队"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "删除用户"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "删除网站"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "描述"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "台式机"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "详细信息"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "设备"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "设备"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "关闭"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "不包含"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "域名"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "丢弃"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "编辑"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "编辑仪表盘"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "编辑成员"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "启用共享链接"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "结束步骤"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "入口 URL"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "事件"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "事件数据"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "行为类别"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "退出 URL"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "否"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "字段"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "字段"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "筛选器"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "合并"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "原始"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "筛选"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "首次出现"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "分析"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "了解用户的转化率和跳出率。"
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "目标"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "目标"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "跟踪页面浏览量和事件的目标。"
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "大于"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "大于或等于"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "主机"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "主机"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "见解"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "通过使用筛选器和划分时间段来更深入地研究数据。"
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "等于"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "不等于"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "未设置"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "已设置"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "加入"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "加入团队"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "用户浏览轨迹"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "了解用户如何浏览网站。"
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "语言"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "语言"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "笔记本"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 天"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 小时"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 个月"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "最后出现"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "离开"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "离开团队"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "少于"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "少于等于"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "登录"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "退出"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "管理"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "管理者"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "最大"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "成员"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "成员"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "最小"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "手机"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "更多"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "我的账户"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "我的网站"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "名字"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "新密码"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "无"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " "
- },
- {
- "offset": 0,
- "options": {
- "one": {
- "value": [
- {
- "type": 0,
- "value": "record"
- }
- ]
- },
- "other": {
- "value": [
- {
- "type": 0,
- "value": "records"
- }
- ]
- }
- },
- "pluralType": "cardinal",
- "type": 6,
- "value": "x"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "好的"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "操作系统"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "概览"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "所有者"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "总 "
- },
- {
- "type": 1,
- "value": "total"
- },
- {
- "type": 0,
- "value": " 中的第 "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " 页"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "页面浏览量"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "标题"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "网页"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "密码"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "Path"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "Paths"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "由 "
- },
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " 提供支持"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "先前"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "上一时期"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "上一年"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "个人资料"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "属性"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "属性"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "查询"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "查询"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "查询参数"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "实时"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "来源"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "来源域名"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "刷新"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "重新生成"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "州/省"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "州/省"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "移除"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "移除成员"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "报告"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "必填"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "重置"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "重置统计数据"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "保留"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "通过追踪用户回访频率来衡量您网站的用户粘性。"
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "收入"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "查看随时间变化的收入数据。"
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "收入值"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "角色"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "查询"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "保存"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "屏幕尺寸"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "搜索"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "选择"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "选择日期"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "选择角色"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "选择网站"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "Session"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "会话"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "设置"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "共享链接"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "单日"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "开始步骤"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "步骤"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "总和"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "平板"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "团队"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "团队 ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "团队管理员"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "团队成员"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "团队名称"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "团队所有者"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "仅团队视图"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "团队网站"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "团队"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "主题"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "本月"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "本周"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "今年"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "时区"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "标题"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "今天"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "切换图表"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "总数"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "总记录数"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "跟踪代码"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "交易"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "转移"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "转移网站"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "是"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "类型"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "独立"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "独立访客"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "独特客户"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "未知"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "未命名"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "更新"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "网址"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "网址"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "用户"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "用户属性"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "用户名"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "用户"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "通过 UTM 参数追踪您的广告活动。"
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "值"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "查看"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "查看更多"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "仅浏览"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "浏览量"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "每次访问的浏览量"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "平均访问时长"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "访客"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "访问次数"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "网站"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "网站 ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "网站"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "窗口"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "昨天"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "请在下方输入框中输入 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " 以确认操作。"
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "当前在线 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 位访客"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "已收集的数据"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "你确定要删除 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 吗?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "你确定要离开 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 吗?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "您确定要移除 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " ?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "您确定要重置 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 的数据吗?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "删除团队也会删除所有团队网站。"
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "所有相关数据将会被删除。"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "发生错误。"
- }
- ],
- "message.event-log": [
- {
- "type": 1,
- "value": "url"
- },
- {
- "type": 0,
- "value": " 上的 "
- },
- {
- "type": 1,
- "value": "event"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "去设置"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "用户名或密码不正确。"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "无效域名"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "密码最短长度为 "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " 个字符"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Umami 新版本 "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " 已发布!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "暂无数据。"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "无可用事件。"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "密码不一致"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "未找到结果。"
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "该团队暂无网站。"
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "您尚未创建任何团队。"
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "暂无用户。"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "你还没有设置任何网站。"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "页面未找到。"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "如确定要重置该网站,请在下面输入 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " 以确认。"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "此网站的所有统计数据将被删除,但您的跟踪代码将保持不变。"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "保存成功。"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "这是 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 的共享链接。"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "你已是该团队的成员。"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "未找到团队。"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "团队成员均可查看网站数据。"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "跟踪代码"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "将此网站转移到您的账户?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "选择要转移此网站的团队。"
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "将网站所有权转移到您的账户或其他团队。"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "触发事件"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "用户已删除。"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "已浏览页面"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "来自 "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " 的访客在搭载 "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " 的 "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " 上使用 "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " 浏览器进行访问。"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "访客减少"
- }
- ]
+ "label": {
+ "access-code": "访问代码",
+ "account": "账户",
+ "action": "行为",
+ "actions": "用户行为",
+ "activity": "活动日志",
+ "add": "添加",
+ "add-board": "添加看板",
+ "add-description": "添加描述",
+ "add-link": "添加链接",
+ "add-member": "添加成员",
+ "add-pixel": "添加像素",
+ "add-step": "添加步骤",
+ "add-website": "添加网站",
+ "admin": "管理员",
+ "affiliate": "联盟",
+ "after": "之后",
+ "all": "所有",
+ "all-time": "所有时间段",
+ "analysis": "分析",
+ "analytics": "分析",
+ "aov": "AOV",
+ "application": "应用",
+ "apply": "应用",
+ "arpu": "ARPU",
+ "attribution": "归因",
+ "attribution-description": "查看用户如何与您的营销互动,以及是什么促成了转化。",
+ "audience": "受众",
+ "average": "平均",
+ "back": "返回",
+ "before": "之前",
+ "behavior": "行为",
+ "block-selector": "块选择器",
+ "boards": "看板",
+ "bounce-rate": "跳出率",
+ "breakdown": "故障",
+ "browser": "浏览器",
+ "browsers": "浏览器",
+ "campaign": "推广活动",
+ "campaigns": "活动",
+ "cancel": "取消",
+ "change-password": "修改密码",
+ "channel": "渠道",
+ "channels": "渠道",
+ "chart": "图表",
+ "cities": "市/县",
+ "city": "市/县",
+ "clear-all": "清除全部",
+ "cls": "CLS",
+ "cohort": "队列",
+ "cohorts": "队列",
+ "compare": "比较",
+ "compare-dates": "比较日期",
+ "confirm": "确认",
+ "confirm-password": "确认密码",
+ "contains": "包含",
+ "content": "内容",
+ "continue": "继续",
+ "conversion": "转化",
+ "conversion-rate": "转化率",
+ "conversion-step": "转化步骤",
+ "count": "统计",
+ "countries": "国家/地区",
+ "country": "国家/地区",
+ "create": "创建",
+ "create-report": "创建报告",
+ "create-team": "创建团队",
+ "create-user": "创建用户",
+ "created": "已创建",
+ "created-by": "创建者",
+ "criteria": "条件",
+ "currency": "货币",
+ "current": "当前",
+ "current-password": "当前密码",
+ "custom-range": "自定义时间段",
+ "dashboard": "仪表盘",
+ "data": "统计数据",
+ "date": "日期",
+ "date-range": "时间段",
+ "day": "日",
+ "default-date-range": "默认时间段",
+ "delete": "删除",
+ "delete-report": "删除报告",
+ "delete-team": "删除团队",
+ "delete-user": "删除用户",
+ "delete-website": "删除网站",
+ "description": "描述",
+ "desktop": "台式机",
+ "destination-url": "目标URL",
+ "details": "详细信息",
+ "device": "设备",
+ "devices": "设备",
+ "direct": "直接",
+ "dismiss": "关闭",
+ "distinct-id": "唯一ID",
+ "documentation": "文档",
+ "does-not-contain": "不包含",
+ "does-not-include": "不包括",
+ "doest-not-exist": "不存在",
+ "domain": "域名",
+ "download": "下载",
+ "dropoff": "丢弃",
+ "duration": "持续时间",
+ "edit": "编辑",
+ "edit-member": "编辑成员",
+ "email": "邮箱",
+ "enable-share-url": "启用共享链接",
+ "end-step": "结束步骤",
+ "entry": "入口 URL",
+ "environment": "环境",
+ "event": "事件",
+ "event-data": "事件数据",
+ "event-name": "事件名称",
+ "events": "行为类别",
+ "exclude-bounce": "排除跳出",
+ "exists": "存在",
+ "exit": "退出 URL",
+ "false": "否",
+ "fcp": "FCP",
+ "field": "字段",
+ "fields": "字段",
+ "filter": "筛选器",
+ "filter-combined": "合并",
+ "filter-raw": "原始",
+ "filters": "筛选",
+ "first-click": "首次点击",
+ "first-seen": "首次出现",
+ "funnel": "分析",
+ "funnel-description": "了解用户的转化率和跳出率。",
+ "funnels": "漏斗",
+ "goal": "目标",
+ "goals": "目标",
+ "goals-description": "跟踪页面浏览量和事件的目标。",
+ "good": "良好",
+ "greater-than": "大于",
+ "greater-than-equals": "大于或等于",
+ "grouped": "分组",
+ "growth": "增长",
+ "hostname": "主机名",
+ "hour": "小时",
+ "includes": "包括",
+ "inp": "INP",
+ "insight": "洞察",
+ "insights": "见解",
+ "insights-description": "通过使用筛选器和划分时间段来更深入地研究数据。",
+ "invalid-url": "无效URL",
+ "is": "等于",
+ "is-false": "否",
+ "is-not": "不等于",
+ "is-not-set": "未设置",
+ "is-set": "已设置",
+ "is-true": "是",
+ "join": "加入",
+ "join-team": "加入团队",
+ "journey": "用户浏览轨迹",
+ "journey-description": "了解用户如何浏览网站。",
+ "journeys": "用户路径",
+ "language": "语言",
+ "languages": "语言",
+ "laptop": "笔记本",
+ "last-click": "最后点击",
+ "last-days": "最近 {x} 天",
+ "last-hours": "最近 {x} 小时",
+ "last-months": "最近 {x} 个月",
+ "last-seen": "最后出现",
+ "lcp": "LCP",
+ "leave": "离开",
+ "leave-team": "离开团队",
+ "less-than": "少于",
+ "less-than-equals": "少于等于",
+ "link": "链接",
+ "links": "链接",
+ "location": "位置",
+ "login": "登录",
+ "logout": "退出",
+ "manage": "管理",
+ "manager": "管理者",
+ "mask-level": "遮罩级别",
+ "match": "匹配",
+ "match-all": "全部",
+ "match-any": "任意",
+ "max": "最大",
+ "max-duration": "最大持续时间",
+ "maximize": "展开",
+ "medium": "中等",
+ "member": "成员",
+ "members": "成员",
+ "min": "最小",
+ "minute": "分钟",
+ "mobile": "手机",
+ "model": "模型",
+ "month": "月",
+ "more": "更多",
+ "my-account": "我的账户",
+ "my-websites": "我的网站",
+ "name": "名字",
+ "needs-improvement": "需要改进",
+ "new-password": "新密码",
+ "none": "无",
+ "number-of-records": "{x} {x, plural, one {条记录} other {条记录}}",
+ "ok": "好的",
+ "online": "在线",
+ "organic-search": "自然搜索",
+ "organic-shopping": "自然购物",
+ "organic-social": "自然社交",
+ "organic-video": "自然视频",
+ "os": "操作系统",
+ "other": "其他",
+ "overview": "概览",
+ "owner": "所有者",
+ "page": "页面",
+ "page-of": "总 {total} 中的第 {current} 页",
+ "page-views": "页面浏览量",
+ "pages": "网页",
+ "pageTitle": "标题",
+ "paid-ads": "付费广告",
+ "paid-search": "付费搜索",
+ "paid-shopping": "付费购物",
+ "paid-social": "付费社交",
+ "paid-video": "付费视频",
+ "password": "密码",
+ "path": "路径",
+ "paths": "路径",
+ "performance": "性能",
+ "pixel": "像素",
+ "pixels": "像素",
+ "play": "播放",
+ "poor": "较差",
+ "powered-by": "由 {name} 提供支持",
+ "preferences": "偏好",
+ "previous": "先前",
+ "previous-period": "上一时期",
+ "previous-year": "上一年",
+ "profile": "个人资料",
+ "profiles": "个人资料",
+ "properties": "属性",
+ "property": "属性",
+ "queries": "查询",
+ "query": "查询",
+ "query-parameters": "查询参数",
+ "realtime": "实时",
+ "recorded": "录制于",
+ "referral": "来源",
+ "referrer": "来源",
+ "referrers": "来源域名",
+ "refresh": "刷新",
+ "regenerate": "重新生成",
+ "regex-match": "匹配正则表达式",
+ "regex-not-match": "不匹配正则表达式",
+ "region": "州/省",
+ "regions": "州/省",
+ "remaining": "剩余",
+ "remove": "移除",
+ "remove-member": "移除成员",
+ "replay": "回放",
+ "replay-enabled": "回放已启用",
+ "replay-id": "Replay ID",
+ "replays": "回放",
+ "reports": "报告",
+ "required": "必填",
+ "reset": "重置",
+ "reset-website": "重置统计数据",
+ "retention": "保留",
+ "retention-days": "保留天数",
+ "retention-description": "通过追踪用户回访频率来衡量您网站的用户粘性。",
+ "revenue": "收入",
+ "revenue-description": "查看随时间变化的收入数据。",
+ "role": "角色",
+ "run-query": "查询",
+ "sample-rate": "采样率",
+ "sample-size": "样本量",
+ "save": "保存",
+ "save-cohort": "保存为群组",
+ "save-segment": "保存为细分",
+ "screen": "屏幕",
+ "screens": "屏幕尺寸",
+ "search": "搜索",
+ "segment": "细分",
+ "segments": "细分",
+ "select": "选择",
+ "select-component": "选择组件",
+ "select-date": "选择日期",
+ "select-filter": "选择筛选器",
+ "select-role": "选择角色",
+ "select-website": "选择网站",
+ "session": "会话",
+ "session-data": "会话数据",
+ "sessions": "会话",
+ "settings": "设置",
+ "share": "分享",
+ "share-url": "共享链接",
+ "single-day": "单日",
+ "slug": "Slug",
+ "sms": "短信",
+ "source": "来源",
+ "sources": "来源",
+ "start-step": "开始步骤",
+ "steps": "步骤",
+ "sum": "总和",
+ "support": "支持",
+ "switch-account": "切换账户",
+ "table": "表格",
+ "tablet": "平板",
+ "tag": "标签",
+ "tags": "标签",
+ "team": "团队",
+ "team-id": "团队 ID",
+ "team-manager": "团队管理员",
+ "team-member": "团队成员",
+ "team-name": "团队名称",
+ "team-owner": "团队所有者",
+ "team-settings": "团队设置",
+ "team-view-only": "仅团队视图",
+ "team-websites": "团队网站",
+ "teams": "团队",
+ "term": "搜索词",
+ "terms": "条款",
+ "theme": "主题",
+ "this-month": "本月",
+ "this-week": "本周",
+ "this-year": "今年",
+ "timezone": "时区",
+ "title": "标题",
+ "today": "今天",
+ "toggle-charts": "切换图表",
+ "total": "总数",
+ "total-records": "总记录数",
+ "tracking-code": "跟踪代码",
+ "traffic": "流量",
+ "transactions": "交易",
+ "transfer": "转移",
+ "transfer-website": "转移网站",
+ "true": "是",
+ "ttfb": "TTFB",
+ "type": "类型",
+ "unique": "独立",
+ "unique-events": "独立事件",
+ "unique-visitors": "独立访客",
+ "uniqueCustomers": "独特客户",
+ "unknown": "未知",
+ "untitled": "未命名",
+ "update": "更新",
+ "url": "URL",
+ "user": "用户",
+ "username": "用户名",
+ "users": "用户",
+ "utm": "UTM",
+ "utm-campaign": "UTM 推广活动",
+ "utm-content": "UTM 内容",
+ "utm-description": "通过 UTM 参数追踪您的广告活动。",
+ "utm-medium": "UTM 媒介",
+ "utm-source": "UTM 来源",
+ "utm-term": "UTM 关键词",
+ "value": "值",
+ "version": "版本",
+ "view": "查看",
+ "view-details": "查看更多",
+ "view-only": "仅浏览",
+ "views": "浏览量",
+ "views-per-visit": "每次访问的浏览量",
+ "visit-duration": "平均访问时长",
+ "visitors": "访客",
+ "visits": "访问次数",
+ "website": "网站",
+ "website-id": "网站 ID",
+ "websites": "网站",
+ "window": "窗口",
+ "yesterday": "昨天"
+ },
+ "message": {
+ "action-confirmation": "请在下方输入框中输入 {confirmation} 以确认操作。",
+ "active-users": "当前在线 {x} 位访客",
+ "bad-request": "请求错误",
+ "collected-data": "已收集的数据",
+ "confirm-delete": "你确定要删除 {target} 吗?",
+ "confirm-leave": "你确定要离开 {target} 吗?",
+ "confirm-remove": "您确定要移除 {target} ?",
+ "confirm-reset": "您确定要重置 {target} 的数据吗?",
+ "delete-team-warning": "删除团队也会删除所有团队网站。",
+ "delete-website-warning": "所有相关数据将会被删除。",
+ "empty-dashboard": "您的仪表板为空。点击编辑以添加您的第一个组件。",
+ "error": "发生错误。",
+ "event-log": "{url} 上的 {event} ",
+ "forbidden": "禁止访问",
+ "go-to-settings": "去设置",
+ "incorrect-username-password": "用户名或密码不正确。",
+ "invalid-domain": "无效域名",
+ "min-password-length": "密码最短长度为 {n} 个字符",
+ "new-version-available": "Umami 新版本 {version} 已发布!",
+ "no-data-available": "暂无数据。",
+ "no-event-data": "无可用事件。",
+ "no-match-password": "密码不一致",
+ "no-results-found": "未找到结果。",
+ "no-team-websites": "该团队暂无网站。",
+ "no-teams": "您尚未创建任何团队。",
+ "no-users": "暂无用户。",
+ "no-websites-configured": "你还没有设置任何网站。",
+ "not-found": "未找到",
+ "nothing-selected": "未选择",
+ "page-not-found": "页面未找到。",
+ "reset-website": "如确定要重置该网站,请在下面输入 {confirmation} 以确认。",
+ "reset-website-warning": "此网站的所有统计数据将被删除,但您的跟踪代码将保持不变。",
+ "saved": "保存成功。",
+ "select-component-preview": "选择一个组件进行预览",
+ "select-website-first": "请先选择一个网站",
+ "sever-error": "服务器错误",
+ "share-url": "这是 {target} 的共享链接。",
+ "team-already-member": "你已是该团队的成员。",
+ "team-not-found": "未找到团队。",
+ "team-websites-info": "团队成员均可查看网站数据。",
+ "tracking-code": "跟踪代码",
+ "transfer-team-website-to-user": "将此网站转移到您的账户?",
+ "transfer-user-website-to-team": "选择要转移此网站的团队。",
+ "transfer-website": "将网站所有权转移到您的账户或其他团队。",
+ "triggered-event": "触发事件",
+ "unauthorized": "未授权",
+ "user-deleted": "用户已删除。",
+ "viewed-page": "已浏览页面",
+ "visitor-log": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 浏览器进行访问。"
+ }
}
diff --git a/public/intl/messages/zh-TW.json b/public/intl/messages/zh-TW.json
index d8fb3d42d..1f644123c 100644
--- a/public/intl/messages/zh-TW.json
+++ b/public/intl/messages/zh-TW.json
@@ -1,1846 +1,422 @@
{
- "label.access-code": [
- {
- "type": 0,
- "value": "存取碼"
- }
- ],
- "label.actions": [
- {
- "type": 0,
- "value": "行為"
- }
- ],
- "label.activity": [
- {
- "type": 0,
- "value": "活動紀錄"
- }
- ],
- "label.add": [
- {
- "type": 0,
- "value": "新增"
- }
- ],
- "label.add-description": [
- {
- "type": 0,
- "value": "新增描述"
- }
- ],
- "label.add-member": [
- {
- "type": 0,
- "value": "新增成員"
- }
- ],
- "label.add-step": [
- {
- "type": 0,
- "value": "新增步驟"
- }
- ],
- "label.add-website": [
- {
- "type": 0,
- "value": "新增網站"
- }
- ],
- "label.admin": [
- {
- "type": 0,
- "value": "管理員"
- }
- ],
- "label.after": [
- {
- "type": 0,
- "value": "之後"
- }
- ],
- "label.all": [
- {
- "type": 0,
- "value": "全部"
- }
- ],
- "label.all-time": [
- {
- "type": 0,
- "value": "所有時間"
- }
- ],
- "label.analytics": [
- {
- "type": 0,
- "value": "分析"
- }
- ],
- "label.average": [
- {
- "type": 0,
- "value": "平均"
- }
- ],
- "label.back": [
- {
- "type": 0,
- "value": "返回"
- }
- ],
- "label.before": [
- {
- "type": 0,
- "value": "之前"
- }
- ],
- "label.bounce-rate": [
- {
- "type": 0,
- "value": "跳出率"
- }
- ],
- "label.breakdown": [
- {
- "type": 0,
- "value": "細項分析"
- }
- ],
- "label.browser": [
- {
- "type": 0,
- "value": "瀏覽器"
- }
- ],
- "label.browsers": [
- {
- "type": 0,
- "value": "瀏覽器"
- }
- ],
- "label.cancel": [
- {
- "type": 0,
- "value": "取消"
- }
- ],
- "label.change-password": [
- {
- "type": 0,
- "value": "更改密碼"
- }
- ],
- "label.cities": [
- {
- "type": 0,
- "value": "城市"
- }
- ],
- "label.city": [
- {
- "type": 0,
- "value": "城市"
- }
- ],
- "label.clear-all": [
- {
- "type": 0,
- "value": "全部清除"
- }
- ],
- "label.compare": [
- {
- "type": 0,
- "value": "比較"
- }
- ],
- "label.confirm": [
- {
- "type": 0,
- "value": "確認"
- }
- ],
- "label.confirm-password": [
- {
- "type": 0,
- "value": "確認密碼"
- }
- ],
- "label.contains": [
- {
- "type": 0,
- "value": "包含"
- }
- ],
- "label.continue": [
- {
- "type": 0,
- "value": "繼續"
- }
- ],
- "label.count": [
- {
- "type": 0,
- "value": "數量"
- }
- ],
- "label.countries": [
- {
- "type": 0,
- "value": "國家"
- }
- ],
- "label.country": [
- {
- "type": 0,
- "value": "國家"
- }
- ],
- "label.create": [
- {
- "type": 0,
- "value": "建立"
- }
- ],
- "label.create-report": [
- {
- "type": 0,
- "value": "建立報表"
- }
- ],
- "label.create-team": [
- {
- "type": 0,
- "value": "建立團隊"
- }
- ],
- "label.create-user": [
- {
- "type": 0,
- "value": "建立使用者"
- }
- ],
- "label.created": [
- {
- "type": 0,
- "value": "已建立"
- }
- ],
- "label.created-by": [
- {
- "type": 0,
- "value": "建立者"
- }
- ],
- "label.current": [
- {
- "type": 0,
- "value": "目前"
- }
- ],
- "label.current-password": [
- {
- "type": 0,
- "value": "目前密碼"
- }
- ],
- "label.custom-range": [
- {
- "type": 0,
- "value": "自訂範圍"
- }
- ],
- "label.dashboard": [
- {
- "type": 0,
- "value": "儀表板"
- }
- ],
- "label.data": [
- {
- "type": 0,
- "value": "資料"
- }
- ],
- "label.date": [
- {
- "type": 0,
- "value": "日期"
- }
- ],
- "label.date-range": [
- {
- "type": 0,
- "value": "日期範圍"
- }
- ],
- "label.day": [
- {
- "type": 0,
- "value": "日"
- }
- ],
- "label.default-date-range": [
- {
- "type": 0,
- "value": "預設日期範圍"
- }
- ],
- "label.delete": [
- {
- "type": 0,
- "value": "刪除"
- }
- ],
- "label.delete-report": [
- {
- "type": 0,
- "value": "刪除報表"
- }
- ],
- "label.delete-team": [
- {
- "type": 0,
- "value": "刪除團隊"
- }
- ],
- "label.delete-user": [
- {
- "type": 0,
- "value": "刪除使用者"
- }
- ],
- "label.delete-website": [
- {
- "type": 0,
- "value": "刪除網站"
- }
- ],
- "label.description": [
- {
- "type": 0,
- "value": "描述"
- }
- ],
- "label.desktop": [
- {
- "type": 0,
- "value": "桌上型電腦"
- }
- ],
- "label.details": [
- {
- "type": 0,
- "value": "詳細資訊"
- }
- ],
- "label.device": [
- {
- "type": 0,
- "value": "裝置"
- }
- ],
- "label.devices": [
- {
- "type": 0,
- "value": "裝置"
- }
- ],
- "label.dismiss": [
- {
- "type": 0,
- "value": "關閉"
- }
- ],
- "label.does-not-contain": [
- {
- "type": 0,
- "value": "不包含"
- }
- ],
- "label.domain": [
- {
- "type": 0,
- "value": "網域"
- }
- ],
- "label.dropoff": [
- {
- "type": 0,
- "value": "離開"
- }
- ],
- "label.edit": [
- {
- "type": 0,
- "value": "編輯"
- }
- ],
- "label.edit-dashboard": [
- {
- "type": 0,
- "value": "編輯儀表板"
- }
- ],
- "label.edit-member": [
- {
- "type": 0,
- "value": "編輯成員"
- }
- ],
- "label.enable-share-url": [
- {
- "type": 0,
- "value": "啟用分享連結"
- }
- ],
- "label.end-step": [
- {
- "type": 0,
- "value": "結束步驟"
- }
- ],
- "label.entry": [
- {
- "type": 0,
- "value": "進入網址"
- }
- ],
- "label.event": [
- {
- "type": 0,
- "value": "事件"
- }
- ],
- "label.event-data": [
- {
- "type": 0,
- "value": "事件資料"
- }
- ],
- "label.events": [
- {
- "type": 0,
- "value": "事件"
- }
- ],
- "label.exit": [
- {
- "type": 0,
- "value": "離開網址"
- }
- ],
- "label.false": [
- {
- "type": 0,
- "value": "否"
- }
- ],
- "label.field": [
- {
- "type": 0,
- "value": "欄位"
- }
- ],
- "label.fields": [
- {
- "type": 0,
- "value": "欄位"
- }
- ],
- "label.filter": [
- {
- "type": 0,
- "value": "篩選器"
- }
- ],
- "label.filter-combined": [
- {
- "type": 0,
- "value": "組合"
- }
- ],
- "label.filter-raw": [
- {
- "type": 0,
- "value": "原始"
- }
- ],
- "label.filters": [
- {
- "type": 0,
- "value": "篩選條件"
- }
- ],
- "label.first-seen": [
- {
- "type": 0,
- "value": "首次造訪"
- }
- ],
- "label.funnel": [
- {
- "type": 0,
- "value": "漏斗分析"
- }
- ],
- "label.funnel-description": [
- {
- "type": 0,
- "value": "瞭解使用者的轉換率與流失率。"
- }
- ],
- "label.goal": [
- {
- "type": 0,
- "value": "目標"
- }
- ],
- "label.goals": [
- {
- "type": 0,
- "value": "目標"
- }
- ],
- "label.goals-description": [
- {
- "type": 0,
- "value": "追蹤網頁瀏覽和事件的目標。"
- }
- ],
- "label.greater-than": [
- {
- "type": 0,
- "value": "大於"
- }
- ],
- "label.greater-than-equals": [
- {
- "type": 0,
- "value": "大於或等於"
- }
- ],
- "label.host": [
- {
- "type": 0,
- "value": "主機名稱"
- }
- ],
- "label.hosts": [
- {
- "type": 0,
- "value": "主機名稱"
- }
- ],
- "label.insights": [
- {
- "type": 0,
- "value": "洞察"
- }
- ],
- "label.insights-description": [
- {
- "type": 0,
- "value": "使用區段和篩選器來深入分析您的資料。"
- }
- ],
- "label.is": [
- {
- "type": 0,
- "value": "是"
- }
- ],
- "label.is-not": [
- {
- "type": 0,
- "value": "不是"
- }
- ],
- "label.is-not-set": [
- {
- "type": 0,
- "value": "未設定"
- }
- ],
- "label.is-set": [
- {
- "type": 0,
- "value": "已設定"
- }
- ],
- "label.join": [
- {
- "type": 0,
- "value": "加入"
- }
- ],
- "label.join-team": [
- {
- "type": 0,
- "value": "加入團隊"
- }
- ],
- "label.journey": [
- {
- "type": 0,
- "value": "使用者旅程"
- }
- ],
- "label.journey-description": [
- {
- "type": 0,
- "value": "瞭解使用者如何瀏覽您的網站。"
- }
- ],
- "label.language": [
- {
- "type": 0,
- "value": "語言"
- }
- ],
- "label.languages": [
- {
- "type": 0,
- "value": "語言"
- }
- ],
- "label.laptop": [
- {
- "type": 0,
- "value": "筆記型電腦"
- }
- ],
- "label.last-days": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 天"
- }
- ],
- "label.last-hours": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 小時"
- }
- ],
- "label.last-months": [
- {
- "type": 0,
- "value": "最近 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 個月"
- }
- ],
- "label.last-seen": [
- {
- "type": 0,
- "value": "最後造訪"
- }
- ],
- "label.leave": [
- {
- "type": 0,
- "value": "離開"
- }
- ],
- "label.leave-team": [
- {
- "type": 0,
- "value": "離開團隊"
- }
- ],
- "label.less-than": [
- {
- "type": 0,
- "value": "小於"
- }
- ],
- "label.less-than-equals": [
- {
- "type": 0,
- "value": "小於或等於"
- }
- ],
- "label.login": [
- {
- "type": 0,
- "value": "登入"
- }
- ],
- "label.logout": [
- {
- "type": 0,
- "value": "登出"
- }
- ],
- "label.manage": [
- {
- "type": 0,
- "value": "管理"
- }
- ],
- "label.manager": [
- {
- "type": 0,
- "value": "管理者"
- }
- ],
- "label.max": [
- {
- "type": 0,
- "value": "最大值"
- }
- ],
- "label.member": [
- {
- "type": 0,
- "value": "成員"
- }
- ],
- "label.members": [
- {
- "type": 0,
- "value": "成員"
- }
- ],
- "label.min": [
- {
- "type": 0,
- "value": "最小值"
- }
- ],
- "label.mobile": [
- {
- "type": 0,
- "value": "行動裝置"
- }
- ],
- "label.more": [
- {
- "type": 0,
- "value": "更多"
- }
- ],
- "label.my-account": [
- {
- "type": 0,
- "value": "我的帳號"
- }
- ],
- "label.my-websites": [
- {
- "type": 0,
- "value": "我的網站"
- }
- ],
- "label.name": [
- {
- "type": 0,
- "value": "名稱"
- }
- ],
- "label.new-password": [
- {
- "type": 0,
- "value": "新密碼"
- }
- ],
- "label.none": [
- {
- "type": 0,
- "value": "無"
- }
- ],
- "label.number-of-records": [
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 筆紀錄"
- }
- ],
- "label.ok": [
- {
- "type": 0,
- "value": "OK"
- }
- ],
- "label.os": [
- {
- "type": 0,
- "value": "作業系統"
- }
- ],
- "label.overview": [
- {
- "type": 0,
- "value": "總覽"
- }
- ],
- "label.owner": [
- {
- "type": 0,
- "value": "擁有者"
- }
- ],
- "label.page-of": [
- {
- "type": 0,
- "value": "第 "
- },
- {
- "type": 1,
- "value": "current"
- },
- {
- "type": 0,
- "value": " 頁,共 "
- },
- {
- "type": 1,
- "value": "total"
- },
- {
- "type": 0,
- "value": " 頁"
- }
- ],
- "label.page-views": [
- {
- "type": 0,
- "value": "網頁瀏覽次數"
- }
- ],
- "label.pageTitle": [
- {
- "type": 0,
- "value": "網頁標題"
- }
- ],
- "label.pages": [
- {
- "type": 0,
- "value": "網頁"
- }
- ],
- "label.password": [
- {
- "type": 0,
- "value": "密碼"
- }
- ],
- "label.path": [
- {
- "type": 0,
- "value": "路徑"
- }
- ],
- "label.paths": [
- {
- "type": 0,
- "value": "路徑"
- }
- ],
- "label.powered-by": [
- {
- "type": 0,
- "value": "由 "
- },
- {
- "type": 1,
- "value": "name"
- },
- {
- "type": 0,
- "value": " 提供技術支援"
- }
- ],
- "label.previous": [
- {
- "type": 0,
- "value": "上一個"
- }
- ],
- "label.previous-period": [
- {
- "type": 0,
- "value": "上一期間"
- }
- ],
- "label.previous-year": [
- {
- "type": 0,
- "value": "去年"
- }
- ],
- "label.profile": [
- {
- "type": 0,
- "value": "個人檔案"
- }
- ],
- "label.properties": [
- {
- "type": 0,
- "value": "屬性"
- }
- ],
- "label.property": [
- {
- "type": 0,
- "value": "屬性"
- }
- ],
- "label.queries": [
- {
- "type": 0,
- "value": "查詢"
- }
- ],
- "label.query": [
- {
- "type": 0,
- "value": "查詢"
- }
- ],
- "label.query-parameters": [
- {
- "type": 0,
- "value": "查詢參數"
- }
- ],
- "label.realtime": [
- {
- "type": 0,
- "value": "即時"
- }
- ],
- "label.referrer": [
- {
- "type": 0,
- "value": "參照來源"
- }
- ],
- "label.referrers": [
- {
- "type": 0,
- "value": "參照來源"
- }
- ],
- "label.refresh": [
- {
- "type": 0,
- "value": "重新整理"
- }
- ],
- "label.regenerate": [
- {
- "type": 0,
- "value": "重新產生"
- }
- ],
- "label.region": [
- {
- "type": 0,
- "value": "地區"
- }
- ],
- "label.regions": [
- {
- "type": 0,
- "value": "地區"
- }
- ],
- "label.remove": [
- {
- "type": 0,
- "value": "移除"
- }
- ],
- "label.remove-member": [
- {
- "type": 0,
- "value": "移除成員"
- }
- ],
- "label.reports": [
- {
- "type": 0,
- "value": "報表"
- }
- ],
- "label.required": [
- {
- "type": 0,
- "value": "必填"
- }
- ],
- "label.reset": [
- {
- "type": 0,
- "value": "重設"
- }
- ],
- "label.reset-website": [
- {
- "type": 0,
- "value": "重設網站統計資料"
- }
- ],
- "label.retention": [
- {
- "type": 0,
- "value": "留存率"
- }
- ],
- "label.retention-description": [
- {
- "type": 0,
- "value": "透過追蹤使用者回訪的頻率來衡量您的網站黏著度。"
- }
- ],
- "label.revenue": [
- {
- "type": 0,
- "value": "營收"
- }
- ],
- "label.revenue-description": [
- {
- "type": 0,
- "value": "查看您的營收趨勢。"
- }
- ],
- "label.revenue-property": [
- {
- "type": 0,
- "value": "營收屬性"
- }
- ],
- "label.role": [
- {
- "type": 0,
- "value": "角色"
- }
- ],
- "label.run-query": [
- {
- "type": 0,
- "value": "執行查詢"
- }
- ],
- "label.save": [
- {
- "type": 0,
- "value": "儲存"
- }
- ],
- "label.screens": [
- {
- "type": 0,
- "value": "螢幕"
- }
- ],
- "label.search": [
- {
- "type": 0,
- "value": "搜尋"
- }
- ],
- "label.select": [
- {
- "type": 0,
- "value": "選取"
- }
- ],
- "label.select-date": [
- {
- "type": 0,
- "value": "選取日期"
- }
- ],
- "label.select-role": [
- {
- "type": 0,
- "value": "選取角色"
- }
- ],
- "label.select-website": [
- {
- "type": 0,
- "value": "選取網站"
- }
- ],
- "label.session": [
- {
- "type": 0,
- "value": "工作階段"
- }
- ],
- "label.sessions": [
- {
- "type": 0,
- "value": "工作階段"
- }
- ],
- "label.settings": [
- {
- "type": 0,
- "value": "設定"
- }
- ],
- "label.share-url": [
- {
- "type": 0,
- "value": "分享連結"
- }
- ],
- "label.single-day": [
- {
- "type": 0,
- "value": "單日"
- }
- ],
- "label.start-step": [
- {
- "type": 0,
- "value": "起始步驟"
- }
- ],
- "label.steps": [
- {
- "type": 0,
- "value": "步驟"
- }
- ],
- "label.sum": [
- {
- "type": 0,
- "value": "總和"
- }
- ],
- "label.tablet": [
- {
- "type": 0,
- "value": "平板"
- }
- ],
- "label.team": [
- {
- "type": 0,
- "value": "團隊"
- }
- ],
- "label.team-id": [
- {
- "type": 0,
- "value": "團隊 ID"
- }
- ],
- "label.team-manager": [
- {
- "type": 0,
- "value": "團隊管理者"
- }
- ],
- "label.team-member": [
- {
- "type": 0,
- "value": "團隊成員"
- }
- ],
- "label.team-name": [
- {
- "type": 0,
- "value": "團隊名稱"
- }
- ],
- "label.team-owner": [
- {
- "type": 0,
- "value": "團隊擁有者"
- }
- ],
- "label.team-view-only": [
- {
- "type": 0,
- "value": "團隊僅供檢視"
- }
- ],
- "label.team-websites": [
- {
- "type": 0,
- "value": "團隊網站"
- }
- ],
- "label.teams": [
- {
- "type": 0,
- "value": "團隊"
- }
- ],
- "label.theme": [
- {
- "type": 0,
- "value": "主題"
- }
- ],
- "label.this-month": [
- {
- "type": 0,
- "value": "本月"
- }
- ],
- "label.this-week": [
- {
- "type": 0,
- "value": "本週"
- }
- ],
- "label.this-year": [
- {
- "type": 0,
- "value": "今年"
- }
- ],
- "label.timezone": [
- {
- "type": 0,
- "value": "時區"
- }
- ],
- "label.title": [
- {
- "type": 0,
- "value": "標題"
- }
- ],
- "label.today": [
- {
- "type": 0,
- "value": "今天"
- }
- ],
- "label.toggle-charts": [
- {
- "type": 0,
- "value": "切換圖表"
- }
- ],
- "label.total": [
- {
- "type": 0,
- "value": "總計"
- }
- ],
- "label.total-records": [
- {
- "type": 0,
- "value": "紀錄總數"
- }
- ],
- "label.tracking-code": [
- {
- "type": 0,
- "value": "追蹤代碼"
- }
- ],
- "label.transactions": [
- {
- "type": 0,
- "value": "交易"
- }
- ],
- "label.transfer": [
- {
- "type": 0,
- "value": "轉移"
- }
- ],
- "label.transfer-website": [
- {
- "type": 0,
- "value": "轉移網站"
- }
- ],
- "label.true": [
- {
- "type": 0,
- "value": "是"
- }
- ],
- "label.type": [
- {
- "type": 0,
- "value": "類型"
- }
- ],
- "label.unique": [
- {
- "type": 0,
- "value": "不重複"
- }
- ],
- "label.unique-visitors": [
- {
- "type": 0,
- "value": "不重複訪客"
- }
- ],
- "label.uniqueCustomers": [
- {
- "type": 0,
- "value": "不重複客戶"
- }
- ],
- "label.unknown": [
- {
- "type": 0,
- "value": "未知"
- }
- ],
- "label.untitled": [
- {
- "type": 0,
- "value": "未命名"
- }
- ],
- "label.update": [
- {
- "type": 0,
- "value": "更新"
- }
- ],
- "label.url": [
- {
- "type": 0,
- "value": "網址"
- }
- ],
- "label.urls": [
- {
- "type": 0,
- "value": "網址"
- }
- ],
- "label.user": [
- {
- "type": 0,
- "value": "使用者"
- }
- ],
- "label.user-property": [
- {
- "type": 0,
- "value": "使用者屬性"
- }
- ],
- "label.username": [
- {
- "type": 0,
- "value": "使用者名稱"
- }
- ],
- "label.users": [
- {
- "type": 0,
- "value": "使用者"
- }
- ],
- "label.utm": [
- {
- "type": 0,
- "value": "UTM"
- }
- ],
- "label.utm-description": [
- {
- "type": 0,
- "value": "透過 UTM 參數追蹤您的行銷活動。"
- }
- ],
- "label.value": [
- {
- "type": 0,
- "value": "值"
- }
- ],
- "label.view": [
- {
- "type": 0,
- "value": "檢視"
- }
- ],
- "label.view-details": [
- {
- "type": 0,
- "value": "檢視詳細資訊"
- }
- ],
- "label.view-only": [
- {
- "type": 0,
- "value": "僅供檢視"
- }
- ],
- "label.views": [
- {
- "type": 0,
- "value": "瀏覽次數"
- }
- ],
- "label.views-per-visit": [
- {
- "type": 0,
- "value": "每次造訪的瀏覽次數"
- }
- ],
- "label.visit-duration": [
- {
- "type": 0,
- "value": "造訪時間"
- }
- ],
- "label.visitors": [
- {
- "type": 0,
- "value": "訪客"
- }
- ],
- "label.visits": [
- {
- "type": 0,
- "value": "造訪次數"
- }
- ],
- "label.website": [
- {
- "type": 0,
- "value": "網站"
- }
- ],
- "label.website-id": [
- {
- "type": 0,
- "value": "網站 ID"
- }
- ],
- "label.websites": [
- {
- "type": 0,
- "value": "網站"
- }
- ],
- "label.window": [
- {
- "type": 0,
- "value": "視窗"
- }
- ],
- "label.yesterday": [
- {
- "type": 0,
- "value": "昨天"
- }
- ],
- "message.action-confirmation": [
- {
- "type": 0,
- "value": "請在下方欄位輸入 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " 以確認。"
- }
- ],
- "message.active-users": [
- {
- "type": 0,
- "value": "目前有 "
- },
- {
- "type": 1,
- "value": "x"
- },
- {
- "type": 0,
- "value": " 位訪客"
- }
- ],
- "message.collected-data": [
- {
- "type": 0,
- "value": "已蒐集的資料"
- }
- ],
- "message.confirm-delete": [
- {
- "type": 0,
- "value": "您確定要刪除 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 嗎?"
- }
- ],
- "message.confirm-leave": [
- {
- "type": 0,
- "value": "您確定要離開 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 嗎?"
- }
- ],
- "message.confirm-remove": [
- {
- "type": 0,
- "value": "您確定要移除 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 嗎?"
- }
- ],
- "message.confirm-reset": [
- {
- "type": 0,
- "value": "您確定要重設 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": " 的統計資料嗎?"
- }
- ],
- "message.delete-team-warning": [
- {
- "type": 0,
- "value": "刪除團隊的同時也會刪除所有團隊的網站。"
- }
- ],
- "message.delete-website-warning": [
- {
- "type": 0,
- "value": "所有網站資料都將被刪除。"
- }
- ],
- "message.error": [
- {
- "type": 0,
- "value": "發生錯誤。"
- }
- ],
- "message.event-log": [
- {
- "type": 0,
- "value": "在 "
- },
- {
- "type": 1,
- "value": "url"
- },
- {
- "type": 0,
- "value": " 上的 "
- },
- {
- "type": 1,
- "value": "event"
- }
- ],
- "message.go-to-settings": [
- {
- "type": 0,
- "value": "前往設定"
- }
- ],
- "message.incorrect-username-password": [
- {
- "type": 0,
- "value": "使用者名稱或密碼不正確。"
- }
- ],
- "message.invalid-domain": [
- {
- "type": 0,
- "value": "無效的網域。請勿包含 http/https。"
- }
- ],
- "message.min-password-length": [
- {
- "type": 0,
- "value": "密碼長度至少需 "
- },
- {
- "type": 1,
- "value": "n"
- },
- {
- "type": 0,
- "value": " 個字元"
- }
- ],
- "message.new-version-available": [
- {
- "type": 0,
- "value": "Umami "
- },
- {
- "type": 1,
- "value": "version"
- },
- {
- "type": 0,
- "value": " 的新版本已推出!"
- }
- ],
- "message.no-data-available": [
- {
- "type": 0,
- "value": "沒有可用的資料。"
- }
- ],
- "message.no-event-data": [
- {
- "type": 0,
- "value": "沒有可用的事件資料。"
- }
- ],
- "message.no-match-password": [
- {
- "type": 0,
- "value": "密碼不一致。"
- }
- ],
- "message.no-results-found": [
- {
- "type": 0,
- "value": "找不到結果。"
- }
- ],
- "message.no-team-websites": [
- {
- "type": 0,
- "value": "此團隊沒有任何網站。"
- }
- ],
- "message.no-teams": [
- {
- "type": 0,
- "value": "您尚未建立任何團隊。"
- }
- ],
- "message.no-users": [
- {
- "type": 0,
- "value": "沒有任何使用者。"
- }
- ],
- "message.no-websites-configured": [
- {
- "type": 0,
- "value": "您尚未設定任何網站。"
- }
- ],
- "message.page-not-found": [
- {
- "type": 0,
- "value": "找不到網頁"
- }
- ],
- "message.reset-website": [
- {
- "type": 0,
- "value": "要重設此網站的統計資料,請在下方欄位輸入 "
- },
- {
- "type": 1,
- "value": "confirmation"
- },
- {
- "type": 0,
- "value": " 以確認。"
- }
- ],
- "message.reset-website-warning": [
- {
- "type": 0,
- "value": "此網站的所有統計資料都將被刪除,但您的設定將保持不變。"
- }
- ],
- "message.saved": [
- {
- "type": 0,
- "value": "已儲存。"
- }
- ],
- "message.share-url": [
- {
- "type": 0,
- "value": "您的網站統計資料可在以下網址公開檢視:"
- }
- ],
- "message.team-already-member": [
- {
- "type": 0,
- "value": "您已是該團隊的成員。"
- }
- ],
- "message.team-not-found": [
- {
- "type": 0,
- "value": "找不到團隊。"
- }
- ],
- "message.team-websites-info": [
- {
- "type": 0,
- "value": "團隊中的所有成員都可以檢視網站。"
- }
- ],
- "message.tracking-code": [
- {
- "type": 0,
- "value": "要追蹤此網站的統計資料,請將以下程式碼放在您 HTML 的 "
- },
- {
- "children": [
- {
- "type": 0,
- "value": "..."
- }
- ],
- "type": 8,
- "value": "head"
- },
- {
- "type": 0,
- "value": " 區段中。"
- }
- ],
- "message.transfer-team-website-to-user": [
- {
- "type": 0,
- "value": "要將此網站轉移至您的帳號嗎?"
- }
- ],
- "message.transfer-user-website-to-team": [
- {
- "type": 0,
- "value": "請選擇要轉移此網站的團隊。"
- }
- ],
- "message.transfer-website": [
- {
- "type": 0,
- "value": "將網站所有權轉移至您的帳號或其他團隊。"
- }
- ],
- "message.triggered-event": [
- {
- "type": 0,
- "value": "已觸發的事件"
- }
- ],
- "message.user-deleted": [
- {
- "type": 0,
- "value": "使用者已刪除。"
- }
- ],
- "message.viewed-page": [
- {
- "type": 0,
- "value": "已瀏覽的網頁"
- }
- ],
- "message.visitor-log": [
- {
- "type": 0,
- "value": "來自 "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": " 的訪客在 "
- },
- {
- "type": 1,
- "value": "device"
- },
- {
- "type": 0,
- "value": " 上的 "
- },
- {
- "type": 1,
- "value": "os"
- },
- {
- "type": 0,
- "value": " 使用 "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": " 瀏覽。"
- }
- ],
- "message.visitors-dropped-off": [
- {
- "type": 0,
- "value": "訪客已離開"
- }
- ]
+ "label": {
+ "access-code": "存取碼",
+ "account": "帳號",
+ "action": "動作",
+ "actions": "行為",
+ "activity": "活動紀錄",
+ "add": "新增",
+ "add-board": "新增看板",
+ "add-description": "新增描述",
+ "add-link": "新增連結",
+ "add-member": "新增成員",
+ "add-pixel": "新增像素",
+ "add-step": "新增步驟",
+ "add-website": "新增網站",
+ "admin": "管理員",
+ "affiliate": "聯盟",
+ "after": "之後",
+ "all": "全部",
+ "all-time": "所有時間",
+ "analysis": "分析",
+ "analytics": "分析",
+ "aov": "AOV",
+ "application": "應用程式",
+ "apply": "套用",
+ "arpu": "ARPU",
+ "attribution": "歸因",
+ "attribution-description": "查看使用者如何與您的行銷互動,以及什麼促成了轉換。",
+ "audience": "受眾",
+ "average": "平均",
+ "back": "返回",
+ "before": "之前",
+ "behavior": "行為",
+ "block-selector": "區塊選擇器",
+ "boards": "看板",
+ "bounce-rate": "跳出率",
+ "breakdown": "細項分析",
+ "browser": "瀏覽器",
+ "browsers": "瀏覽器",
+ "campaign": "活動",
+ "campaigns": "活動",
+ "cancel": "取消",
+ "change-password": "更改密碼",
+ "channel": "頻道",
+ "channels": "頻道",
+ "chart": "圖表",
+ "cities": "城市",
+ "city": "城市",
+ "clear-all": "全部清除",
+ "cls": "CLS",
+ "cohort": "群組",
+ "cohorts": "群組",
+ "compare": "比較",
+ "compare-dates": "比較日期",
+ "confirm": "確認",
+ "confirm-password": "確認密碼",
+ "contains": "包含",
+ "content": "內容",
+ "continue": "繼續",
+ "conversion": "轉換",
+ "conversion-rate": "轉換率",
+ "conversion-step": "轉換步驟",
+ "count": "數量",
+ "countries": "國家",
+ "country": "國家",
+ "create": "建立",
+ "create-report": "建立報表",
+ "create-team": "建立團隊",
+ "create-user": "建立使用者",
+ "created": "已建立",
+ "created-by": "建立者",
+ "criteria": "條件",
+ "currency": "貨幣",
+ "current": "目前",
+ "current-password": "目前密碼",
+ "custom-range": "自訂範圍",
+ "dashboard": "儀表板",
+ "data": "資料",
+ "date": "日期",
+ "date-range": "日期範圍",
+ "day": "日",
+ "default-date-range": "預設日期範圍",
+ "delete": "刪除",
+ "delete-report": "刪除報表",
+ "delete-team": "刪除團隊",
+ "delete-user": "刪除使用者",
+ "delete-website": "刪除網站",
+ "description": "描述",
+ "desktop": "桌上型電腦",
+ "destination-url": "目標網址",
+ "details": "詳細資訊",
+ "device": "裝置",
+ "devices": "裝置",
+ "direct": "直接",
+ "dismiss": "關閉",
+ "distinct-id": "唯一識別碼",
+ "documentation": "說明文件",
+ "does-not-contain": "不包含",
+ "does-not-include": "不包含",
+ "doest-not-exist": "不存在",
+ "domain": "網域",
+ "download": "下載",
+ "dropoff": "離開",
+ "duration": "持續時間",
+ "edit": "編輯",
+ "edit-member": "編輯成員",
+ "email": "電子郵件",
+ "enable-share-url": "啟用分享連結",
+ "end-step": "結束步驟",
+ "entry": "進入網址",
+ "environment": "環境",
+ "event": "事件",
+ "event-data": "事件資料",
+ "event-name": "事件名稱",
+ "events": "事件",
+ "exclude-bounce": "排除跳出",
+ "exists": "存在",
+ "exit": "離開網址",
+ "false": "否",
+ "fcp": "FCP",
+ "field": "欄位",
+ "fields": "欄位",
+ "filter": "篩選器",
+ "filter-combined": "組合",
+ "filter-raw": "原始",
+ "filters": "篩選條件",
+ "first-click": "首次點擊",
+ "first-seen": "首次造訪",
+ "funnel": "漏斗分析",
+ "funnel-description": "瞭解使用者的轉換率與流失率。",
+ "funnels": "漏斗",
+ "goal": "目標",
+ "goals": "目標",
+ "goals-description": "追蹤網頁瀏覽和事件的目標。",
+ "good": "良好",
+ "greater-than": "大於",
+ "greater-than-equals": "大於或等於",
+ "grouped": "已分組",
+ "growth": "成長",
+ "hostname": "主機名稱",
+ "hour": "小時",
+ "includes": "包含",
+ "inp": "INP",
+ "insight": "洞察",
+ "insights": "洞察",
+ "insights-description": "使用區段和篩選器來深入分析您的資料。",
+ "invalid-url": "無效的網址",
+ "is": "是",
+ "is-false": "為否",
+ "is-not": "不是",
+ "is-not-set": "未設定",
+ "is-set": "已設定",
+ "is-true": "為是",
+ "join": "加入",
+ "join-team": "加入團隊",
+ "journey": "使用者旅程",
+ "journey-description": "瞭解使用者如何瀏覽您的網站。",
+ "journeys": "使用者旅程",
+ "language": "語言",
+ "languages": "語言",
+ "laptop": "筆記型電腦",
+ "last-click": "最後點擊",
+ "last-days": "最近 {x} 天",
+ "last-hours": "最近 {x} 小時",
+ "last-months": "最近 {x} 個月",
+ "last-seen": "最後造訪",
+ "lcp": "LCP",
+ "leave": "離開",
+ "leave-team": "離開團隊",
+ "less-than": "小於",
+ "less-than-equals": "小於或等於",
+ "link": "連結",
+ "links": "連結",
+ "location": "位置",
+ "login": "登入",
+ "logout": "登出",
+ "manage": "管理",
+ "manager": "管理者",
+ "mask-level": "遮罩層級",
+ "match": "符合",
+ "match-all": "全部",
+ "match-any": "任意",
+ "max": "最大值",
+ "max-duration": "最大持續時間",
+ "maximize": "Expand",
+ "medium": "媒介",
+ "member": "成員",
+ "members": "成員",
+ "min": "最小值",
+ "minute": "分鐘",
+ "mobile": "行動裝置",
+ "model": "型號",
+ "month": "月",
+ "more": "更多",
+ "my-account": "我的帳號",
+ "my-websites": "我的網站",
+ "name": "名稱",
+ "needs-improvement": "需要改善",
+ "new-password": "新密碼",
+ "none": "無",
+ "number-of-records": "{x} 筆紀錄",
+ "ok": "確定",
+ "online": "線上",
+ "organic-search": "自然搜尋",
+ "organic-shopping": "自然購物",
+ "organic-social": "自然社群",
+ "organic-video": "自然影片",
+ "os": "作業系統",
+ "other": "其他",
+ "overview": "總覽",
+ "owner": "擁有者",
+ "page": "頁面",
+ "page-of": "第 {current} 頁,共 {total} 頁",
+ "page-views": "網頁瀏覽次數",
+ "pages": "網頁",
+ "pageTitle": "網頁標題",
+ "paid-ads": "付費廣告",
+ "paid-search": "付費搜尋",
+ "paid-shopping": "付費購物",
+ "paid-social": "付費社群",
+ "paid-video": "付費影片",
+ "password": "密碼",
+ "path": "路徑",
+ "paths": "路徑",
+ "performance": "效能",
+ "pixel": "像素",
+ "pixels": "像素",
+ "play": "播放",
+ "poor": "較差",
+ "powered-by": "由 {name} 提供技術支援",
+ "preferences": "偏好設定",
+ "previous": "上一個",
+ "previous-period": "上一期間",
+ "previous-year": "去年",
+ "profile": "個人檔案",
+ "profiles": "個人檔案",
+ "properties": "屬性",
+ "property": "屬性",
+ "queries": "查詢",
+ "query": "查詢",
+ "query-parameters": "查詢參數",
+ "realtime": "即時",
+ "recorded": "錄製於",
+ "referral": "推薦",
+ "referrer": "參照來源",
+ "referrers": "參照來源",
+ "refresh": "重新整理",
+ "regenerate": "重新產生",
+ "regex-match": "符合正則表達式",
+ "regex-not-match": "不符合正則表達式",
+ "region": "地區",
+ "regions": "地區",
+ "remaining": "剩餘",
+ "remove": "移除",
+ "remove-member": "移除成員",
+ "replay": "回放",
+ "replay-enabled": "回放已啟用",
+ "replay-id": "Replay ID",
+ "replays": "回放",
+ "reports": "報表",
+ "required": "必填",
+ "reset": "重設",
+ "reset-website": "重設網站統計資料",
+ "retention": "留存率",
+ "retention-days": "保留天數",
+ "retention-description": "透過追蹤使用者回訪的頻率來衡量您的網站黏著度。",
+ "revenue": "營收",
+ "revenue-description": "查看您的營收趨勢。",
+ "role": "角色",
+ "run-query": "執行查詢",
+ "sample-rate": "取樣率",
+ "sample-size": "樣本量",
+ "save": "儲存",
+ "save-cohort": "儲存群組",
+ "save-segment": "儲存區段",
+ "screen": "螢幕",
+ "screens": "螢幕",
+ "search": "搜尋",
+ "segment": "區段",
+ "segments": "區段",
+ "select": "選取",
+ "select-component": "選擇元件",
+ "select-date": "選取日期",
+ "select-filter": "選取篩選條件",
+ "select-role": "選取角色",
+ "select-website": "選取網站",
+ "session": "工作階段",
+ "session-data": "工作階段資料",
+ "sessions": "工作階段",
+ "settings": "設定",
+ "share": "分享",
+ "share-url": "分享連結",
+ "single-day": "單日",
+ "slug": "Slug",
+ "sms": "簡訊",
+ "source": "來源",
+ "sources": "來源",
+ "start-step": "起始步驟",
+ "steps": "步驟",
+ "sum": "總和",
+ "support": "支援",
+ "switch-account": "切換帳號",
+ "table": "表格",
+ "tablet": "平板",
+ "tag": "標籤",
+ "tags": "標籤",
+ "team": "團隊",
+ "team-id": "團隊 ID",
+ "team-manager": "團隊管理者",
+ "team-member": "團隊成員",
+ "team-name": "團隊名稱",
+ "team-owner": "團隊擁有者",
+ "team-settings": "團隊設定",
+ "team-view-only": "團隊僅供檢視",
+ "team-websites": "團隊網站",
+ "teams": "團隊",
+ "term": "搜尋詞",
+ "terms": "條款",
+ "theme": "主題",
+ "this-month": "本月",
+ "this-week": "本週",
+ "this-year": "今年",
+ "timezone": "時區",
+ "title": "標題",
+ "today": "今天",
+ "toggle-charts": "切換圖表",
+ "total": "總計",
+ "total-records": "紀錄總數",
+ "tracking-code": "追蹤代碼",
+ "traffic": "流量",
+ "transactions": "交易",
+ "transfer": "轉移",
+ "transfer-website": "轉移網站",
+ "true": "是",
+ "ttfb": "TTFB",
+ "type": "類型",
+ "unique": "不重複",
+ "unique-events": "不重複事件",
+ "unique-visitors": "不重複訪客",
+ "uniqueCustomers": "不重複客戶",
+ "unknown": "未知",
+ "untitled": "未命名",
+ "update": "更新",
+ "url": "URL",
+ "user": "使用者",
+ "username": "使用者名稱",
+ "users": "使用者",
+ "utm": "UTM",
+ "utm-campaign": "UTM 活動",
+ "utm-content": "UTM 內容",
+ "utm-description": "透過 UTM 參數追蹤您的行銷活動。",
+ "utm-medium": "UTM 媒介",
+ "utm-source": "UTM 來源",
+ "utm-term": "UTM 關鍵字",
+ "value": "值",
+ "version": "版本",
+ "view": "檢視",
+ "view-details": "檢視詳細資訊",
+ "view-only": "僅供檢視",
+ "views": "瀏覽次數",
+ "views-per-visit": "每次造訪的瀏覽次數",
+ "visit-duration": "造訪時間",
+ "visitors": "訪客",
+ "visits": "造訪次數",
+ "website": "網站",
+ "website-id": "網站 ID",
+ "websites": "網站",
+ "window": "視窗",
+ "yesterday": "昨天"
+ },
+ "message": {
+ "action-confirmation": "請在下方欄位輸入 {confirmation} 以確認。",
+ "active-users": "目前有 {x} 位訪客",
+ "bad-request": "錯誤的請求",
+ "collected-data": "已蒐集的資料",
+ "confirm-delete": "您確定要刪除 {target} 嗎?",
+ "confirm-leave": "您確定要離開 {target} 嗎?",
+ "confirm-remove": "您確定要移除 {target} 嗎?",
+ "confirm-reset": "您確定要重設 {target} 的統計資料嗎?",
+ "delete-team-warning": "刪除團隊的同時也會刪除所有團隊的網站。",
+ "delete-website-warning": "所有網站資料都將被刪除。",
+ "empty-dashboard": "您的儀表板為空。點擊編輯以新增您的第一個元件。",
+ "error": "發生錯誤。",
+ "event-log": "在 {url} 上的 {event} ",
+ "forbidden": "禁止存取",
+ "go-to-settings": "前往設定",
+ "incorrect-username-password": "使用者名稱或密碼不正確。",
+ "invalid-domain": "無效的網域。請勿包含 http/https。",
+ "min-password-length": "密碼長度至少需 {n} 個字元",
+ "new-version-available": "Umami {version} 的新版本已推出!",
+ "no-data-available": "沒有可用的資料。",
+ "no-event-data": "沒有可用的事件資料。",
+ "no-match-password": "密碼不一致。",
+ "no-results-found": "找不到結果。",
+ "no-team-websites": "此團隊沒有任何網站。",
+ "no-teams": "您尚未建立任何團隊。",
+ "no-users": "沒有任何使用者。",
+ "no-websites-configured": "您尚未設定任何網站。",
+ "not-found": "找不到",
+ "nothing-selected": "尚未選取任何項目。",
+ "page-not-found": "找不到網頁",
+ "reset-website": "要重設此網站的統計資料,請在下方欄位輸入 {confirmation} 以確認。",
+ "reset-website-warning": "此網站的所有統計資料都將被刪除,但您的設定將保持不變。",
+ "saved": "已儲存。",
+ "select-component-preview": "選擇一個元件進行預覽",
+ "select-website-first": "請先選擇一個網站",
+ "sever-error": "伺服器錯誤",
+ "share-url": "您的網站統計資料可在以下網址公開檢視:",
+ "team-already-member": "您已是該團隊的成員。",
+ "team-not-found": "找不到團隊。",
+ "team-websites-info": "團隊中的所有成員都可以檢視網站。",
+ "tracking-code": "要追蹤此網站的統計資料,請將以下程式碼放在您 HTML 的 ... 區段中。",
+ "transfer-team-website-to-user": "要將此網站轉移至您的帳號嗎?",
+ "transfer-user-website-to-team": "請選擇要轉移此網站的團隊。",
+ "transfer-website": "將網站所有權轉移至您的帳號或其他團隊。",
+ "triggered-event": "已觸發的事件",
+ "unauthorized": "未經授權",
+ "user-deleted": "使用者已刪除。",
+ "viewed-page": "已瀏覽的網頁",
+ "visitor-log": "來自 {country} 的訪客在 {device} 上的 {os} 使用 {browser} 瀏覽。"
+ }
}
diff --git a/public/iso-3166-2.json b/public/iso-3166-2.json
index 347313d72..2b3b5a802 100644
--- a/public/iso-3166-2.json
+++ b/public/iso-3166-2.json
@@ -6,13 +6,13 @@
"AD-06": "Sant Julia de Loria",
"AD-07": "Andorra la Vella",
"AD-08": "Escaldes-Engordany",
- "AE-AJ": "'Ajman",
- "AE-AZ": "Abu Zaby",
- "AE-DU": "Dubayy",
- "AE-FU": "Al Fujayrah",
- "AE-RK": "Ra's al Khaymah",
- "AE-SH": "Ash Shariqah",
- "AE-UQ": "Umm al Qaywayn",
+ "AE-AJ": "Ajman",
+ "AE-AZ": "Abu Dhabi",
+ "AE-DU": "Dubai",
+ "AE-FU": "Al Fujairah",
+ "AE-RK": "Ras al Khaimah",
+ "AE-SH": "Sharjah",
+ "AE-UQ": "Umm al Quwain",
"AF-BAL": "Balkh",
"AF-BAM": "Bamyan",
"AF-BDG": "Badghis",
diff --git a/public/robots.txt b/public/robots.txt
index 1f53798bb..e0d61292f 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,2 +1,3 @@
User-agent: *
+Allow: /q/
Disallow: /
diff --git a/public/site.webmanifest b/public/site.webmanifest
index b20abb7cb..fa99de77d 100644
--- a/public/site.webmanifest
+++ b/public/site.webmanifest
@@ -1,19 +1,19 @@
{
- "name": "",
- "short_name": "",
- "icons": [
- {
- "src": "/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ],
- "theme_color": "#ffffff",
- "background_color": "#ffffff",
- "display": "standalone"
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
}
diff --git a/rollup.components.config.mjs b/rollup.components.config.mjs
deleted file mode 100644
index afeaf83cc..000000000
--- a/rollup.components.config.mjs
+++ /dev/null
@@ -1,80 +0,0 @@
-import path from 'path';
-import crypto from 'crypto';
-import resolve from '@rollup/plugin-node-resolve';
-import alias from '@rollup/plugin-alias';
-import json from '@rollup/plugin-json';
-import postcss from 'rollup-plugin-postcss';
-import copy from 'rollup-plugin-copy';
-import del from 'rollup-plugin-delete';
-import nodeExternals from 'rollup-plugin-node-externals';
-import esbuild from 'rollup-plugin-esbuild';
-import dts from 'rollup-plugin-dts';
-import svgr from '@svgr/rollup';
-
-const md5 = str => crypto.createHash('md5').update(str).digest('hex');
-
-const customResolver = resolve({
- extensions: ['.js', '.jsx', '.ts', '.tsx'],
-});
-
-const aliasConfig = {
- entries: [
- { find: /^@/, replacement: path.resolve('./src/') },
- { find: /^public/, replacement: path.resolve('./public') },
- ],
- customResolver,
-};
-
-const jsBundle = {
- input: 'src/index.ts',
- output: [
- {
- file: 'dist/index.js',
- format: 'es',
- sourcemap: true,
- },
- ],
- plugins: [
- del({ targets: 'dist/*', runOnce: true }),
- copy({ targets: [{ src: './package.components.json', dest: 'dist', rename: 'package.json' }] }),
- postcss({
- config: false,
- extract: 'styles.css',
- sourceMap: true,
- minimize: true,
- modules: {
- generateScopedName: function (name, filename, css) {
- const file = path.basename(filename, '.css').replace('.module', '');
- const hash = Buffer.from(md5(`${name}:${filename}:${css}`))
- .toString('base64')
- .substring(0, 5);
-
- return `${file}-${name}--${hash}`;
- },
- },
- }),
- svgr({ icon: true }),
- nodeExternals(),
- json(),
- alias(aliasConfig),
- esbuild({
- target: 'es6',
- jsx: 'automatic',
- loaders: {
- '.js': 'jsx',
- },
- }),
- ],
-};
-
-const dtsBundle = {
- input: 'src/index.ts',
- output: {
- file: 'dist/index.d.ts',
- format: 'es',
- },
- plugins: [alias(aliasConfig), nodeExternals(), json(), dts()],
- external: [/\.css/],
-};
-
-export default [jsBundle, dtsBundle];
diff --git a/rollup.recorder.config.js b/rollup.recorder.config.js
new file mode 100644
index 000000000..c1dd305e7
--- /dev/null
+++ b/rollup.recorder.config.js
@@ -0,0 +1,24 @@
+import 'dotenv/config';
+import commonjs from '@rollup/plugin-commonjs';
+import resolve from '@rollup/plugin-node-resolve';
+import replace from '@rollup/plugin-replace';
+import terser from '@rollup/plugin-terser';
+
+export default {
+ input: 'src/recorder/index.js',
+ output: {
+ file: 'public/recorder.js',
+ format: 'iife',
+ },
+ plugins: [
+ resolve({ browser: true }),
+ commonjs(),
+ replace({
+ __COLLECT_API_HOST__: process.env.COLLECT_API_HOST || '',
+ __COLLECT_REPLAY_ENDPOINT__: process.env.COLLECT_REPLAY_ENDPOINT || '/api/record',
+ delimiters: ['', ''],
+ preventAssignment: true,
+ }),
+ terser({ compress: { evaluate: false } }),
+ ],
+};
diff --git a/rollup.tracker.config.mjs b/rollup.tracker.config.js
similarity index 71%
rename from rollup.tracker.config.mjs
rename to rollup.tracker.config.js
index 596f32dde..202db36c9 100644
--- a/rollup.tracker.config.mjs
+++ b/rollup.tracker.config.js
@@ -10,8 +10,8 @@ export default {
},
plugins: [
replace({
- '__COLLECT_API_HOST__': process.env.COLLECT_API_HOST || '',
- '__COLLECT_API_ENDPOINT__': process.env.COLLECT_API_ENDPOINT || '/api/send',
+ __COLLECT_API_HOST__: process.env.COLLECT_API_HOST || '',
+ __COLLECT_API_ENDPOINT__: process.env.COLLECT_API_ENDPOINT || '/api/send',
delimiters: ['', ''],
preventAssignment: true,
}),
diff --git a/scripts/build-geo.js b/scripts/build-geo.js
index d0fe04c77..b55d9134b 100644
--- a/scripts/build-geo.js
+++ b/scripts/build-geo.js
@@ -1,57 +1,113 @@
-/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable no-console */
-require('dotenv').config();
-const fs = require('fs');
-const path = require('path');
-const https = require('https');
-const zlib = require('zlib');
-const tar = require('tar');
+import 'dotenv/config';
+import fs from 'node:fs';
+import path from 'node:path';
+import https from 'https';
+import { list } from 'tar';
+import zlib from 'zlib';
-if (process.env.VERCEL) {
+if (process.env.SKIP_BUILD_GEO) {
+ console.log('SKIP_BUILD_GEO is set. Skipping geo setup.');
+ process.exit(0);
+}
+
+if (process.env.VERCEL && !process.env.BUILD_GEO) {
console.log('Vercel environment detected. Skipping geo setup.');
process.exit(0);
}
const db = 'GeoLite2-City';
-let url = `https://raw.githubusercontent.com/GitSquared/node-geolite2-redist/master/redist/${db}.tar.gz`;
+// Support custom URL via environment variable
+let url = process.env.GEO_DATABASE_URL;
-if (process.env.MAXMIND_LICENSE_KEY) {
- url =
- `https://download.maxmind.com/app/geoip_download` +
- `?edition_id=${db}&license_key=${process.env.MAXMIND_LICENSE_KEY}&suffix=tar.gz`;
+// Fallback to default URLs if not provided
+if (!url) {
+ if (process.env.MAXMIND_LICENSE_KEY) {
+ url =
+ `https://download.maxmind.com/app/geoip_download` +
+ `?edition_id=${db}&license_key=${process.env.MAXMIND_LICENSE_KEY}&suffix=tar.gz`;
+ } else {
+ url = `https://raw.githubusercontent.com/GitSquared/node-geolite2-redist/master/redist/${db}.tar.gz`;
+ }
}
-const dest = path.resolve(__dirname, '../geo');
+const dest = path.resolve(process.cwd(), 'geo');
if (!fs.existsSync(dest)) {
fs.mkdirSync(dest);
}
-const download = url =>
+// Check if URL points to a direct .mmdb file (already extracted)
+const isDirectMmdb = url.endsWith('.mmdb');
+
+// Download handler for compressed tar.gz files
+const downloadCompressed = url =>
new Promise(resolve => {
https.get(url, res => {
- resolve(res.pipe(zlib.createGunzip({})).pipe(tar.t()));
+ resolve(res.pipe(zlib.createGunzip({})).pipe(list()));
});
});
-download(url).then(
- res =>
- new Promise((resolve, reject) => {
- res.on('entry', entry => {
- if (entry.path.endsWith('.mmdb')) {
- const filename = path.join(dest, path.basename(entry.path));
- entry.pipe(fs.createWriteStream(filename));
+// Download handler for direct .mmdb files
+const downloadDirect = (url, originalUrl) =>
+ new Promise((resolve, reject) => {
+ https.get(url, res => {
+ // Follow redirects
+ if (res.statusCode === 301 || res.statusCode === 302) {
+ downloadDirect(res.headers.location, originalUrl || url)
+ .then(resolve)
+ .catch(reject);
+ return;
+ }
- console.log('Saved geo database:', filename);
- }
- });
+ const filename = path.join(dest, path.basename(originalUrl || url));
+ const fileStream = fs.createWriteStream(filename);
- res.on('error', e => {
- reject(e);
- });
- res.on('finish', () => {
+ res.pipe(fileStream);
+
+ fileStream.on('finish', () => {
+ fileStream.close();
+ console.log('Saved geo database:', filename);
resolve();
});
- }),
-);
+
+ fileStream.on('error', e => {
+ reject(e);
+ });
+ });
+ });
+
+// Execute download based on file type
+if (isDirectMmdb) {
+ downloadDirect(url).catch(e => {
+ console.error('Failed to download geo database:', e);
+ process.exit(1);
+ });
+} else {
+ downloadCompressed(url)
+ .then(
+ res =>
+ new Promise((resolve, reject) => {
+ res.on('entry', entry => {
+ if (entry.path.endsWith('.mmdb')) {
+ const filename = path.join(dest, path.basename(entry.path));
+ entry.pipe(fs.createWriteStream(filename));
+
+ console.log('Saved geo database:', filename);
+ }
+ });
+
+ res.on('error', e => {
+ reject(e);
+ });
+ res.on('finish', () => {
+ resolve();
+ });
+ }),
+ )
+ .catch(e => {
+ console.error('Failed to download geo database:', e);
+ process.exit(1);
+ });
+}
diff --git a/scripts/build-prisma-client.js b/scripts/build-prisma-client.js
new file mode 100644
index 000000000..b5edc3dc7
--- /dev/null
+++ b/scripts/build-prisma-client.js
@@ -0,0 +1,18 @@
+import esbuild from 'esbuild';
+
+esbuild
+ .build({
+ entryPoints: ['src/generated/prisma/client.ts'], // Adjust this to your entry file
+ bundle: true, // Bundle all files into one (optional)
+ outfile: 'generated/prisma/client.js', // Output file
+ platform: 'node', // For Node.js compatibility
+ target: 'es2020', // Target version of Node.js
+ format: 'esm', // Use ESM format
+ sourcemap: true, // Optional: generates source maps for debugging
+ external: [
+ '../src/generated/prisma', // exclude generated client
+ '@prisma/client', // just in case
+ '.prisma/client',
+ ], // Optional: Exclude external dependencies from bundling
+ })
+ .catch(() => process.exit(1));
diff --git a/scripts/bump-components.js b/scripts/bump-components.js
new file mode 100644
index 000000000..0bb5721fc
--- /dev/null
+++ b/scripts/bump-components.js
@@ -0,0 +1,49 @@
+import { execSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+
+const distDir = path.resolve(process.cwd(), 'dist');
+const packageFile = path.join(distDir, 'package.json');
+
+const defaultPackage = {
+ name: '@umami/components',
+ version: '0.0.0',
+ description: 'Umami React components.',
+ author: 'Mike Cao ',
+ license: 'MIT',
+ type: 'module',
+ main: './index.js',
+ types: './index.d.ts',
+ dependencies: {
+ 'chart.js': '^4.5.0',
+ 'chartjs-adapter-date-fns': '^3.0.0',
+ colord: '^2.9.2',
+ jsonwebtoken: '^9.0.2',
+ 'lucide-react': '^0.542.0',
+ 'pure-rand': '^7.0.1',
+ 'react-simple-maps': '^2.3.0',
+ 'react-use-measure': '^2.0.4',
+ 'react-window': '^1.8.6',
+ 'serialize-error': '^12.0.0',
+ thenby: '^1.3.4',
+ uuid: '^11.1.0',
+ },
+};
+
+if (!fs.existsSync(distDir)) {
+ fs.mkdirSync(distDir);
+}
+
+const pkg = fs.existsSync(packageFile)
+ ? JSON.parse(fs.readFileSync(packageFile, 'utf8'))
+ : defaultPackage;
+
+const published = execSync(`npm view ${pkg.name} version`, { encoding: 'utf8' }).trim();
+const [major, minor] = published.split('.').map(Number);
+const next = `${major}.${minor + 1}.0`;
+
+pkg.version = next;
+
+fs.writeFileSync(packageFile, `${JSON.stringify(pkg, null, 2)}\n`);
+
+console.log(`Bumped ${pkg.name} version: ${published} -> ${next}`);
diff --git a/scripts/check-db.js b/scripts/check-db.js
index ca0fca31c..8c806cd8f 100644
--- a/scripts/check-db.js
+++ b/scripts/check-db.js
@@ -1,26 +1,26 @@
/* eslint-disable no-console */
-require('dotenv').config();
-const { PrismaClient } = require('@prisma/client');
-const chalk = require('chalk');
-const { execSync } = require('child_process');
-const semver = require('semver');
+import 'dotenv/config';
+import { execSync } from 'node:child_process';
+import { PrismaPg } from '@prisma/adapter-pg';
+import chalk from 'chalk';
+import semver from 'semver';
+import { PrismaClient } from '../generated/prisma/client.js';
+
+const MIN_VERSION = '9.4.0';
if (process.env.SKIP_DB_CHECK) {
console.log('Skipping database check.');
process.exit(0);
}
-function getDatabaseType(url = process.env.DATABASE_URL) {
- const type = url && url.split(':')[0];
+const url = new URL(process.env.DATABASE_URL);
- if (type === 'postgres') {
- return 'postgresql';
- }
+const adapter = new PrismaPg(
+ { connectionString: url.toString() },
+ { schema: url.searchParams.get('schema') },
+);
- return type;
-}
-
-const prisma = new PrismaClient();
+const prisma = new PrismaClient({ adapter });
function success(msg) {
console.log(chalk.greenBright(`✓ ${msg}`));
@@ -36,6 +36,10 @@ async function checkEnv() {
} else {
success('DATABASE_URL is defined.');
}
+
+ if (process.env.REDIS_URL) {
+ success('REDIS_URL is defined.');
+ }
}
async function checkConnection() {
@@ -44,7 +48,7 @@ async function checkConnection() {
success('Database connection successful.');
} catch (e) {
- throw new Error('Unable to connect to the database: ' + e.message);
+ throw new Error(`Unable to connect to the database: ${e.message}`);
}
}
@@ -52,35 +56,15 @@ async function checkDatabaseVersion() {
const query = await prisma.$queryRaw`select version() as version`;
const version = semver.valid(semver.coerce(query[0].version));
- const databaseType = getDatabaseType();
- const minVersion = databaseType === 'postgresql' ? '9.4.0' : '5.7.0';
-
- if (semver.lt(version, minVersion)) {
+ if (semver.lt(version, MIN_VERSION)) {
throw new Error(
- `Database version is not compatible. Please upgrade ${databaseType} version to ${minVersion} or greater`,
+ `Database version is not compatible. Please upgrade to ${MIN_VERSION} or greater.`,
);
}
success('Database version check successful.');
}
-async function checkV1Tables() {
- try {
- // check for v1 migrations before v2 release date
- const record =
- await prisma.$queryRaw`select * from _prisma_migrations where started_at < '2023-04-17'`;
-
- if (record.length > 0) {
- error(
- 'Umami v1 tables detected. For how to upgrade from v1 to v2 go to https://umami.is/docs/migrate-v1-v2.',
- );
- process.exit(1);
- }
- } catch (e) {
- // Ignore
- }
-}
-
async function applyMigration() {
if (!process.env.SKIP_DB_MIGRATION) {
console.log(execSync('prisma migrate deploy').toString());
@@ -91,14 +75,13 @@ async function applyMigration() {
(async () => {
let err = false;
- for (let fn of [checkEnv, checkConnection, checkDatabaseVersion, checkV1Tables, applyMigration]) {
+ for (const fn of [checkEnv, checkConnection, checkDatabaseVersion, applyMigration]) {
try {
await fn();
} catch (e) {
error(e.message);
err = true;
} finally {
- await prisma.$disconnect();
if (err) {
process.exit(1);
}
diff --git a/scripts/check-env.js b/scripts/check-env.js
index e8c80a5da..79c0984dd 100644
--- a/scripts/check-env.js
+++ b/scripts/check-env.js
@@ -1,5 +1,5 @@
/* eslint-disable no-console */
-require('dotenv').config();
+import 'dotenv/config';
function checkMissing(vars) {
const missing = vars.reduce((arr, key) => {
@@ -22,6 +22,6 @@ if (!process.env.SKIP_DB_CHECK && !process.env.DATABASE_TYPE) {
checkMissing(['DATABASE_URL']);
}
-if (process.env.CLOUD_MODE) {
- checkMissing(['CLOUD_URL', 'KAFKA_BROKER', 'KAFKA_URL', 'REDIS_URL', 'KAFKA_SASL_MECHANISM']);
+if (process.env.CLOUD_URL) {
+ checkMissing(['CLOUD_URL', 'CLICKHOUSE_URL', 'REDIS_URL']);
}
diff --git a/scripts/check-lang.js b/scripts/check-lang.js
deleted file mode 100644
index a1b604310..000000000
--- a/scripts/check-lang.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/* eslint-disable no-console */
-const fs = require('fs');
-const path = require('path');
-const chalk = require('chalk');
-const messages = require('../src/lang/en-US.json');
-const ignore = require('../lang-ignore.json');
-
-const dir = path.resolve(__dirname, '../lang');
-const files = fs.readdirSync(dir);
-const keys = Object.keys(messages).sort();
-const filter = process.argv?.[2];
-
-files.forEach(file => {
- if (file !== 'en-US.json') {
- const lang = require(`../lang/${file}`);
- const id = file.replace('.json', '');
-
- if (filter && filter !== id) {
- return;
- }
-
- console.log(chalk.yellowBright(`\n## ${file.replace('.json', '')}`));
- let count = 0;
- keys.forEach(key => {
- const orig = messages[key];
- const check = lang[key];
- const ignored = ignore[id] === '*' || ignore[id]?.includes(key);
-
- if (!ignored && (!check || check === orig)) {
- console.log(chalk.redBright('*'), chalk.greenBright(`${key}:`), orig);
- count++;
- }
- });
-
- if (count === 0) {
- console.log('**Complete!**');
- }
- }
-});
diff --git a/scripts/check-missing-messages.js b/scripts/check-missing-messages.js
new file mode 100644
index 000000000..3e497abd2
--- /dev/null
+++ b/scripts/check-missing-messages.js
@@ -0,0 +1,60 @@
+import { readdirSync, readFileSync } from 'node:fs';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+const messagesDir = join(__dirname, '..', 'public', 'intl', 'messages');
+
+const en = JSON.parse(readFileSync(join(messagesDir, 'en-US.json'), 'utf8'));
+
+// Flatten nested structure: { label: { foo: 'bar' } } -> { 'label.foo': 'bar' }
+function flatten(obj, prefix = '') {
+ const result = {};
+ for (const [k, v] of Object.entries(obj)) {
+ const key = prefix ? `${prefix}.${k}` : k;
+ if (typeof v === 'object' && v !== null) {
+ Object.assign(result, flatten(v, key));
+ } else {
+ result[key] = v;
+ }
+ }
+ return result;
+}
+
+const enFlat = flatten(en);
+const enKeys = Object.keys(enFlat);
+console.log(`en-US.json has ${enKeys.length} keys`);
+
+const files = readdirSync(messagesDir)
+ .filter(f => f.endsWith('.json') && f !== 'en-US.json')
+ .sort();
+
+const allMissing = {};
+let total = 0;
+
+for (const fname of files) {
+ const data = JSON.parse(readFileSync(join(messagesDir, fname), 'utf8'));
+ const flat = flatten(data);
+ const missing = enKeys.filter(k => !(k in flat));
+ if (missing.length) {
+ allMissing[fname] = missing;
+ console.log(`${fname}: ${missing.length} missing`);
+ total += missing.length;
+ }
+}
+console.log(`\nTotal missing across all locales: ${total}`);
+
+const keyCounts = {};
+for (const missing of Object.values(allMissing)) {
+ for (const k of missing) {
+ keyCounts[k] = (keyCounts[k] || 0) + 1;
+ }
+}
+const sorted = Object.entries(keyCounts).sort((a, b) => b[1] - a[1]);
+if (sorted.length) {
+ console.log('\nMost commonly missing keys:');
+ for (const [k, count] of sorted) {
+ console.log(` "${k}": missing from ${count} files (en value: "${enFlat[k]}")`);
+ }
+}
diff --git a/scripts/copy-db-files.js b/scripts/copy-db-files.js
deleted file mode 100644
index 15c34674f..000000000
--- a/scripts/copy-db-files.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/* eslint-disable no-console */
-require('dotenv').config();
-const fse = require('fs-extra');
-const path = require('path');
-const del = require('del');
-
-function getDatabaseType(url = process.env.DATABASE_URL) {
- const type = process.env.DATABASE_TYPE || (url && url.split(':')[0]);
-
- if (type === 'postgres') {
- return 'postgresql';
- }
-
- return type;
-}
-
-const databaseType = getDatabaseType();
-
-if (!databaseType || !['mysql', 'postgresql'].includes(databaseType)) {
- throw new Error('Missing or invalid database');
-}
-
-console.log(`Database type detected: ${databaseType}`);
-
-const src = path.resolve(__dirname, `../db/${databaseType}`);
-const dest = path.resolve(__dirname, '../prisma');
-
-del.sync(dest);
-
-fse.copySync(src, dest);
-
-console.log(`Copied ${src} to ${dest}`);
diff --git a/scripts/download-country-names.js b/scripts/download-country-names.js
index d5c364bf4..474869d44 100644
--- a/scripts/download-country-names.js
+++ b/scripts/download-country-names.js
@@ -1,11 +1,12 @@
-/* eslint-disable no-console, @typescript-eslint/no-var-requires */
-const fs = require('fs-extra');
-const path = require('path');
-const https = require('https');
-const chalk = require('chalk');
+/* eslint-disable no-console */
-const src = path.resolve(__dirname, '../src/lang');
-const dest = path.resolve(__dirname, '../public/intl/country');
+import https from 'node:https';
+import path from 'node:path';
+import chalk from 'chalk';
+import fs from 'node:fs';
+
+const src = path.resolve(process.cwd(), 'public/intl/messages');
+const dest = path.resolve(process.cwd(), 'public/intl/country');
const files = fs.readdirSync(src);
const getUrl = locale =>
@@ -42,7 +43,7 @@ const downloadFile = (url, filepath) =>
});
const download = async files => {
- await fs.ensureDir(dest);
+ fs.mkdirSync(dest, { recursive: true });
await asyncForEach(files, async file => {
const locale = file.replace('-', '_').replace('.json', '');
diff --git a/scripts/download-language-names.js b/scripts/download-language-names.js
index ac30ed901..17d7aa72e 100644
--- a/scripts/download-language-names.js
+++ b/scripts/download-language-names.js
@@ -1,11 +1,12 @@
/* eslint-disable no-console */
-const fs = require('fs-extra');
-const path = require('path');
-const https = require('https');
-const chalk = require('chalk');
-const src = path.resolve(__dirname, '../src/lang');
-const dest = path.resolve(__dirname, '../public/intl/language');
+import https from 'node:https';
+import path from 'node:path';
+import chalk from 'chalk';
+import fs from 'node:fs';
+
+const src = path.resolve(process.cwd(), 'public/intl/messages');
+const dest = path.resolve(process.cwd(), 'public/intl/language');
const files = fs.readdirSync(src);
const getUrl = locale =>
@@ -42,7 +43,7 @@ const downloadFile = (url, filepath) =>
});
const download = async files => {
- await fs.ensureDir(dest);
+ fs.mkdirSync(dest, { recursive: true });
await asyncForEach(files, async file => {
const locale = file.replace('-', '_').replace('.json', '');
diff --git a/scripts/format-lang.js b/scripts/format-lang.js
deleted file mode 100644
index 593e296d2..000000000
--- a/scripts/format-lang.js
+++ /dev/null
@@ -1,34 +0,0 @@
-const fs = require('fs-extra');
-const path = require('path');
-const del = require('del');
-const prettier = require('prettier');
-
-const src = path.resolve(__dirname, '../src/lang');
-const dest = path.resolve(__dirname, '../build/messages');
-const files = fs.readdirSync(src);
-
-del.sync([path.join(dest)]);
-
-/*
-This script takes the files from the `lang` folder and formats them into
-the format that format-js expects.
- */
-async function run() {
- await fs.ensureDir(dest);
-
- files.forEach(file => {
- const lang = require(`../src/lang/${file}`);
- const keys = Object.keys(lang).sort();
-
- const formatted = keys.reduce((obj, key) => {
- obj[key] = { defaultMessage: lang[key] };
- return obj;
- }, {});
-
- const json = prettier.format(JSON.stringify(formatted), { parser: 'json' });
-
- fs.writeFileSync(path.resolve(dest, file), json);
- });
-}
-
-run();
diff --git a/scripts/merge-messages.js b/scripts/merge-messages.js
deleted file mode 100644
index 44ffb5c78..000000000
--- a/scripts/merge-messages.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* eslint-disable no-console */
-const fs = require('fs');
-const path = require('path');
-const prettier = require('prettier');
-const messages = require('../build/extracted-messages.json');
-
-const dest = path.resolve(__dirname, '../src/lang');
-const files = fs.readdirSync(dest);
-const keys = Object.keys(messages).sort();
-
-/*
-This script takes extracted messages and merges them
-with the existing files under `lang`. Any newly added
-keys will be printed to the console.
- */
-files.forEach(file => {
- const lang = require(`../src/lang/${file}`);
-
- console.log(`Merging ${file}`);
-
- const merged = keys.reduce((obj, key) => {
- const message = lang[key];
-
- if (file === 'en-US.json') {
- obj[key] = messages[key].defaultMessage;
- } else {
- obj[key] = message || messages[key].defaultMessage;
- }
-
- if (!message) {
- console.log(`* Added key ${key}`);
- }
-
- return obj;
- }, {});
-
- const json = prettier.format(JSON.stringify(merged), { parser: 'json' });
-
- fs.writeFileSync(path.resolve(dest, file), json);
-});
diff --git a/scripts/postbuild.js b/scripts/postbuild.js
index 897480587..2a4404c74 100644
--- a/scripts/postbuild.js
+++ b/scripts/postbuild.js
@@ -1,5 +1,5 @@
-require('dotenv').config();
-const { sendTelemetry } = require('./telemetry');
+import 'dotenv/config';
+import { sendTelemetry } from './telemetry.js';
async function run() {
if (!process.env.DISABLE_TELEMETRY) {
diff --git a/scripts/seed-data.ts b/scripts/seed-data.ts
new file mode 100644
index 000000000..56fc34ced
--- /dev/null
+++ b/scripts/seed-data.ts
@@ -0,0 +1,121 @@
+#!/usr/bin/env node
+/* eslint-disable no-console */
+
+/**
+ * Umami Sample Data Generator
+ *
+ * Generates realistic analytics data for local development and testing.
+ * Creates two demo websites:
+ * - Demo Blog: Low traffic (~100 sessions/month)
+ * - Demo SaaS: Average traffic (~500 sessions/day)
+ *
+ * Usage:
+ * npm run seed-data # Generate 30 days of data
+ * npm run seed-data -- --days 90 # Generate 90 days of data
+ * npm run seed-data -- --clear # Clear existing demo data first
+ * npm run seed-data -- --verbose # Show detailed progress
+ */
+
+import { type SeedConfig, seed } from './seed/index.js';
+
+function parseArgs(): SeedConfig {
+ const args = process.argv.slice(2);
+
+ const config: SeedConfig = {
+ days: 30,
+ clear: false,
+ verbose: false,
+ };
+
+ for (let i = 0; i < args.length; i++) {
+ const arg = args[i];
+
+ if (arg === '--days' && args[i + 1]) {
+ config.days = parseInt(args[i + 1], 10);
+ if (isNaN(config.days) || config.days < 1) {
+ console.error('Error: --days must be a positive integer');
+ process.exit(1);
+ }
+ i++;
+ } else if (arg === '--clear') {
+ config.clear = true;
+ } else if (arg === '--verbose' || arg === '-v') {
+ config.verbose = true;
+ } else if (arg === '--help' || arg === '-h') {
+ printHelp();
+ process.exit(0);
+ } else if (arg.startsWith('--days=')) {
+ config.days = parseInt(arg.split('=')[1], 10);
+ if (isNaN(config.days) || config.days < 1) {
+ console.error('Error: --days must be a positive integer');
+ process.exit(1);
+ }
+ }
+ }
+
+ return config;
+}
+
+function printHelp(): void {
+ console.log(`
+Umami Sample Data Generator
+
+Generates realistic analytics data for local development and testing.
+
+Usage:
+ npm run seed-data [options]
+
+Options:
+ --days Number of days of data to generate (default: 30)
+ --clear Clear existing demo data before generating
+ --verbose, -v Show detailed progress
+ --help, -h Show this help message
+
+Examples:
+ npm run seed-data # Generate 30 days of data
+ npm run seed-data -- --days 90 # Generate 90 days of data
+ npm run seed-data -- --clear # Clear existing demo data first
+ npm run seed-data -- --days 7 -v # Generate 7 days with verbose output
+
+Generated Sites:
+ - Demo Blog: Low traffic (~90 sessions/month)
+ - Demo SaaS: Average traffic (~500 sessions/day) with revenue tracking
+
+Note:
+ This script is blocked from running in production environments
+ (NODE_ENV=production or cloud platforms like Vercel/Netlify/Railway).
+`);
+}
+
+function checkEnvironment(): void {
+ const nodeEnv = process.env.NODE_ENV;
+
+ if (nodeEnv === 'production') {
+ console.error('\nError: seed-data cannot run in production environment.');
+ console.error('This script is only for local development and testing.\n');
+ process.exit(1);
+ }
+
+ if (process.env.VERCEL || process.env.NETLIFY || process.env.RAILWAY_ENVIRONMENT) {
+ console.error('\nError: seed-data cannot run in cloud environments.');
+ console.error('This script is only for local development and testing.\n');
+ process.exit(1);
+ }
+}
+
+async function main(): Promise {
+ console.log('\nUmami Sample Data Generator\n');
+
+ checkEnvironment();
+
+ const config = parseArgs();
+
+ try {
+ await seed(config);
+ } catch (error) {
+ console.error('\nError generating seed data:', error);
+ process.exit(1);
+ }
+}
+
+main();
diff --git a/scripts/seed/distributions/devices.ts b/scripts/seed/distributions/devices.ts
new file mode 100644
index 000000000..e79e03212
--- /dev/null
+++ b/scripts/seed/distributions/devices.ts
@@ -0,0 +1,80 @@
+import { pickRandom, type WeightedOption, weightedRandom } from '../utils.js';
+
+export type DeviceType = 'desktop' | 'mobile' | 'tablet';
+
+const deviceWeights: WeightedOption[] = [
+ { value: 'desktop', weight: 0.55 },
+ { value: 'mobile', weight: 0.4 },
+ { value: 'tablet', weight: 0.05 },
+];
+
+const browsersByDevice: Record[]> = {
+ desktop: [
+ { value: 'Chrome', weight: 0.65 },
+ { value: 'Safari', weight: 0.12 },
+ { value: 'Firefox', weight: 0.1 },
+ { value: 'Edge', weight: 0.1 },
+ { value: 'Opera', weight: 0.03 },
+ ],
+ mobile: [
+ { value: 'Chrome', weight: 0.55 },
+ { value: 'Safari', weight: 0.35 },
+ { value: 'Samsung', weight: 0.05 },
+ { value: 'Firefox', weight: 0.03 },
+ { value: 'Opera', weight: 0.02 },
+ ],
+ tablet: [
+ { value: 'Safari', weight: 0.6 },
+ { value: 'Chrome', weight: 0.35 },
+ { value: 'Firefox', weight: 0.05 },
+ ],
+};
+
+const osByDevice: Record[]> = {
+ desktop: [
+ { value: 'Windows 10', weight: 0.5 },
+ { value: 'Mac OS', weight: 0.3 },
+ { value: 'Linux', weight: 0.12 },
+ { value: 'Chrome OS', weight: 0.05 },
+ { value: 'Windows 11', weight: 0.03 },
+ ],
+ mobile: [
+ { value: 'iOS', weight: 0.45 },
+ { value: 'Android', weight: 0.55 },
+ ],
+ tablet: [
+ { value: 'iOS', weight: 0.75 },
+ { value: 'Android', weight: 0.25 },
+ ],
+};
+
+const screensByDevice: Record = {
+ desktop: [
+ '1920x1080',
+ '2560x1440',
+ '1366x768',
+ '1440x900',
+ '3840x2160',
+ '1536x864',
+ '1680x1050',
+ '2560x1080',
+ ],
+ mobile: ['390x844', '414x896', '375x812', '360x800', '428x926', '393x873', '412x915', '360x780'],
+ tablet: ['1024x768', '768x1024', '834x1194', '820x1180', '810x1080', '800x1280'],
+};
+
+export interface DeviceInfo {
+ device: DeviceType;
+ browser: string;
+ os: string;
+ screen: string;
+}
+
+export function getRandomDevice(): DeviceInfo {
+ const device = weightedRandom(deviceWeights);
+ const browser = weightedRandom(browsersByDevice[device]);
+ const os = weightedRandom(osByDevice[device]);
+ const screen = pickRandom(screensByDevice[device]);
+
+ return { device, browser, os, screen };
+}
diff --git a/scripts/seed/distributions/geographic.ts b/scripts/seed/distributions/geographic.ts
new file mode 100644
index 000000000..07b61109a
--- /dev/null
+++ b/scripts/seed/distributions/geographic.ts
@@ -0,0 +1,144 @@
+import { pickRandom, type WeightedOption, weightedRandom } from '../utils.js';
+
+interface GeoLocation {
+ country: string;
+ region: string;
+ city: string;
+}
+
+const countryWeights: WeightedOption[] = [
+ { value: 'US', weight: 0.35 },
+ { value: 'GB', weight: 0.08 },
+ { value: 'DE', weight: 0.06 },
+ { value: 'FR', weight: 0.05 },
+ { value: 'CA', weight: 0.04 },
+ { value: 'AU', weight: 0.03 },
+ { value: 'IN', weight: 0.08 },
+ { value: 'BR', weight: 0.04 },
+ { value: 'JP', weight: 0.03 },
+ { value: 'NL', weight: 0.02 },
+ { value: 'ES', weight: 0.02 },
+ { value: 'IT', weight: 0.02 },
+ { value: 'PL', weight: 0.02 },
+ { value: 'SE', weight: 0.01 },
+ { value: 'MX', weight: 0.02 },
+ { value: 'KR', weight: 0.02 },
+ { value: 'SG', weight: 0.01 },
+ { value: 'ID', weight: 0.02 },
+ { value: 'PH', weight: 0.01 },
+ { value: 'TH', weight: 0.01 },
+ { value: 'VN', weight: 0.01 },
+ { value: 'RU', weight: 0.02 },
+ { value: 'UA', weight: 0.01 },
+ { value: 'ZA', weight: 0.01 },
+ { value: 'NG', weight: 0.01 },
+];
+
+const regionsByCountry: Record = {
+ US: [
+ { region: 'CA', city: 'San Francisco' },
+ { region: 'CA', city: 'Los Angeles' },
+ { region: 'NY', city: 'New York' },
+ { region: 'TX', city: 'Austin' },
+ { region: 'TX', city: 'Houston' },
+ { region: 'WA', city: 'Seattle' },
+ { region: 'IL', city: 'Chicago' },
+ { region: 'MA', city: 'Boston' },
+ { region: 'CO', city: 'Denver' },
+ { region: 'GA', city: 'Atlanta' },
+ { region: 'FL', city: 'Miami' },
+ { region: 'PA', city: 'Philadelphia' },
+ ],
+ GB: [
+ { region: 'ENG', city: 'London' },
+ { region: 'ENG', city: 'Manchester' },
+ { region: 'ENG', city: 'Birmingham' },
+ { region: 'SCT', city: 'Edinburgh' },
+ { region: 'ENG', city: 'Bristol' },
+ ],
+ DE: [
+ { region: 'BE', city: 'Berlin' },
+ { region: 'BY', city: 'Munich' },
+ { region: 'HH', city: 'Hamburg' },
+ { region: 'HE', city: 'Frankfurt' },
+ { region: 'NW', city: 'Cologne' },
+ ],
+ FR: [
+ { region: 'IDF', city: 'Paris' },
+ { region: 'ARA', city: 'Lyon' },
+ { region: 'PAC', city: 'Marseille' },
+ { region: 'OCC', city: 'Toulouse' },
+ ],
+ CA: [
+ { region: 'ON', city: 'Toronto' },
+ { region: 'BC', city: 'Vancouver' },
+ { region: 'QC', city: 'Montreal' },
+ { region: 'AB', city: 'Calgary' },
+ ],
+ AU: [
+ { region: 'NSW', city: 'Sydney' },
+ { region: 'VIC', city: 'Melbourne' },
+ { region: 'QLD', city: 'Brisbane' },
+ { region: 'WA', city: 'Perth' },
+ ],
+ IN: [
+ { region: 'MH', city: 'Mumbai' },
+ { region: 'KA', city: 'Bangalore' },
+ { region: 'DL', city: 'New Delhi' },
+ { region: 'TN', city: 'Chennai' },
+ { region: 'TG', city: 'Hyderabad' },
+ ],
+ BR: [
+ { region: 'SP', city: 'Sao Paulo' },
+ { region: 'RJ', city: 'Rio de Janeiro' },
+ { region: 'MG', city: 'Belo Horizonte' },
+ ],
+ JP: [
+ { region: '13', city: 'Tokyo' },
+ { region: '27', city: 'Osaka' },
+ { region: '23', city: 'Nagoya' },
+ ],
+ NL: [
+ { region: 'NH', city: 'Amsterdam' },
+ { region: 'ZH', city: 'Rotterdam' },
+ { region: 'ZH', city: 'The Hague' },
+ ],
+};
+
+const defaultRegions = [{ region: '', city: '' }];
+
+export function getRandomGeo(): GeoLocation {
+ const country = weightedRandom(countryWeights);
+ const regions = regionsByCountry[country] || defaultRegions;
+ const { region, city } = pickRandom(regions);
+
+ return { country, region, city };
+}
+
+const languages: WeightedOption[] = [
+ { value: 'en-US', weight: 0.4 },
+ { value: 'en-GB', weight: 0.08 },
+ { value: 'de-DE', weight: 0.06 },
+ { value: 'fr-FR', weight: 0.05 },
+ { value: 'es-ES', weight: 0.05 },
+ { value: 'pt-BR', weight: 0.04 },
+ { value: 'ja-JP', weight: 0.03 },
+ { value: 'zh-CN', weight: 0.05 },
+ { value: 'ko-KR', weight: 0.02 },
+ { value: 'ru-RU', weight: 0.02 },
+ { value: 'it-IT', weight: 0.02 },
+ { value: 'nl-NL', weight: 0.02 },
+ { value: 'pl-PL', weight: 0.02 },
+ { value: 'hi-IN', weight: 0.04 },
+ { value: 'ar-SA', weight: 0.02 },
+ { value: 'tr-TR', weight: 0.02 },
+ { value: 'vi-VN', weight: 0.01 },
+ { value: 'th-TH', weight: 0.01 },
+ { value: 'id-ID', weight: 0.02 },
+ { value: 'sv-SE', weight: 0.01 },
+ { value: 'da-DK', weight: 0.01 },
+];
+
+export function getRandomLanguage(): string {
+ return weightedRandom(languages);
+}
diff --git a/scripts/seed/distributions/referrers.ts b/scripts/seed/distributions/referrers.ts
new file mode 100644
index 000000000..85e1ad87d
--- /dev/null
+++ b/scripts/seed/distributions/referrers.ts
@@ -0,0 +1,163 @@
+import { pickRandom, randomInt, type WeightedOption, weightedRandom } from '../utils.js';
+
+export type ReferrerType = 'direct' | 'organic' | 'social' | 'paid' | 'referral';
+
+export interface ReferrerInfo {
+ type: ReferrerType;
+ domain: string | null;
+ path: string | null;
+ utmSource: string | null;
+ utmMedium: string | null;
+ utmCampaign: string | null;
+ utmContent: string | null;
+ utmTerm: string | null;
+ gclid: string | null;
+ fbclid: string | null;
+}
+
+const referrerTypeWeights: WeightedOption[] = [
+ { value: 'direct', weight: 0.4 },
+ { value: 'organic', weight: 0.25 },
+ { value: 'social', weight: 0.15 },
+ { value: 'paid', weight: 0.1 },
+ { value: 'referral', weight: 0.1 },
+];
+
+const searchEngines = [
+ { domain: 'google.com', path: '/search' },
+ { domain: 'bing.com', path: '/search' },
+ { domain: 'duckduckgo.com', path: '/' },
+ { domain: 'yahoo.com', path: '/search' },
+ { domain: 'baidu.com', path: '/s' },
+];
+
+const socialPlatforms = [
+ { domain: 'twitter.com', path: null },
+ { domain: 'x.com', path: null },
+ { domain: 'linkedin.com', path: '/feed' },
+ { domain: 'facebook.com', path: null },
+ { domain: 'reddit.com', path: '/r/programming' },
+ { domain: 'news.ycombinator.com', path: '/item' },
+ { domain: 'threads.net', path: null },
+ { domain: 'bsky.app', path: null },
+];
+
+const referralSites = [
+ { domain: 'medium.com', path: '/@author/article' },
+ { domain: 'dev.to', path: '/post' },
+ { domain: 'hashnode.com', path: '/blog' },
+ { domain: 'techcrunch.com', path: '/article' },
+ { domain: 'producthunt.com', path: '/posts' },
+ { domain: 'indiehackers.com', path: '/post' },
+];
+
+interface PaidCampaign {
+ source: string;
+ medium: string;
+ campaign: string;
+ useGclid?: boolean;
+ useFbclid?: boolean;
+}
+
+const paidCampaigns: PaidCampaign[] = [
+ { source: 'google', medium: 'cpc', campaign: 'brand_search', useGclid: true },
+ { source: 'google', medium: 'cpc', campaign: 'product_awareness', useGclid: true },
+ { source: 'facebook', medium: 'paid_social', campaign: 'retargeting', useFbclid: true },
+ { source: 'facebook', medium: 'paid_social', campaign: 'lookalike', useFbclid: true },
+ { source: 'linkedin', medium: 'cpc', campaign: 'b2b_targeting' },
+ { source: 'twitter', medium: 'paid_social', campaign: 'launch_promo' },
+];
+
+const organicCampaigns = [
+ { source: 'newsletter', medium: 'email', campaign: 'weekly_digest' },
+ { source: 'newsletter', medium: 'email', campaign: 'product_update' },
+ { source: 'partner', medium: 'referral', campaign: 'integration_launch' },
+];
+
+function generateClickId(): string {
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+ let result = '';
+ for (let i = 0; i < 32; i++) {
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
+ }
+ return result;
+}
+
+export function getRandomReferrer(): ReferrerInfo {
+ const type = weightedRandom(referrerTypeWeights);
+
+ const result: ReferrerInfo = {
+ type,
+ domain: null,
+ path: null,
+ utmSource: null,
+ utmMedium: null,
+ utmCampaign: null,
+ utmContent: null,
+ utmTerm: null,
+ gclid: null,
+ fbclid: null,
+ };
+
+ switch (type) {
+ case 'direct':
+ // No referrer data
+ break;
+
+ case 'organic': {
+ const engine = pickRandom(searchEngines);
+ result.domain = engine.domain;
+ result.path = engine.path;
+ break;
+ }
+
+ case 'social': {
+ const platform = pickRandom(socialPlatforms);
+ result.domain = platform.domain;
+ result.path = platform.path;
+
+ // Some social traffic has UTM params
+ if (Math.random() < 0.3) {
+ result.utmSource = platform.domain.replace('.com', '').replace('.net', '');
+ result.utmMedium = 'social';
+ }
+ break;
+ }
+
+ case 'paid': {
+ const campaign = pickRandom(paidCampaigns);
+ result.utmSource = campaign.source;
+ result.utmMedium = campaign.medium;
+ result.utmCampaign = campaign.campaign;
+ result.utmContent = `ad_${randomInt(1, 5)}`;
+
+ if (campaign.useGclid) {
+ result.gclid = generateClickId();
+ result.domain = 'google.com';
+ result.path = '/search';
+ } else if (campaign.useFbclid) {
+ result.fbclid = generateClickId();
+ result.domain = 'facebook.com';
+ result.path = null;
+ }
+ break;
+ }
+
+ case 'referral': {
+ // Mix of pure referrals and organic campaigns
+ if (Math.random() < 0.6) {
+ const site = pickRandom(referralSites);
+ result.domain = site.domain;
+ result.path = site.path;
+ } else {
+ const campaign = pickRandom(organicCampaigns);
+ result.utmSource = campaign.source;
+ result.utmMedium = campaign.medium;
+ result.utmCampaign = campaign.campaign;
+ }
+ break;
+ }
+ }
+
+ return result;
+}
diff --git a/scripts/seed/distributions/temporal.ts b/scripts/seed/distributions/temporal.ts
new file mode 100644
index 000000000..5a4899d60
--- /dev/null
+++ b/scripts/seed/distributions/temporal.ts
@@ -0,0 +1,69 @@
+import { randomInt, type WeightedOption, weightedRandom } from '../utils.js';
+
+const hourlyWeights: WeightedOption[] = [
+ { value: 0, weight: 0.02 },
+ { value: 1, weight: 0.01 },
+ { value: 2, weight: 0.01 },
+ { value: 3, weight: 0.01 },
+ { value: 4, weight: 0.01 },
+ { value: 5, weight: 0.02 },
+ { value: 6, weight: 0.03 },
+ { value: 7, weight: 0.05 },
+ { value: 8, weight: 0.07 },
+ { value: 9, weight: 0.08 },
+ { value: 10, weight: 0.09 },
+ { value: 11, weight: 0.08 },
+ { value: 12, weight: 0.07 },
+ { value: 13, weight: 0.08 },
+ { value: 14, weight: 0.09 },
+ { value: 15, weight: 0.08 },
+ { value: 16, weight: 0.07 },
+ { value: 17, weight: 0.06 },
+ { value: 18, weight: 0.05 },
+ { value: 19, weight: 0.04 },
+ { value: 20, weight: 0.03 },
+ { value: 21, weight: 0.03 },
+ { value: 22, weight: 0.02 },
+ { value: 23, weight: 0.02 },
+];
+
+const dayOfWeekWeights: WeightedOption[] = [
+ { value: 0, weight: 0.08 }, // Sunday
+ { value: 1, weight: 0.16 }, // Monday
+ { value: 2, weight: 0.17 }, // Tuesday
+ { value: 3, weight: 0.17 }, // Wednesday
+ { value: 4, weight: 0.16 }, // Thursday
+ { value: 5, weight: 0.15 }, // Friday
+ { value: 6, weight: 0.11 }, // Saturday
+];
+
+export function getWeightedHour(): number {
+ return weightedRandom(hourlyWeights);
+}
+
+export function getDayOfWeekMultiplier(dayOfWeek: number): number {
+ const weight = dayOfWeekWeights.find(d => d.value === dayOfWeek)?.weight ?? 0.14;
+ return weight / 0.14; // Normalize around 1.0
+}
+
+export function generateTimestampForDay(day: Date): Date {
+ const hour = getWeightedHour();
+ const minute = randomInt(0, 59);
+ const second = randomInt(0, 59);
+ const millisecond = randomInt(0, 999);
+
+ const timestamp = new Date(day);
+ timestamp.setHours(hour, minute, second, millisecond);
+
+ return timestamp;
+}
+
+export function getSessionCountForDay(baseCount: number, day: Date): number {
+ const dayOfWeek = day.getDay();
+ const multiplier = getDayOfWeekMultiplier(dayOfWeek);
+
+ // Add some random variance (±20%)
+ const variance = 0.8 + Math.random() * 0.4;
+
+ return Math.round(baseCount * multiplier * variance);
+}
diff --git a/scripts/seed/generators/events.ts b/scripts/seed/generators/events.ts
new file mode 100644
index 000000000..c9ae6e4e4
--- /dev/null
+++ b/scripts/seed/generators/events.ts
@@ -0,0 +1,191 @@
+import { getRandomReferrer } from '../distributions/referrers.js';
+import { addSeconds, randomInt, uuid } from '../utils.js';
+import type { SessionData } from './sessions.js';
+
+export const EVENT_TYPE = {
+ pageView: 1,
+ customEvent: 2,
+} as const;
+
+export interface PageConfig {
+ path: string;
+ title: string;
+ weight: number;
+ avgTimeOnPage: number;
+}
+
+export interface CustomEventConfig {
+ name: string;
+ weight: number;
+ pages?: string[];
+ data?: Record;
+}
+
+export interface JourneyConfig {
+ pages: string[];
+ weight: number;
+}
+
+export interface EventData {
+ id: string;
+ websiteId: string;
+ sessionId: string;
+ visitId: string;
+ eventType: number;
+ urlPath: string;
+ urlQuery: string | null;
+ pageTitle: string | null;
+ hostname: string;
+ referrerDomain: string | null;
+ referrerPath: string | null;
+ utmSource: string | null;
+ utmMedium: string | null;
+ utmCampaign: string | null;
+ utmContent: string | null;
+ utmTerm: string | null;
+ gclid: string | null;
+ fbclid: string | null;
+ eventName: string | null;
+ tag: string | null;
+ createdAt: Date;
+}
+
+export interface EventDataEntry {
+ id: string;
+ websiteId: string;
+ websiteEventId: string;
+ dataKey: string;
+ stringValue: string | null;
+ numberValue: number | null;
+ dateValue: Date | null;
+ dataType: number;
+ createdAt: Date;
+}
+
+export interface SiteConfig {
+ hostname: string;
+ pages: PageConfig[];
+ journeys: JourneyConfig[];
+ customEvents: CustomEventConfig[];
+}
+
+function getPageTitle(pages: PageConfig[], path: string): string | null {
+ const page = pages.find(p => p.path === path);
+ return page?.title ?? null;
+}
+
+function getPageTimeOnPage(pages: PageConfig[], path: string): number {
+ const page = pages.find(p => p.path === path);
+ return page?.avgTimeOnPage ?? 30;
+}
+
+export function generateEventsForSession(
+ session: SessionData,
+ siteConfig: SiteConfig,
+ journey: string[],
+): { events: EventData[]; eventDataEntries: EventDataEntry[] } {
+ const events: EventData[] = [];
+ const eventDataEntries: EventDataEntry[] = [];
+ const visitId = uuid();
+
+ let currentTime = session.createdAt;
+ const referrer = getRandomReferrer();
+
+ for (let i = 0; i < journey.length; i++) {
+ const pagePath = journey[i];
+ const isFirstPage = i === 0;
+
+ const eventId = uuid();
+ const pageTitle = getPageTitle(siteConfig.pages, pagePath);
+
+ events.push({
+ id: eventId,
+ websiteId: session.websiteId,
+ sessionId: session.id,
+ visitId,
+ eventType: EVENT_TYPE.pageView,
+ urlPath: pagePath,
+ urlQuery: null,
+ pageTitle,
+ hostname: siteConfig.hostname,
+ referrerDomain: isFirstPage ? referrer.domain : null,
+ referrerPath: isFirstPage ? referrer.path : null,
+ utmSource: isFirstPage ? referrer.utmSource : null,
+ utmMedium: isFirstPage ? referrer.utmMedium : null,
+ utmCampaign: isFirstPage ? referrer.utmCampaign : null,
+ utmContent: isFirstPage ? referrer.utmContent : null,
+ utmTerm: isFirstPage ? referrer.utmTerm : null,
+ gclid: isFirstPage ? referrer.gclid : null,
+ fbclid: isFirstPage ? referrer.fbclid : null,
+ eventName: null,
+ tag: null,
+ createdAt: currentTime,
+ });
+
+ // Check for custom events on this page
+ for (const customEvent of siteConfig.customEvents) {
+ // Check if this event can occur on this page
+ if (customEvent.pages && !customEvent.pages.includes(pagePath)) {
+ continue;
+ }
+
+ // Random chance based on weight
+ if (Math.random() < customEvent.weight) {
+ currentTime = addSeconds(currentTime, randomInt(2, 15));
+
+ const customEventId = uuid();
+ events.push({
+ id: customEventId,
+ websiteId: session.websiteId,
+ sessionId: session.id,
+ visitId,
+ eventType: EVENT_TYPE.customEvent,
+ urlPath: pagePath,
+ urlQuery: null,
+ pageTitle,
+ hostname: siteConfig.hostname,
+ referrerDomain: null,
+ referrerPath: null,
+ utmSource: null,
+ utmMedium: null,
+ utmCampaign: null,
+ utmContent: null,
+ utmTerm: null,
+ gclid: null,
+ fbclid: null,
+ eventName: customEvent.name,
+ tag: null,
+ createdAt: currentTime,
+ });
+
+ // Generate event data if configured
+ if (customEvent.data) {
+ for (const [key, values] of Object.entries(customEvent.data)) {
+ const value = values[Math.floor(Math.random() * values.length)];
+ const isNumber = typeof value === 'number';
+
+ eventDataEntries.push({
+ id: uuid(),
+ websiteId: session.websiteId,
+ websiteEventId: customEventId,
+ dataKey: key,
+ stringValue: isNumber ? null : String(value),
+ numberValue: isNumber ? value : null,
+ dateValue: null,
+ dataType: isNumber ? 2 : 1, // 1 = string, 2 = number
+ createdAt: currentTime,
+ });
+ }
+ }
+ }
+ }
+
+ // Time spent on page before navigating
+ const timeOnPage = getPageTimeOnPage(siteConfig.pages, pagePath);
+ const variance = Math.floor(timeOnPage * 0.5);
+ const actualTime = timeOnPage + randomInt(-variance, variance);
+ currentTime = addSeconds(currentTime, Math.max(5, actualTime));
+ }
+
+ return { events, eventDataEntries };
+}
diff --git a/scripts/seed/generators/revenue.ts b/scripts/seed/generators/revenue.ts
new file mode 100644
index 000000000..591606186
--- /dev/null
+++ b/scripts/seed/generators/revenue.ts
@@ -0,0 +1,65 @@
+import { randomFloat, uuid } from '../utils.js';
+import type { EventData } from './events.js';
+
+export interface RevenueConfig {
+ eventName: string;
+ minAmount: number;
+ maxAmount: number;
+ currency: string;
+ weight: number;
+}
+
+export interface RevenueData {
+ id: string;
+ websiteId: string;
+ sessionId: string;
+ eventId: string;
+ eventName: string;
+ currency: string;
+ revenue: number;
+ createdAt: Date;
+}
+
+export function generateRevenue(event: EventData, config: RevenueConfig): RevenueData | null {
+ if (event.eventName !== config.eventName) {
+ return null;
+ }
+
+ if (Math.random() > config.weight) {
+ return null;
+ }
+
+ const revenue = randomFloat(config.minAmount, config.maxAmount);
+
+ return {
+ id: uuid(),
+ websiteId: event.websiteId,
+ sessionId: event.sessionId,
+ eventId: event.id,
+ eventName: event.eventName!,
+ currency: config.currency,
+ revenue: Math.round(revenue * 100) / 100, // Round to 2 decimal places
+ createdAt: event.createdAt,
+ };
+}
+
+export function generateRevenueForEvents(
+ events: EventData[],
+ configs: RevenueConfig[],
+): RevenueData[] {
+ const revenueEntries: RevenueData[] = [];
+
+ for (const event of events) {
+ if (!event.eventName) continue;
+
+ for (const config of configs) {
+ const revenue = generateRevenue(event, config);
+ if (revenue) {
+ revenueEntries.push(revenue);
+ break; // Only one revenue per event
+ }
+ }
+ }
+
+ return revenueEntries;
+}
diff --git a/scripts/seed/generators/sessions.ts b/scripts/seed/generators/sessions.ts
new file mode 100644
index 000000000..5d69ff4f8
--- /dev/null
+++ b/scripts/seed/generators/sessions.ts
@@ -0,0 +1,52 @@
+import { getRandomDevice } from '../distributions/devices.js';
+import { getRandomGeo, getRandomLanguage } from '../distributions/geographic.js';
+import { generateTimestampForDay } from '../distributions/temporal.js';
+import { uuid } from '../utils.js';
+
+export interface SessionData {
+ id: string;
+ websiteId: string;
+ browser: string;
+ os: string;
+ device: string;
+ screen: string;
+ language: string;
+ country: string;
+ region: string;
+ city: string;
+ createdAt: Date;
+}
+
+export function createSession(websiteId: string, day: Date): SessionData {
+ const deviceInfo = getRandomDevice();
+ const geo = getRandomGeo();
+ const language = getRandomLanguage();
+ const createdAt = generateTimestampForDay(day);
+
+ return {
+ id: uuid(),
+ websiteId,
+ browser: deviceInfo.browser,
+ os: deviceInfo.os,
+ device: deviceInfo.device,
+ screen: deviceInfo.screen,
+ language,
+ country: geo.country,
+ region: geo.region,
+ city: geo.city,
+ createdAt,
+ };
+}
+
+export function createSessions(websiteId: string, day: Date, count: number): SessionData[] {
+ const sessions: SessionData[] = [];
+
+ for (let i = 0; i < count; i++) {
+ sessions.push(createSession(websiteId, day));
+ }
+
+ // Sort by createdAt to maintain chronological order
+ sessions.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
+
+ return sessions;
+}
diff --git a/scripts/seed/index.ts b/scripts/seed/index.ts
new file mode 100644
index 000000000..2357ca4d9
--- /dev/null
+++ b/scripts/seed/index.ts
@@ -0,0 +1,378 @@
+/* eslint-disable no-console */
+import 'dotenv/config';
+import { PrismaPg } from '@prisma/adapter-pg';
+import { type Prisma, PrismaClient } from '../../src/generated/prisma/client.js';
+import { getSessionCountForDay } from './distributions/temporal.js';
+import {
+ type EventData,
+ type EventDataEntry,
+ generateEventsForSession,
+} from './generators/events.js';
+import {
+ generateRevenueForEvents,
+ type RevenueConfig,
+ type RevenueData,
+} from './generators/revenue.js';
+import { createSessions, type SessionData } from './generators/sessions.js';
+import {
+ BLOG_SESSIONS_PER_DAY,
+ BLOG_WEBSITE_DOMAIN,
+ BLOG_WEBSITE_NAME,
+ getBlogJourney,
+ getBlogSiteConfig,
+} from './sites/blog.js';
+import {
+ getSaasJourney,
+ getSaasSiteConfig,
+ SAAS_SESSIONS_PER_DAY,
+ SAAS_WEBSITE_DOMAIN,
+ SAAS_WEBSITE_NAME,
+ saasRevenueConfigs,
+} from './sites/saas.js';
+import { formatNumber, generateDatesBetween, progressBar, subDays, uuid } from './utils.js';
+
+const BATCH_SIZE = 1000;
+
+type SessionCreateInput = Prisma.SessionCreateManyInput;
+type WebsiteEventCreateInput = Prisma.WebsiteEventCreateManyInput;
+type EventDataCreateInput = Prisma.EventDataCreateManyInput;
+type RevenueCreateInput = Prisma.RevenueCreateManyInput;
+
+export interface SeedConfig {
+ days: number;
+ clear: boolean;
+ verbose: boolean;
+}
+
+export interface SeedResult {
+ websites: number;
+ sessions: number;
+ events: number;
+ eventData: number;
+ revenue: number;
+}
+
+async function batchInsertSessions(
+ prisma: PrismaClient,
+ data: SessionCreateInput[],
+ verbose: boolean,
+): Promise {
+ for (let i = 0; i < data.length; i += BATCH_SIZE) {
+ const batch = data.slice(i, i + BATCH_SIZE);
+ await prisma.session.createMany({ data: batch, skipDuplicates: true });
+ if (verbose) {
+ console.log(
+ ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} session records`,
+ );
+ }
+ }
+}
+
+async function batchInsertEvents(
+ prisma: PrismaClient,
+ data: WebsiteEventCreateInput[],
+ verbose: boolean,
+): Promise {
+ for (let i = 0; i < data.length; i += BATCH_SIZE) {
+ const batch = data.slice(i, i + BATCH_SIZE);
+ await prisma.websiteEvent.createMany({ data: batch, skipDuplicates: true });
+ if (verbose) {
+ console.log(
+ ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} event records`,
+ );
+ }
+ }
+}
+
+async function batchInsertEventData(
+ prisma: PrismaClient,
+ data: EventDataCreateInput[],
+ verbose: boolean,
+): Promise {
+ for (let i = 0; i < data.length; i += BATCH_SIZE) {
+ const batch = data.slice(i, i + BATCH_SIZE);
+ await prisma.eventData.createMany({ data: batch, skipDuplicates: true });
+ if (verbose) {
+ console.log(
+ ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} eventData records`,
+ );
+ }
+ }
+}
+
+async function batchInsertRevenue(
+ prisma: PrismaClient,
+ data: RevenueCreateInput[],
+ verbose: boolean,
+): Promise {
+ for (let i = 0; i < data.length; i += BATCH_SIZE) {
+ const batch = data.slice(i, i + BATCH_SIZE);
+ await prisma.revenue.createMany({ data: batch, skipDuplicates: true });
+ if (verbose) {
+ console.log(
+ ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} revenue records`,
+ );
+ }
+ }
+}
+
+async function findAdminUser(prisma: PrismaClient): Promise {
+ const adminUser = await prisma.user.findFirst({
+ where: { role: 'admin' },
+ select: { id: true },
+ });
+
+ if (!adminUser) {
+ throw new Error(
+ 'No admin user found in the database.\n' +
+ 'Please ensure you have run the initial setup and created an admin user.\n' +
+ 'The default admin user is created during first build (username: admin, password: umami).',
+ );
+ }
+
+ return adminUser.id;
+}
+
+async function createWebsite(
+ prisma: PrismaClient,
+ name: string,
+ domain: string,
+ adminUserId: string,
+): Promise {
+ const websiteId = uuid();
+
+ await prisma.website.create({
+ data: {
+ id: websiteId,
+ name,
+ domain,
+ userId: adminUserId,
+ createdBy: adminUserId,
+ },
+ });
+
+ return websiteId;
+}
+
+async function clearDemoData(prisma: PrismaClient): Promise {
+ console.log('Clearing existing demo data...');
+
+ const demoWebsites = await prisma.website.findMany({
+ where: {
+ OR: [{ name: BLOG_WEBSITE_NAME }, { name: SAAS_WEBSITE_NAME }],
+ },
+ select: { id: true },
+ });
+
+ const websiteIds = demoWebsites.map(w => w.id);
+
+ if (websiteIds.length === 0) {
+ console.log(' No existing demo websites found');
+ return;
+ }
+
+ console.log(` Found ${websiteIds.length} demo website(s)`);
+
+ // Delete in correct order due to foreign key constraints
+ await prisma.revenue.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.eventData.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.sessionData.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.websiteEvent.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.session.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.segment.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.report.deleteMany({ where: { websiteId: { in: websiteIds } } });
+ await prisma.website.deleteMany({ where: { id: { in: websiteIds } } });
+
+ console.log(' Cleared existing demo data');
+}
+
+interface SiteGeneratorConfig {
+ name: string;
+ domain: string;
+ sessionsPerDay: number;
+ getSiteConfig: () => ReturnType;
+ getJourney: () => string[];
+ revenueConfigs?: RevenueConfig[];
+}
+
+async function generateSiteData(
+ prisma: PrismaClient,
+ config: SiteGeneratorConfig,
+ days: Date[],
+ adminUserId: string,
+ verbose: boolean,
+): Promise<{ sessions: number; events: number; eventData: number; revenue: number }> {
+ console.log(`\nGenerating data for ${config.name}...`);
+
+ const websiteId = await createWebsite(prisma, config.name, config.domain, adminUserId);
+ console.log(` Created website: ${config.name} (${websiteId})`);
+
+ const siteConfig = config.getSiteConfig();
+
+ const allSessions: SessionData[] = [];
+ const allEvents: EventData[] = [];
+ const allEventData: EventDataEntry[] = [];
+ const allRevenue: RevenueData[] = [];
+
+ for (let dayIndex = 0; dayIndex < days.length; dayIndex++) {
+ const day = days[dayIndex];
+ const sessionCount = getSessionCountForDay(config.sessionsPerDay, day);
+ const sessions = createSessions(websiteId, day, sessionCount);
+
+ for (const session of sessions) {
+ const journey = config.getJourney();
+ const { events, eventDataEntries } = generateEventsForSession(session, siteConfig, journey);
+
+ allSessions.push(session);
+ allEvents.push(...events);
+ allEventData.push(...eventDataEntries);
+
+ if (config.revenueConfigs) {
+ const revenueEntries = generateRevenueForEvents(events, config.revenueConfigs);
+ allRevenue.push(...revenueEntries);
+ }
+ }
+
+ // Show progress (every day in verbose mode, otherwise every 2 days)
+ const shouldShowProgress = verbose || dayIndex % 2 === 0 || dayIndex === days.length - 1;
+ if (shouldShowProgress) {
+ process.stdout.write(
+ `\r ${progressBar(dayIndex + 1, days.length)} Day ${dayIndex + 1}/${days.length}`,
+ );
+ }
+ }
+
+ console.log(''); // New line after progress bar
+
+ // Batch insert all data
+ console.log(` Inserting ${formatNumber(allSessions.length)} sessions...`);
+ await batchInsertSessions(prisma, allSessions as SessionCreateInput[], verbose);
+
+ console.log(` Inserting ${formatNumber(allEvents.length)} events...`);
+ await batchInsertEvents(prisma, allEvents as WebsiteEventCreateInput[], verbose);
+
+ if (allEventData.length > 0) {
+ console.log(` Inserting ${formatNumber(allEventData.length)} event data entries...`);
+ await batchInsertEventData(prisma, allEventData as EventDataCreateInput[], verbose);
+ }
+
+ if (allRevenue.length > 0) {
+ console.log(` Inserting ${formatNumber(allRevenue.length)} revenue entries...`);
+ await batchInsertRevenue(prisma, allRevenue as RevenueCreateInput[], verbose);
+ }
+
+ return {
+ sessions: allSessions.length,
+ events: allEvents.length,
+ eventData: allEventData.length,
+ revenue: allRevenue.length,
+ };
+}
+
+function createPrismaClient(): PrismaClient {
+ const url = process.env.DATABASE_URL;
+ if (!url) {
+ throw new Error(
+ 'DATABASE_URL environment variable is not set.\n' +
+ 'Please set DATABASE_URL in your .env file or environment.\n' +
+ 'Example: DATABASE_URL=postgresql://user:password@localhost:5432/umami',
+ );
+ }
+
+ let schema: string | undefined;
+ try {
+ const connectionUrl = new URL(url);
+ schema = connectionUrl.searchParams.get('schema') ?? undefined;
+ } catch {
+ throw new Error(
+ 'DATABASE_URL is not a valid URL.\n' +
+ 'Expected format: postgresql://user:password@host:port/database\n' +
+ `Received: ${url.substring(0, 30)}...`,
+ );
+ }
+
+ const adapter = new PrismaPg({ connectionString: url }, { schema });
+
+ return new PrismaClient({
+ adapter,
+ errorFormat: 'pretty',
+ });
+}
+
+export async function seed(config: SeedConfig): Promise {
+ const prisma = createPrismaClient();
+
+ try {
+ const endDate = new Date();
+ const startDate = subDays(endDate, config.days);
+ const days = generateDatesBetween(startDate, endDate);
+
+ console.log(`\nSeed Configuration:`);
+ console.log(
+ ` Date range: ${startDate.toISOString().split('T')[0]} to ${endDate.toISOString().split('T')[0]}`,
+ );
+ console.log(` Days: ${days.length}`);
+ console.log(` Clear existing: ${config.clear}`);
+
+ if (config.clear) {
+ await clearDemoData(prisma);
+ }
+
+ // Find admin user to own the demo websites
+ const adminUserId = await findAdminUser(prisma);
+ console.log(` Using admin user: ${adminUserId}`);
+
+ // Generate Blog site (low traffic)
+ const blogResults = await generateSiteData(
+ prisma,
+ {
+ name: BLOG_WEBSITE_NAME,
+ domain: BLOG_WEBSITE_DOMAIN,
+ sessionsPerDay: BLOG_SESSIONS_PER_DAY,
+ getSiteConfig: getBlogSiteConfig,
+ getJourney: getBlogJourney,
+ },
+ days,
+ adminUserId,
+ config.verbose,
+ );
+
+ // Generate SaaS site (high traffic)
+ const saasResults = await generateSiteData(
+ prisma,
+ {
+ name: SAAS_WEBSITE_NAME,
+ domain: SAAS_WEBSITE_DOMAIN,
+ sessionsPerDay: SAAS_SESSIONS_PER_DAY,
+ getSiteConfig: getSaasSiteConfig,
+ getJourney: getSaasJourney,
+ revenueConfigs: saasRevenueConfigs,
+ },
+ days,
+ adminUserId,
+ config.verbose,
+ );
+
+ const result: SeedResult = {
+ websites: 2,
+ sessions: blogResults.sessions + saasResults.sessions,
+ events: blogResults.events + saasResults.events,
+ eventData: blogResults.eventData + saasResults.eventData,
+ revenue: blogResults.revenue + saasResults.revenue,
+ };
+
+ console.log(`\n${'─'.repeat(50)}`);
+ console.log(`Seed Complete!`);
+ console.log(`${'─'.repeat(50)}`);
+ console.log(` Websites: ${formatNumber(result.websites)}`);
+ console.log(` Sessions: ${formatNumber(result.sessions)}`);
+ console.log(` Events: ${formatNumber(result.events)}`);
+ console.log(` Event Data: ${formatNumber(result.eventData)}`);
+ console.log(` Revenue: ${formatNumber(result.revenue)}`);
+ console.log(`${'─'.repeat(50)}\n`);
+
+ return result;
+ } finally {
+ await prisma.$disconnect();
+ }
+}
diff --git a/scripts/seed/sites/blog.ts b/scripts/seed/sites/blog.ts
new file mode 100644
index 000000000..f3560cecc
--- /dev/null
+++ b/scripts/seed/sites/blog.ts
@@ -0,0 +1,108 @@
+import type {
+ CustomEventConfig,
+ JourneyConfig,
+ PageConfig,
+ SiteConfig,
+} from '../generators/events.js';
+import { type WeightedOption, weightedRandom } from '../utils.js';
+
+export const BLOG_WEBSITE_NAME = 'Demo Blog';
+export const BLOG_WEBSITE_DOMAIN = 'blog.example.com';
+
+const blogPosts = [
+ 'getting-started-with-analytics',
+ 'privacy-first-tracking',
+ 'understanding-your-visitors',
+ 'improving-page-performance',
+ 'seo-best-practices',
+ 'content-marketing-guide',
+ 'building-audience-trust',
+ 'data-driven-decisions',
+];
+
+export const blogPages: PageConfig[] = [
+ { path: '/', title: 'Demo Blog - Home', weight: 0.25, avgTimeOnPage: 30 },
+ { path: '/blog', title: 'Blog Posts', weight: 0.2, avgTimeOnPage: 45 },
+ { path: '/about', title: 'About Us', weight: 0.1, avgTimeOnPage: 60 },
+ { path: '/contact', title: 'Contact', weight: 0.05, avgTimeOnPage: 45 },
+ ...blogPosts.map(slug => ({
+ path: `/blog/${slug}`,
+ title: slug
+ .split('-')
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
+ .join(' '),
+ weight: 0.05,
+ avgTimeOnPage: 180,
+ })),
+];
+
+export const blogJourneys: JourneyConfig[] = [
+ // Direct to blog post (organic search)
+ { pages: ['/blog/getting-started-with-analytics'], weight: 0.15 },
+ { pages: ['/blog/privacy-first-tracking'], weight: 0.12 },
+ { pages: ['/blog/understanding-your-visitors'], weight: 0.1 },
+
+ // Homepage bounces
+ { pages: ['/'], weight: 0.15 },
+
+ // Homepage to blog listing
+ { pages: ['/', '/blog'], weight: 0.1 },
+
+ // Homepage to blog post
+ { pages: ['/', '/blog', '/blog/seo-best-practices'], weight: 0.08 },
+ { pages: ['/', '/blog', '/blog/content-marketing-guide'], weight: 0.08 },
+
+ // About page visits
+ { pages: ['/', '/about'], weight: 0.07 },
+ { pages: ['/', '/about', '/contact'], weight: 0.05 },
+
+ // Blog post to another
+ { pages: ['/blog/improving-page-performance', '/blog/data-driven-decisions'], weight: 0.05 },
+
+ // Longer sessions
+ { pages: ['/', '/blog', '/blog/building-audience-trust', '/about'], weight: 0.05 },
+];
+
+export const blogCustomEvents: CustomEventConfig[] = [
+ {
+ name: 'newsletter_signup',
+ weight: 0.03,
+ pages: ['/', '/blog'],
+ },
+ {
+ name: 'share_click',
+ weight: 0.05,
+ pages: blogPosts.map(slug => `/blog/${slug}`),
+ data: {
+ platform: ['twitter', 'linkedin', 'facebook', 'copy_link'],
+ },
+ },
+ {
+ name: 'scroll_depth',
+ weight: 0.2,
+ pages: blogPosts.map(slug => `/blog/${slug}`),
+ data: {
+ depth: [25, 50, 75, 100],
+ },
+ },
+];
+
+export function getBlogSiteConfig(): SiteConfig {
+ return {
+ hostname: BLOG_WEBSITE_DOMAIN,
+ pages: blogPages,
+ journeys: blogJourneys,
+ customEvents: blogCustomEvents,
+ };
+}
+
+export function getBlogJourney(): string[] {
+ const journeyWeights: WeightedOption[] = blogJourneys.map(j => ({
+ value: j.pages,
+ weight: j.weight,
+ }));
+
+ return weightedRandom(journeyWeights);
+}
+
+export const BLOG_SESSIONS_PER_DAY = 3; // ~90 sessions per month
diff --git a/scripts/seed/sites/saas.ts b/scripts/seed/sites/saas.ts
new file mode 100644
index 000000000..ad57ef279
--- /dev/null
+++ b/scripts/seed/sites/saas.ts
@@ -0,0 +1,185 @@
+import type {
+ CustomEventConfig,
+ JourneyConfig,
+ PageConfig,
+ SiteConfig,
+} from '../generators/events.js';
+import type { RevenueConfig } from '../generators/revenue.js';
+import { type WeightedOption, weightedRandom } from '../utils.js';
+
+export const SAAS_WEBSITE_NAME = 'Demo SaaS';
+export const SAAS_WEBSITE_DOMAIN = 'app.example.com';
+
+const docsSections = [
+ 'getting-started',
+ 'installation',
+ 'configuration',
+ 'api-reference',
+ 'integrations',
+];
+
+const blogPosts = [
+ 'announcing-v2',
+ 'customer-success-story',
+ 'product-roadmap',
+ 'security-best-practices',
+];
+
+export const saasPages: PageConfig[] = [
+ { path: '/', title: 'Demo SaaS - Analytics Made Simple', weight: 0.2, avgTimeOnPage: 45 },
+ { path: '/features', title: 'Features', weight: 0.15, avgTimeOnPage: 90 },
+ { path: '/pricing', title: 'Pricing', weight: 0.15, avgTimeOnPage: 120 },
+ { path: '/docs', title: 'Documentation', weight: 0.1, avgTimeOnPage: 60 },
+ { path: '/blog', title: 'Blog', weight: 0.05, avgTimeOnPage: 45 },
+ { path: '/signup', title: 'Sign Up', weight: 0.08, avgTimeOnPage: 90 },
+ { path: '/login', title: 'Login', weight: 0.05, avgTimeOnPage: 30 },
+ { path: '/demo', title: 'Request Demo', weight: 0.05, avgTimeOnPage: 60 },
+ ...docsSections.map(slug => ({
+ path: `/docs/${slug}`,
+ title: `Docs: ${slug
+ .split('-')
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
+ .join(' ')}`,
+ weight: 0.02,
+ avgTimeOnPage: 180,
+ })),
+ ...blogPosts.map(slug => ({
+ path: `/blog/${slug}`,
+ title: slug
+ .split('-')
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
+ .join(' '),
+ weight: 0.02,
+ avgTimeOnPage: 150,
+ })),
+];
+
+export const saasJourneys: JourneyConfig[] = [
+ // Conversion funnel
+ { pages: ['/', '/features', '/pricing', '/signup'], weight: 0.12 },
+ { pages: ['/', '/pricing', '/signup'], weight: 0.1 },
+ { pages: ['/pricing', '/signup'], weight: 0.08 },
+
+ // Feature exploration
+ { pages: ['/', '/features'], weight: 0.1 },
+ { pages: ['/', '/features', '/pricing'], weight: 0.08 },
+
+ // Documentation users
+ { pages: ['/docs', '/docs/getting-started'], weight: 0.08 },
+ { pages: ['/docs/getting-started', '/docs/installation', '/docs/configuration'], weight: 0.06 },
+ { pages: ['/docs/api-reference'], weight: 0.05 },
+
+ // Blog readers
+ { pages: ['/blog/announcing-v2'], weight: 0.05 },
+ { pages: ['/blog/customer-success-story'], weight: 0.04 },
+
+ // Returning users
+ { pages: ['/login'], weight: 0.08 },
+
+ // Bounces
+ { pages: ['/'], weight: 0.08 },
+ { pages: ['/pricing'], weight: 0.05 },
+
+ // Demo requests
+ { pages: ['/', '/demo'], weight: 0.03 },
+];
+
+export const saasCustomEvents: CustomEventConfig[] = [
+ {
+ name: 'signup_started',
+ weight: 0.6,
+ pages: ['/signup'],
+ data: {
+ plan: ['free', 'pro', 'enterprise'],
+ },
+ },
+ {
+ name: 'signup_completed',
+ weight: 0.3,
+ pages: ['/signup'],
+ data: {
+ plan: ['free', 'pro', 'enterprise'],
+ method: ['email', 'google', 'github'],
+ },
+ },
+ {
+ name: 'purchase',
+ weight: 0.15,
+ pages: ['/signup', '/pricing'],
+ data: {
+ plan: ['pro', 'enterprise'],
+ billing: ['monthly', 'annual'],
+ revenue: [29, 49, 99, 299],
+ currency: ['USD'],
+ },
+ },
+ {
+ name: 'demo_requested',
+ weight: 0.5,
+ pages: ['/demo'],
+ data: {
+ company_size: ['1-10', '11-50', '51-200', '200+'],
+ },
+ },
+ {
+ name: 'feature_viewed',
+ weight: 0.3,
+ pages: ['/features'],
+ data: {
+ feature: ['analytics', 'reports', 'api', 'integrations', 'privacy'],
+ },
+ },
+ {
+ name: 'cta_click',
+ weight: 0.15,
+ pages: ['/', '/features', '/pricing'],
+ data: {
+ button: ['hero_signup', 'nav_signup', 'pricing_cta', 'footer_cta'],
+ },
+ },
+ {
+ name: 'docs_search',
+ weight: 0.2,
+ pages: ['/docs', ...docsSections.map(s => `/docs/${s}`)],
+ data: {
+ query_type: ['api', 'setup', 'integration', 'troubleshooting'],
+ },
+ },
+];
+
+export const saasRevenueConfigs: RevenueConfig[] = [
+ {
+ eventName: 'purchase',
+ minAmount: 29,
+ maxAmount: 29,
+ currency: 'USD',
+ weight: 0.7, // 70% Pro plan
+ },
+ {
+ eventName: 'purchase',
+ minAmount: 299,
+ maxAmount: 299,
+ currency: 'USD',
+ weight: 0.3, // 30% Enterprise
+ },
+];
+
+export function getSaasSiteConfig(): SiteConfig {
+ return {
+ hostname: SAAS_WEBSITE_DOMAIN,
+ pages: saasPages,
+ journeys: saasJourneys,
+ customEvents: saasCustomEvents,
+ };
+}
+
+export function getSaasJourney(): string[] {
+ const journeyWeights: WeightedOption[] = saasJourneys.map(j => ({
+ value: j.pages,
+ weight: j.weight,
+ }));
+
+ return weightedRandom(journeyWeights);
+}
+
+export const SAAS_SESSIONS_PER_DAY = 500;
diff --git a/scripts/seed/utils.ts b/scripts/seed/utils.ts
new file mode 100644
index 000000000..7b44261ed
--- /dev/null
+++ b/scripts/seed/utils.ts
@@ -0,0 +1,85 @@
+import { v4 as uuidv4 } from 'uuid';
+
+export interface WeightedOption {
+ value: T;
+ weight: number;
+}
+
+export function weightedRandom(options: WeightedOption[]): T {
+ const totalWeight = options.reduce((sum, opt) => sum + opt.weight, 0);
+ let random = Math.random() * totalWeight;
+
+ for (const option of options) {
+ random -= option.weight;
+ if (random <= 0) {
+ return option.value;
+ }
+ }
+
+ return options[options.length - 1].value;
+}
+
+export function randomInt(min: number, max: number): number {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+export function randomFloat(min: number, max: number): number {
+ return Math.random() * (max - min) + min;
+}
+
+export function pickRandom(array: T[]): T {
+ return array[Math.floor(Math.random() * array.length)];
+}
+
+export function shuffleArray(array: T[]): T[] {
+ const result = [...array];
+ for (let i = result.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1));
+ [result[i], result[j]] = [result[j], result[i]];
+ }
+ return result;
+}
+
+export function uuid(): string {
+ return uuidv4();
+}
+
+export function generateDatesBetween(startDate: Date, endDate: Date): Date[] {
+ const dates: Date[] = [];
+ const current = new Date(startDate);
+ current.setHours(0, 0, 0, 0);
+
+ while (current <= endDate) {
+ dates.push(new Date(current));
+ current.setDate(current.getDate() + 1);
+ }
+
+ return dates;
+}
+
+export function addHours(date: Date, hours: number): Date {
+ return new Date(date.getTime() + hours * 60 * 60 * 1000);
+}
+
+export function addMinutes(date: Date, minutes: number): Date {
+ return new Date(date.getTime() + minutes * 60 * 1000);
+}
+
+export function addSeconds(date: Date, seconds: number): Date {
+ return new Date(date.getTime() + seconds * 1000);
+}
+
+export function subDays(date: Date, days: number): Date {
+ return new Date(date.getTime() - days * 24 * 60 * 60 * 1000);
+}
+
+export function formatNumber(num: number): string {
+ return num.toLocaleString();
+}
+
+export function progressBar(current: number, total: number, width = 30): string {
+ const percent = current / total;
+ const filled = Math.round(width * percent);
+ const empty = width - filled;
+ return `[${'█'.repeat(filled)}${'░'.repeat(empty)}] ${Math.round(percent * 100)}%`;
+}
diff --git a/scripts/set-routes-manifest.js b/scripts/set-routes-manifest.js
deleted file mode 100644
index 2dfb71716..000000000
--- a/scripts/set-routes-manifest.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/* eslint-disable no-console */
-require('dotenv').config();
-const fs = require('fs');
-const path = require('path');
-
-const routesManifestPath = path.resolve(__dirname, '../.next/routes-manifest.json');
-const originalPath = path.resolve(__dirname, '../.next/routes-manifest-orig.json');
-const originalManifest = require(originalPath);
-
-const basePath = originalManifest.basePath;
-
-const API_PATH = basePath + '/api/:path*';
-const TRACKER_SCRIPT = basePath + '/script.js';
-
-const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT;
-const trackerScriptName = process.env.TRACKER_SCRIPT_NAME;
-
-const headers = [];
-const rewrites = [];
-
-if (collectApiEndpoint) {
- const apiRoute = originalManifest.headers.find(route => route.source === API_PATH);
- const routeRegex = new RegExp(apiRoute.regex);
-
- const normalizedSource = basePath + collectApiEndpoint;
-
- rewrites.push({
- source: normalizedSource,
- destination: basePath + '/api/send',
- });
-
- if (!routeRegex.test(normalizedSource)) {
- headers.push({
- source: normalizedSource,
- headers: apiRoute.headers,
- });
- }
-}
-
-if (trackerScriptName) {
- const trackerRoute = originalManifest.headers.find(route => route.source === TRACKER_SCRIPT);
-
- const names = trackerScriptName?.split(',').map(name => name.trim());
-
- if (names) {
- names.forEach(name => {
- const normalizedSource = `${basePath}/${name.replace(/^\/+/, '')}`;
-
- rewrites.push({
- source: normalizedSource,
- destination: TRACKER_SCRIPT,
- });
-
- headers.push({
- source: normalizedSource,
- headers: trackerRoute.headers,
- });
- });
- }
-}
-
-const routesManifest = { ...originalManifest };
-
-if (rewrites.length !== 0) {
- const { buildCustomRoute } = require('next/dist/lib/build-custom-route');
-
- const builtHeaders = headers.map(header => buildCustomRoute('header', header));
- const builtRewrites = rewrites.map(rewrite => buildCustomRoute('rewrite', rewrite));
-
- routesManifest.headers = [...originalManifest.headers, ...builtHeaders];
- routesManifest.rewrites = [...builtRewrites, ...originalManifest.rewrites];
-
- console.log('Using updated Next.js routes manifest');
-} else {
- console.log('Using original Next.js routes manifest');
-}
-
-fs.writeFileSync(routesManifestPath, JSON.stringify(routesManifest, null, 2));
diff --git a/scripts/start-env.js b/scripts/start-env.js
index 264c4e92b..970414ae3 100644
--- a/scripts/start-env.js
+++ b/scripts/start-env.js
@@ -1,5 +1,5 @@
-require('dotenv').config();
-const cli = require('next/dist/cli/next-start');
+import 'dotenv/config';
+import cli from 'next/dist/cli/next-start';
cli.nextStart({
port: process.env.PORT || 3000,
diff --git a/scripts/telemetry.js b/scripts/telemetry.js
index 27110cd46..78bf54fd3 100644
--- a/scripts/telemetry.js
+++ b/scripts/telemetry.js
@@ -1,10 +1,14 @@
-const os = require('os');
-const isCI = require('is-ci');
-const pkg = require('../package.json');
+import os from 'node:os';
+import path from 'node:path';
+import isCI from 'is-ci';
+import { createRequire } from 'module';
+
+const require = createRequire(import.meta.url);
+const pkg = require(path.resolve(process.cwd(), 'package.json'));
const url = 'https://api.umami.is/v1/telemetry';
-async function sendTelemetry(type) {
+export async function sendTelemetry(type) {
const { default: isDocker } = await import('is-docker');
const { default: fetch } = await import('node-fetch');
@@ -34,7 +38,3 @@ async function sendTelemetry(type) {
// Ignore
}
}
-
-module.exports = {
- sendTelemetry,
-};
diff --git a/scripts/update-tracker.js b/scripts/update-tracker.js
index 4dcbf2457..0091e8bde 100644
--- a/scripts/update-tracker.js
+++ b/scripts/update-tracker.js
@@ -1,12 +1,12 @@
/* eslint-disable no-console */
-require('dotenv').config();
-const fs = require('fs');
-const path = require('path');
+import 'dotenv/config';
+import fs from 'node:fs';
+import path from 'node:path';
const endPoint = process.env.COLLECT_API_ENDPOINT;
if (endPoint) {
- const file = path.resolve(__dirname, '../public/script.js');
+ const file = path.resolve(process.cwd(), 'public/script.js');
const tracker = fs.readFileSync(file);
diff --git a/src/app/(collect)/p/[slug]/route.ts b/src/app/(collect)/p/[slug]/route.ts
new file mode 100644
index 000000000..fd18a2834
--- /dev/null
+++ b/src/app/(collect)/p/[slug]/route.ts
@@ -0,0 +1,71 @@
+export const dynamic = 'force-dynamic';
+
+import { NextResponse } from 'next/server';
+import { POST } from '@/app/api/send/route';
+import type { Pixel } from '@/generated/prisma/client';
+import redis from '@/lib/redis';
+import { notFound } from '@/lib/response';
+import { findPixel } from '@/queries/prisma';
+
+const image = Buffer.from('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw', 'base64');
+
+export async function GET(request: Request, { params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params;
+
+ let pixel: Pixel;
+
+ if (redis.enabled) {
+ pixel = await redis.client.fetch(
+ `pixel:${slug}`,
+ async () => {
+ return findPixel({
+ where: {
+ slug,
+ },
+ });
+ },
+ 86400,
+ );
+
+ if (!pixel) {
+ return notFound();
+ }
+ } else {
+ pixel = await findPixel({
+ where: {
+ slug,
+ },
+ });
+
+ if (!pixel) {
+ return notFound();
+ }
+ }
+
+ const payload = {
+ type: 'event',
+ payload: {
+ pixel: pixel.id,
+ url: request.url,
+ referrer: request.headers.get("referer") || undefined,
+ },
+ };
+
+ const req = new Request(request.url, {
+ method: 'POST',
+ headers: request.headers,
+ body: JSON.stringify(payload),
+ });
+
+ await POST(req);
+
+ return new NextResponse(image, {
+ headers: {
+ 'Content-Type': 'image/gif',
+ 'Content-Length': image.length.toString(),
+ 'Cache-Control': 'no-cache, no-store, must-revalidate',
+ Pragma: 'no-cache',
+ Expires: '0',
+ },
+ });
+}
diff --git a/src/app/(collect)/q/[slug]/route.ts b/src/app/(collect)/q/[slug]/route.ts
new file mode 100644
index 000000000..aa9c26f3f
--- /dev/null
+++ b/src/app/(collect)/q/[slug]/route.ts
@@ -0,0 +1,61 @@
+export const dynamic = 'force-dynamic';
+
+import { NextResponse } from 'next/server';
+import { POST } from '@/app/api/send/route';
+import type { Link } from '@/generated/prisma/client';
+import redis from '@/lib/redis';
+import { notFound } from '@/lib/response';
+import { findLink } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params;
+
+ let link: Link;
+
+ if (redis.enabled) {
+ link = await redis.client.fetch(
+ `link:${slug}`,
+ async () => {
+ return findLink({
+ where: {
+ slug,
+ },
+ });
+ },
+ 86400,
+ );
+
+ if (!link) {
+ return notFound();
+ }
+ } else {
+ link = await findLink({
+ where: {
+ slug,
+ },
+ });
+
+ if (!link) {
+ return notFound();
+ }
+ }
+
+ const payload = {
+ type: 'event',
+ payload: {
+ link: link.id,
+ url: request.url,
+ referrer: request.headers.get("referer") || undefined,
+ },
+ };
+
+ const req = new Request(request.url, {
+ method: 'POST',
+ headers: request.headers,
+ body: JSON.stringify(payload),
+ });
+
+ await POST(req);
+
+ return NextResponse.redirect(link.url);
+}
diff --git a/src/app/(main)/App.tsx b/src/app/(main)/App.tsx
index b4cbdfdea..2f85a86e4 100644
--- a/src/app/(main)/App.tsx
+++ b/src/app/(main)/App.tsx
@@ -1,36 +1,92 @@
'use client';
-import { Loading } from 'react-basics';
+import { Column, Grid, Loading, Row } from '@umami/react-zen';
import Script from 'next/script';
-import { usePathname } from 'next/navigation';
-import { useLogin, useConfig } from '@/components/hooks';
-import UpdateNotice from './UpdateNotice';
+import { useEffect } from 'react';
+import { MobileNav } from '@/app/(main)/MobileNav';
+import { SideNav } from '@/app/(main)/SideNav';
+import { TopNav } from '@/app/(main)/TopNav';
+import { useConfig, useLoginQuery, useNavigation, useTeamQuery } from '@/components/hooks';
+import { LAST_TEAM_CONFIG } from '@/lib/constants';
+import { removeItem, setItem } from '@/lib/storage';
+import { UpdateNotice } from './UpdateNotice';
export function App({ children }) {
- const { user, isLoading, error } = useLogin();
+ const { user, isLoading, error } = useLoginQuery();
const config = useConfig();
- const pathname = usePathname();
+ const { pathname, router, teamId } = useNavigation();
+ const { isLoading: isTeamLoading, error: teamError } = useTeamQuery(teamId);
- if (isLoading) {
- return ;
+ useEffect(() => {
+ if (teamId) {
+ setItem(LAST_TEAM_CONFIG, teamId);
+ } else {
+ removeItem(LAST_TEAM_CONFIG);
+ }
+ }, [teamId]);
+
+ useEffect(() => {
+ if (teamId && teamError) {
+ removeItem(LAST_TEAM_CONFIG);
+ router.replace('/');
+ }
+ }, [teamId, teamError, router]);
+
+ if (isLoading || !config || (teamId && isTeamLoading)) {
+ return ;
}
if (error) {
- window.location.href = `${process.env.basePath || ''}/login`;
+ window.location.href = config.cloudMode
+ ? `${process.env.cloudUrl}/login`
+ : `${process.env.basePath || ''}/login`;
+ return null;
}
if (!user || !config) {
return null;
}
+ if (teamId && teamError) {
+ return null;
+ }
+
return (
- <>
- {children}
+
+
+
+
+
+
+
+
+
+ {children}
+
{process.env.NODE_ENV === 'production' && !pathname.includes('/share/') && (
)}
- >
+ {process.env.selfTrack && (
+
+ )}
+ {process.env.selfRecord && (
+
+ )}
+
);
}
-
-export default App;
diff --git a/src/app/(main)/MobileNav.tsx b/src/app/(main)/MobileNav.tsx
new file mode 100644
index 000000000..f731cb08a
--- /dev/null
+++ b/src/app/(main)/MobileNav.tsx
@@ -0,0 +1,86 @@
+import { Column, Grid, Row, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { WebsiteNav } from '@/app/(main)/websites/[websiteId]/WebsiteNav';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { Globe, Grid2x2, LayoutDashboard, LinkIcon } from '@/components/icons';
+import { MobileMenuButton } from '@/components/input/MobileMenuButton';
+import { UserButton } from '@/components/input/UserButton';
+import { Logo } from '@/components/svg';
+import { AdminNav } from './admin/AdminNav';
+import { SettingsNav } from './settings/SettingsNav';
+
+export function MobileNav() {
+ const { t, labels } = useMessages();
+ const { pathname, websiteId, renderUrl } = useNavigation();
+ const isAdmin = pathname.includes('/admin');
+ const isSettings = pathname.includes('/settings');
+ const isMain = !websiteId && !isAdmin && !isSettings;
+
+ const links = [
+ {
+ id: 'boards',
+ label: t(labels.boards),
+ path: '/boards',
+ icon: ,
+ },
+ {
+ id: 'websites',
+ label: t(labels.websites),
+ path: '/websites',
+ icon: ,
+ },
+ {
+ id: 'links',
+ label: t(labels.links),
+ path: '/links',
+ icon: ,
+ },
+ {
+ id: 'pixels',
+ label: t(labels.pixels),
+ path: '/pixels',
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+ {({ close }) => {
+ return (
+
+ {isMain &&
+ links.map(link => {
+ return (
+
+
+
+
+
+ );
+ })}
+ {websiteId && }
+ {isAdmin && }
+ {isSettings && }
+
+
+
+
+ );
+ }}
+
+
+ } style={{ width: 'auto' }}>
+ umami
+
+
+
+ );
+}
diff --git a/src/app/(main)/NavBar.module.css b/src/app/(main)/NavBar.module.css
deleted file mode 100644
index c7bd5ed93..000000000
--- a/src/app/(main)/NavBar.module.css
+++ /dev/null
@@ -1,76 +0,0 @@
-.navbar {
- display: grid;
- grid-template-columns: max-content 1fr 1fr;
- position: relative;
- align-items: center;
- height: 60px;
- background: var(--base75);
- border-bottom: 1px solid var(--base300);
- padding: 0 20px;
- z-index: 200;
-}
-
-.logo {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 10px;
- font-size: 16px;
- font-weight: 700;
- min-width: 0;
-}
-
-.links {
- display: flex;
- flex-direction: row;
- gap: 30px;
- padding: 0 40px;
- font-weight: 700;
- max-height: 60px;
- align-items: center;
-}
-
-.links a,
-.links a:active,
-.links a:visited {
- color: var(--font-color200);
- line-height: 60px;
- border-bottom: 2px solid transparent;
-}
-
-.links a:hover {
- color: var(--font-color100);
- border-bottom: 2px solid var(--primary400);
-}
-
-.links a.selected {
- color: var(--font-color100);
- border-bottom: 2px solid var(--primary400);
-}
-
-.actions,
-.mobile {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: flex-end;
-}
-
-.mobile {
- display: none;
-}
-
-@media only screen and (max-width: 768px) {
- .navbar {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .links,
- .actions {
- display: none;
- }
-
- .mobile {
- display: flex;
- }
-}
diff --git a/src/app/(main)/NavBar.tsx b/src/app/(main)/NavBar.tsx
deleted file mode 100644
index 147f70854..000000000
--- a/src/app/(main)/NavBar.tsx
+++ /dev/null
@@ -1,133 +0,0 @@
-'use client';
-import { useEffect } from 'react';
-import { Icon, Text } from 'react-basics';
-import Link from 'next/link';
-import classNames from 'classnames';
-import HamburgerButton from '@/components/common/HamburgerButton';
-import ThemeButton from '@/components/input/ThemeButton';
-import LanguageButton from '@/components/input/LanguageButton';
-import ProfileButton from '@/components/input/ProfileButton';
-import TeamsButton from '@/components/input/TeamsButton';
-import Icons from '@/components/icons';
-import { useMessages, useNavigation, useTeamUrl } from '@/components/hooks';
-import { getItem, setItem } from '@/lib/storage';
-import styles from './NavBar.module.css';
-
-export function NavBar() {
- const { formatMessage, labels } = useMessages();
- const { pathname, router } = useNavigation();
- const { teamId, renderTeamUrl } = useTeamUrl();
-
- const cloudMode = !!process.env.cloudMode;
-
- const links = [
- { label: formatMessage(labels.dashboard), url: renderTeamUrl('/dashboard') },
- { label: formatMessage(labels.websites), url: renderTeamUrl('/websites') },
- { label: formatMessage(labels.reports), url: renderTeamUrl('/reports') },
- { label: formatMessage(labels.settings), url: renderTeamUrl('/settings') },
- ].filter(n => n);
-
- const menuItems = [
- {
- label: formatMessage(labels.dashboard),
- url: renderTeamUrl('/dashboard'),
- },
- !cloudMode && {
- label: formatMessage(labels.settings),
- url: renderTeamUrl('/settings'),
- children: [
- ...(teamId
- ? [
- {
- label: formatMessage(labels.team),
- url: renderTeamUrl('/settings/team'),
- },
- ]
- : []),
- {
- label: formatMessage(labels.websites),
- url: renderTeamUrl('/settings/websites'),
- },
- ...(!teamId
- ? [
- {
- label: formatMessage(labels.teams),
- url: renderTeamUrl('/settings/teams'),
- },
- {
- label: formatMessage(labels.users),
- url: '/settings/users',
- },
- ]
- : [
- {
- label: formatMessage(labels.members),
- url: renderTeamUrl('/settings/members'),
- },
- ]),
- ],
- },
- {
- label: formatMessage(labels.profile),
- url: '/profile',
- },
- !cloudMode && { label: formatMessage(labels.logout), url: '/logout' },
- ].filter(n => n);
-
- const handleTeamChange = (teamId: string) => {
- const url = teamId ? `/teams/${teamId}` : '/';
- if (!cloudMode) {
- setItem('umami.team', { id: teamId });
- }
- router.push(cloudMode ? `${process.env.cloudUrl}${url}` : url);
- };
-
- useEffect(() => {
- if (!cloudMode) {
- const teamIdLocal = getItem('umami.team')?.id;
-
- if (teamIdLocal && teamIdLocal !== teamId) {
- router.push(
- pathname !== '/' && pathname !== '/dashboard' ? '/' : `/teams/${teamIdLocal}/dashboard`,
- );
- }
- }
- }, [cloudMode]);
-
- return (
-
-
-
-
-
- umami
-
-
- {links.map(({ url, label }) => {
- return (
-
- {label}
-
- );
- })}
-
-
-
-
-
-
-
- );
-}
-
-export default NavBar;
diff --git a/src/app/(main)/SideNav.tsx b/src/app/(main)/SideNav.tsx
new file mode 100644
index 000000000..d66c1cc84
--- /dev/null
+++ b/src/app/(main)/SideNav.tsx
@@ -0,0 +1,161 @@
+import { AdminNav } from '@/app/(main)/admin/AdminNav';
+import { SettingsNav } from '@/app/(main)/settings/SettingsNav';
+import { WebsiteNav } from '@/app/(main)/websites/[websiteId]/WebsiteNav';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useGlobalState, useMessages, useNavigation } from '@/components/hooks';
+import {
+ Globe,
+ Grid2x2,
+ LayoutDashboard,
+ LinkIcon,
+ PanelLeft,
+ PanelsLeftBottom,
+} from '@/components/icons';
+import { UserButton } from '@/components/input/UserButton';
+import { Logo } from '@/components/svg';
+import {
+ Button,
+ type ButtonProps,
+ Column,
+ Focusable,
+ Icon,
+ Row,
+ Text,
+ Tooltip,
+ TooltipTrigger,
+} from '@umami/react-zen';
+import Link from 'next/link';
+
+export function SideNav(props: any) {
+ const { t, labels } = useMessages();
+ const { pathname, renderUrl, websiteId, teamId } = useNavigation();
+ const [isCollapsed] = useGlobalState('sidenav-collapsed', false);
+
+ const links = [
+ ...(!teamId
+ ? [
+ {
+ id: 'dashboard',
+ label: t(labels.dashboard),
+ path: '/dashboard',
+ icon: ,
+ },
+ ]
+ : []),
+ {
+ id: 'boards',
+ label: t(labels.boards),
+ path: '/boards',
+ icon: ,
+ },
+ {
+ id: 'websites',
+ label: t(labels.websites),
+ path: '/websites',
+ icon: ,
+ },
+ {
+ id: 'links',
+ label: t(labels.links),
+ path: '/links',
+ icon: ,
+ },
+ {
+ id: 'pixels',
+ label: t(labels.pixels),
+ path: '/pixels',
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+
+ {!isCollapsed && (
+ }>
+ umami
+
+ )}
+
+
+
+
+ {websiteId ? (
+
+ ) : pathname.includes('/settings') ? (
+
+ ) : pathname.includes('/admin') ? (
+
+ ) : (
+
+ {links.map(({ id, path, label, icon }) => {
+ const isSelected = pathname.startsWith(renderUrl(path, false));
+ return (
+
+
+
+
+
+
+
+ {label}
+
+
+ );
+ })}
+
+ )}
+
+
+
+
+
+ );
+}
+
+const PanelButton = (props: ButtonProps) => {
+ const [isCollapsed, setIsCollapsed] = useGlobalState('sidenav-collapsed', false);
+ return (
+ setIsCollapsed(!isCollapsed)}
+ variant="zero"
+ {...props}
+ style={{ padding: 0 }}
+ >
+
+
+
+
+ );
+};
diff --git a/src/app/(main)/TopNav.tsx b/src/app/(main)/TopNav.tsx
new file mode 100644
index 000000000..9caaeb73c
--- /dev/null
+++ b/src/app/(main)/TopNav.tsx
@@ -0,0 +1,110 @@
+'use client';
+import { Icon, Row } from '@umami/react-zen';
+import { useNavigation } from '@/components/hooks';
+import { Slash } from '@/components/icons';
+import { BoardSelect } from '@/components/input/BoardSelect';
+import { LinkSelect } from '@/components/input/LinkSelect';
+import { PixelSelect } from '@/components/input/PixelSelect';
+import { TeamsButton } from '@/components/input/TeamsButton';
+import { WebsiteSelect } from '@/components/input/WebsiteSelect';
+
+export function TopNav() {
+ const { websiteId, linkId, pixelId, boardId, teamId, router, renderUrl } = useNavigation();
+
+ const handleWebsiteChange = (value: string) => {
+ router.push(renderUrl(`/websites/${value}`));
+ };
+
+ const handleLinkChange = (value: string) => {
+ router.push(renderUrl(`/links/${value}`));
+ };
+
+ const handlePixelChange = (value: string) => {
+ router.push(renderUrl(`/pixels/${value}`));
+ };
+
+ const handleBoardChange = (value: string) => {
+ router.push(renderUrl(`/boards/${value}`));
+ };
+
+ return (
+
+
+
+ {(websiteId || linkId || pixelId || boardId) && (
+ <>
+
+
+
+ {websiteId && (
+
+ )}
+ {linkId && (
+
+ )}
+ {pixelId && (
+
+ )}
+ {boardId && (
+
+ )}
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/UpdateNotice.module.css b/src/app/(main)/UpdateNotice.module.css
deleted file mode 100644
index fec0962cd..000000000
--- a/src/app/(main)/UpdateNotice.module.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.notice {
- position: absolute;
- display: flex;
- justify-content: space-between;
- width: 100%;
- max-width: 800px;
- gap: 20px;
- margin: 60px auto;
- align-self: center;
- background: var(--base50);
- padding: 20px;
- border: 1px solid var(--base300);
- border-radius: var(--border-radius);
- z-index: 9999;
- box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.1);
-}
-
-.message {
- display: flex;
- justify-content: center;
- align-items: center;
- color: var(--font-color100);
- font-weight: 700;
-}
-
-.buttons {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- gap: 10px;
- flex: 0;
-}
-
-@media only screen and (max-width: 992px) {
- .message {
- height: 80px;
- }
-}
diff --git a/src/app/(main)/UpdateNotice.tsx b/src/app/(main)/UpdateNotice.tsx
index ea102faa4..e61407d9d 100644
--- a/src/app/(main)/UpdateNotice.tsx
+++ b/src/app/(main)/UpdateNotice.tsx
@@ -1,16 +1,14 @@
-import { useEffect, useCallback, useState } from 'react';
-import { createPortal } from 'react-dom';
-import { Button } from 'react-basics';
-import { setItem } from '@/lib/storage';
-import useStore, { checkVersion } from '@/store/version';
-import { REPO_URL, VERSION_CHECK } from '@/lib/constants';
-import { useMessages } from '@/components/hooks';
+import { AlertBanner, Button, Column, Row } from '@umami/react-zen';
import { usePathname } from 'next/navigation';
-import styles from './UpdateNotice.module.css';
+import { useCallback, useEffect, useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { REPO_URL, VERSION_CHECK } from '@/lib/constants';
+import { setItem } from '@/lib/storage';
+import { checkVersion, useVersion } from '@/store/version';
export function UpdateNotice({ user, config }) {
- const { formatMessage, labels, messages } = useMessages();
- const { latest, checked, hasUpdate, releaseUrl } = useStore();
+ const { t, labels, messages } = useMessages();
+ const { latest, checked, hasUpdate, releaseUrl } = useVersion();
const pathname = usePathname();
const [dismissed, setDismissed] = useState(checked);
@@ -48,20 +46,16 @@ export function UpdateNotice({ user, config }) {
return null;
}
- return createPortal(
-
-
- {formatMessage(messages.newVersionAvailable, { version: `v${latest}` })}
-
-
-
- {formatMessage(labels.viewDetails)}
-
- {formatMessage(labels.dismiss)}
-
-
,
- document.body,
+ return (
+
+
+
+
+ {t(labels.viewDetails)}
+
+ {t(labels.dismiss)}
+
+
+
);
}
-
-export default UpdateNotice;
diff --git a/src/app/(main)/admin/AdminLayout.tsx b/src/app/(main)/admin/AdminLayout.tsx
new file mode 100644
index 000000000..92d316ac5
--- /dev/null
+++ b/src/app/(main)/admin/AdminLayout.tsx
@@ -0,0 +1,14 @@
+'use client';
+import type { ReactNode } from 'react';
+import { PageBody } from '@/components/common/PageBody';
+import { useLoginQuery } from '@/components/hooks';
+
+export function AdminLayout({ children }: { children: ReactNode }) {
+ const { user } = useLoginQuery();
+
+ if (!user.isAdmin || process.env.cloudMode) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/admin/AdminNav.tsx b/src/app/(main)/admin/AdminNav.tsx
new file mode 100644
index 000000000..064305cfa
--- /dev/null
+++ b/src/app/(main)/admin/AdminNav.tsx
@@ -0,0 +1,67 @@
+import { IconLabel } from '@/components/common/IconLabel';
+import { NavMenu } from '@/components/common/NavMenu';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { ArrowLeft, Globe, User, Users } from '@/components/icons';
+import { Column, Focusable, Row, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import Link from 'next/link';
+
+export function AdminNav({ onItemClick }: { onItemClick?: () => void }) {
+ const { t, labels } = useMessages();
+ const { pathname, renderUrl } = useNavigation();
+
+ const items = [
+ {
+ label: t(labels.manage),
+ items: [
+ {
+ id: 'users',
+ label: t(labels.users),
+ path: '/admin/users',
+ icon: ,
+ },
+ {
+ id: 'websites',
+ label: t(labels.websites),
+ path: '/admin/websites',
+ icon: ,
+ },
+ {
+ id: 'teams',
+ label: t(labels.teams),
+ path: '/admin/teams',
+ icon: ,
+ },
+ ],
+ },
+ ];
+
+ const selectedKey = items
+ .flatMap(e => e.items)
+ ?.find(({ path }) => path && pathname.startsWith(path))?.id;
+
+ return (
+
+
+
+
+
+ } label={t(labels.back)} padding />
+
+
+ {t(labels.back)}
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/layout.tsx b/src/app/(main)/admin/layout.tsx
new file mode 100644
index 000000000..34cdd0b65
--- /dev/null
+++ b/src/app/(main)/admin/layout.tsx
@@ -0,0 +1,17 @@
+import type { Metadata } from 'next';
+import { AdminLayout } from './AdminLayout';
+
+export default function ({ children }) {
+ if (process.env.cloudMode) {
+ return null;
+ }
+
+ return {children} ;
+}
+
+export const metadata: Metadata = {
+ title: {
+ template: '%s | Admin | Umami',
+ default: 'Admin | Umami',
+ },
+};
diff --git a/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx b/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx
new file mode 100644
index 000000000..7da8531a1
--- /dev/null
+++ b/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx
@@ -0,0 +1,19 @@
+import type { ReactNode } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useTeamsQuery } from '@/components/hooks';
+import { AdminTeamsTable } from './AdminTeamsTable';
+
+export function AdminTeamsDataTable({
+ showActions,
+}: {
+ showActions?: boolean;
+ children?: ReactNode;
+}) {
+ const queryResult = useTeamsQuery();
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/admin/teams/AdminTeamsPage.tsx b/src/app/(main)/admin/teams/AdminTeamsPage.tsx
new file mode 100644
index 000000000..316a2e16e
--- /dev/null
+++ b/src/app/(main)/admin/teams/AdminTeamsPage.tsx
@@ -0,0 +1,24 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { TeamsAddButton } from '../../teams/TeamsAddButton';
+import { AdminTeamsDataTable } from './AdminTeamsDataTable';
+
+export function AdminTeamsPage() {
+ const { t, labels } = useMessages();
+
+ const handleSave = () => {};
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/teams/AdminTeamsTable.tsx b/src/app/(main)/admin/teams/AdminTeamsTable.tsx
new file mode 100644
index 000000000..f948aba96
--- /dev/null
+++ b/src/app/(main)/admin/teams/AdminTeamsTable.tsx
@@ -0,0 +1,87 @@
+import { DataColumn, DataTable, Dialog, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { useState } from 'react';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages } from '@/components/hooks';
+import { Edit, Trash } from '@/components/icons';
+import { MenuButton } from '@/components/input/MenuButton';
+import { TeamDeleteForm } from '../../teams/[teamId]/TeamDeleteForm';
+
+export function AdminTeamsTable({
+ data = [],
+ showActions = true,
+ ...props
+}: {
+ data: any[];
+ showActions?: boolean;
+}) {
+ const { t, labels } = useMessages();
+ const [deleteTeam, setDeleteTeam] = useState(null);
+
+ return (
+ <>
+
+
+ {(row: any) => {row.name}}
+
+
+ {(row: any) => row?._count?.members}
+
+
+ {(row: any) => row?._count?.websites}
+
+
+ {(row: any) => {
+ const name = row?.members?.[0]?.user?.username;
+
+ return (
+
+ {name}
+
+ );
+ }}
+
+
+ {(row: any) => }
+
+ {showActions && (
+
+ {(row: any) => {
+ const { id } = row;
+
+ return (
+
+
+
+
+
+
+ {t(labels.edit)}
+
+
+ setDeleteTeam(id)}
+ data-test="link-button-delete"
+ >
+
+
+
+
+ {t(labels.delete)}
+
+
+
+ );
+ }}
+
+ )}
+
+
+
+ setDeleteTeam(null)} />
+
+
+ >
+ );
+}
diff --git a/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx b/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx
new file mode 100644
index 000000000..215019737
--- /dev/null
+++ b/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx
@@ -0,0 +1,11 @@
+'use client';
+import { TeamSettings } from '@/app/(main)/teams/[teamId]/TeamSettings';
+import { TeamProvider } from '@/app/(main)/teams/TeamProvider';
+
+export function AdminTeamPage({ teamId }: { teamId: string }) {
+ return (
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/teams/[teamId]/page.tsx b/src/app/(main)/admin/teams/[teamId]/page.tsx
new file mode 100644
index 000000000..104766ad6
--- /dev/null
+++ b/src/app/(main)/admin/teams/[teamId]/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { AdminTeamPage } from './AdminTeamPage';
+
+export default async function ({ params }: { params: Promise<{ teamId: string }> }) {
+ const { teamId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Team',
+};
diff --git a/src/app/(main)/admin/teams/page.tsx b/src/app/(main)/admin/teams/page.tsx
new file mode 100644
index 000000000..987f02b36
--- /dev/null
+++ b/src/app/(main)/admin/teams/page.tsx
@@ -0,0 +1,9 @@
+import type { Metadata } from 'next';
+import { AdminTeamsPage } from './AdminTeamsPage';
+
+export default function () {
+ return ;
+}
+export const metadata: Metadata = {
+ title: 'Teams',
+};
diff --git a/src/app/(main)/admin/users/UserAddButton.tsx b/src/app/(main)/admin/users/UserAddButton.tsx
new file mode 100644
index 000000000..c2b906317
--- /dev/null
+++ b/src/app/(main)/admin/users/UserAddButton.tsx
@@ -0,0 +1,32 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { UserAddForm } from './UserAddForm';
+
+export function UserAddButton({ onSave }: { onSave?: () => void }) {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleSave = () => {
+ toast(t(messages.saved));
+ touch('users');
+ onSave?.();
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.createUser)}
+
+
+
+ {({ close }) => }
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UserAddForm.tsx b/src/app/(main)/admin/users/UserAddForm.tsx
new file mode 100644
index 000000000..32c1cd21a
--- /dev/null
+++ b/src/app/(main)/admin/users/UserAddForm.tsx
@@ -0,0 +1,70 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ PasswordField,
+ Select,
+ TextField,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export function UserAddForm({ onSave, onClose }) {
+ const { mutateAsync, error, isPending } = useUpdateQuery(`/users`);
+ const { t, labels, messages, getErrorMessage } = useMessages();
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave(data);
+ onClose();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UserDeleteButton.tsx b/src/app/(main)/admin/users/UserDeleteButton.tsx
new file mode 100644
index 000000000..8425fbb09
--- /dev/null
+++ b/src/app/(main)/admin/users/UserDeleteButton.tsx
@@ -0,0 +1,35 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen';
+import { useLoginQuery, useMessages } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { UserDeleteForm } from './UserDeleteForm';
+
+export function UserDeleteButton({
+ userId,
+ username,
+ onDelete,
+}: {
+ userId: string;
+ username: string;
+ onDelete?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { user } = useLoginQuery();
+
+ return (
+
+
+
+
+
+ {t(labels.delete)}
+
+
+
+ {({ close }) => (
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UserDeleteForm.tsx b/src/app/(main)/admin/users/UserDeleteForm.tsx
new file mode 100644
index 000000000..bf060f560
--- /dev/null
+++ b/src/app/(main)/admin/users/UserDeleteForm.tsx
@@ -0,0 +1,41 @@
+import { AlertDialog, Row } from '@umami/react-zen';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+
+export function UserDeleteForm({
+ userId,
+ username,
+ onSave,
+ onClose,
+}: {
+ userId: string;
+ username: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { messages, labels, t } = useMessages();
+ const { mutateAsync } = useDeleteQuery(`/users/${userId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async () => {
+ await mutateAsync(null, {
+ onSuccess: async () => {
+ touch('users');
+ touch(`users:${userId}`);
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ return (
+
+ {t(messages.confirmDelete, { target: username })}
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UsersDataTable.tsx b/src/app/(main)/admin/users/UsersDataTable.tsx
new file mode 100644
index 000000000..8467bd238
--- /dev/null
+++ b/src/app/(main)/admin/users/UsersDataTable.tsx
@@ -0,0 +1,14 @@
+import type { ReactNode } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useUsersQuery } from '@/components/hooks';
+import { UsersTable } from './UsersTable';
+
+export function UsersDataTable({ showActions }: { showActions?: boolean; children?: ReactNode }) {
+ const queryResult = useUsersQuery();
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UsersPage.tsx b/src/app/(main)/admin/users/UsersPage.tsx
new file mode 100644
index 000000000..eaabc7c80
--- /dev/null
+++ b/src/app/(main)/admin/users/UsersPage.tsx
@@ -0,0 +1,24 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { UserAddButton } from './UserAddButton';
+import { UsersDataTable } from './UsersDataTable';
+
+export function UsersPage() {
+ const { t, labels } = useMessages();
+
+ const handleSave = () => {};
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/users/UsersTable.tsx b/src/app/(main)/admin/users/UsersTable.tsx
new file mode 100644
index 000000000..f337cc85f
--- /dev/null
+++ b/src/app/(main)/admin/users/UsersTable.tsx
@@ -0,0 +1,83 @@
+import { DataColumn, DataTable, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { useState } from 'react';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages } from '@/components/hooks';
+import { Edit, Trash } from '@/components/icons';
+import { MenuButton } from '@/components/input/MenuButton';
+import { ROLES } from '@/lib/constants';
+import { UserDeleteForm } from './UserDeleteForm';
+
+export function UsersTable({
+ data = [],
+ showActions = true,
+ ...props
+}: {
+ data: any[];
+ showActions?: boolean;
+}) {
+ const { t, labels } = useMessages();
+ const [deleteUser, setDeleteUser] = useState(null);
+
+ return (
+ <>
+
+
+ {(row: any) => {row.username}}
+
+
+ {(row: any) =>
+ t(labels[Object.keys(ROLES).find(key => ROLES[key] === row.role)] || labels.unknown)
+ }
+
+
+ {(row: any) => row._count.websites}
+
+
+ {(row: any) => }
+
+ {showActions && (
+
+ {(row: any) => {
+ const { id } = row;
+
+ return (
+
+
+
+
+
+
+ {t(labels.edit)}
+
+
+ setDeleteUser(row)}
+ data-test="link-button-delete"
+ >
+
+
+
+
+ {t(labels.delete)}
+
+
+
+ );
+ }}
+
+ )}
+
+
+ {
+ setDeleteUser(null);
+ }}
+ />
+
+ >
+ );
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx
new file mode 100644
index 000000000..481a215b7
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx
@@ -0,0 +1,69 @@
+import {
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ PasswordField,
+ Select,
+ TextField,
+} from '@umami/react-zen';
+import { useLoginQuery, useMessages, useUpdateQuery, useUser } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () => void }) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const user = useUser();
+ const { user: login } = useLoginQuery();
+
+ const { mutateAsync, error, toast, touch } = useUpdateQuery(`/users/${userId}`);
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('users');
+ touch(`user:${user.id}`);
+ onSave?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserHeader.tsx b/src/app/(main)/admin/users/[userId]/UserHeader.tsx
new file mode 100644
index 000000000..1f82897e5
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserHeader.tsx
@@ -0,0 +1,9 @@
+import { PageHeader } from '@/components/common/PageHeader';
+import { useUser } from '@/components/hooks';
+import { User } from '@/components/icons';
+
+export function UserHeader() {
+ const user = useUser();
+
+ return } />;
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserPage.tsx b/src/app/(main)/admin/users/[userId]/UserPage.tsx
new file mode 100644
index 000000000..5e0f8d109
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserPage.tsx
@@ -0,0 +1,19 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { UserHeader } from '@/app/(main)/admin/users/[userId]/UserHeader';
+import { Panel } from '@/components/common/Panel';
+import { UserProvider } from './UserProvider';
+import { UserSettings } from './UserSettings';
+
+export function UserPage({ userId }: { userId: string }) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserProvider.tsx b/src/app/(main)/admin/users/[userId]/UserProvider.tsx
new file mode 100644
index 000000000..ea01915a7
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserProvider.tsx
@@ -0,0 +1,20 @@
+import { Loading } from '@umami/react-zen';
+import { createContext, type ReactNode } from 'react';
+import { useUserQuery } from '@/components/hooks/queries/useUserQuery';
+import type { User } from '@/generated/prisma/client';
+
+export const UserContext = createContext(null);
+
+export function UserProvider({ userId, children }: { userId: string; children: ReactNode }) {
+ const { data: user, isFetching, isLoading } = useUserQuery(userId);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!user) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserSettings.tsx b/src/app/(main)/admin/users/[userId]/UserSettings.tsx
new file mode 100644
index 000000000..e2119bb59
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserSettings.tsx
@@ -0,0 +1,25 @@
+import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { useMessages } from '@/components/hooks';
+import { UserEditForm } from './UserEditForm';
+import { UserWebsites } from './UserWebsites';
+
+export function UserSettings({ userId }: { userId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+ {t(labels.details)}
+ {t(labels.websites)}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/users/[userId]/UserWebsites.tsx b/src/app/(main)/admin/users/[userId]/UserWebsites.tsx
new file mode 100644
index 000000000..eeb173e75
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/UserWebsites.tsx
@@ -0,0 +1,15 @@
+import { WebsitesTable } from '@/app/(main)/websites/WebsitesTable';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useUserWebsitesQuery } from '@/components/hooks';
+
+export function UserWebsites({ userId }) {
+ const queryResult = useUserWebsitesQuery({ userId });
+
+ return (
+
+ {({ data }) => (
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/admin/users/[userId]/page.tsx b/src/app/(main)/admin/users/[userId]/page.tsx
new file mode 100644
index 000000000..16c9f366c
--- /dev/null
+++ b/src/app/(main)/admin/users/[userId]/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { UserPage } from './UserPage';
+
+export default async function ({ params }: { params: Promise<{ userId: string }> }) {
+ const { userId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'User',
+};
diff --git a/src/app/(main)/admin/users/page.tsx b/src/app/(main)/admin/users/page.tsx
new file mode 100644
index 000000000..96e69eb57
--- /dev/null
+++ b/src/app/(main)/admin/users/page.tsx
@@ -0,0 +1,9 @@
+import type { Metadata } from 'next';
+import { UsersPage } from './UsersPage';
+
+export default function () {
+ return ;
+}
+export const metadata: Metadata = {
+ title: 'Users',
+};
diff --git a/src/app/(main)/admin/websites/AdminWebsitesDataTable.tsx b/src/app/(main)/admin/websites/AdminWebsitesDataTable.tsx
new file mode 100644
index 000000000..21059924b
--- /dev/null
+++ b/src/app/(main)/admin/websites/AdminWebsitesDataTable.tsx
@@ -0,0 +1,13 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useWebsitesQuery } from '@/components/hooks';
+import { AdminWebsitesTable } from './AdminWebsitesTable';
+
+export function AdminWebsitesDataTable() {
+ const query = useWebsitesQuery();
+
+ return (
+
+ {props => }
+
+ );
+}
diff --git a/src/app/(main)/admin/websites/AdminWebsitesPage.tsx b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx
new file mode 100644
index 000000000..e536a5bbe
--- /dev/null
+++ b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx
@@ -0,0 +1,19 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { AdminWebsitesDataTable } from './AdminWebsitesDataTable';
+
+export function AdminWebsitesPage() {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/websites/AdminWebsitesTable.tsx b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx
new file mode 100644
index 000000000..062fe2774
--- /dev/null
+++ b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx
@@ -0,0 +1,89 @@
+import { DataColumn, DataTable, Dialog, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { useState } from 'react';
+import { WebsiteDeleteForm } from '@/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages } from '@/components/hooks';
+import { Edit, Trash, Users } from '@/components/icons';
+import { MenuButton } from '@/components/input/MenuButton';
+
+export function AdminWebsitesTable({ data = [], ...props }: { data: any[] }) {
+ const { t, labels } = useMessages();
+ const [deleteWebsite, setDeleteWebsite] = useState(null);
+
+ return (
+ <>
+
+
+ {(row: any) => (
+
+ {row.name}
+
+ )}
+
+
+ {(row: any) => {row.domain} }
+
+
+ {(row: any) => {
+ if (row?.team) {
+ return (
+
+
+
+
+
+ {row?.team?.name}
+
+
+ );
+ }
+ return (
+
+ {row?.user?.username}
+
+ );
+ }}
+
+
+ {(row: any) => }
+
+
+ {(row: any) => {
+ const { id } = row;
+
+ return (
+
+
+
+
+
+
+ {t(labels.edit)}
+
+
+ setDeleteWebsite(id)}
+ data-test="link-button-delete"
+ >
+
+
+
+
+ {t(labels.delete)}
+
+
+
+ );
+ }}
+
+
+
+
+ setDeleteWebsite(null)} />
+
+
+ >
+ );
+}
diff --git a/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx b/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx
new file mode 100644
index 000000000..5da82afdf
--- /dev/null
+++ b/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx
@@ -0,0 +1,14 @@
+'use client';
+import { WebsiteSettings } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettings';
+import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider';
+import { Panel } from '@/components/common/Panel';
+
+export function AdminWebsitePage({ websiteId }: { websiteId: string }) {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/admin/websites/[websiteId]/page.tsx b/src/app/(main)/admin/websites/[websiteId]/page.tsx
new file mode 100644
index 000000000..557adbd94
--- /dev/null
+++ b/src/app/(main)/admin/websites/[websiteId]/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { WebsiteSettingsPage } from '@/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Website',
+};
diff --git a/src/app/(main)/admin/websites/page.tsx b/src/app/(main)/admin/websites/page.tsx
new file mode 100644
index 000000000..d6da9f637
--- /dev/null
+++ b/src/app/(main)/admin/websites/page.tsx
@@ -0,0 +1,9 @@
+import type { Metadata } from 'next';
+import { AdminWebsitesPage } from './AdminWebsitesPage';
+
+export default function () {
+ return ;
+}
+export const metadata: Metadata = {
+ title: 'Websites',
+};
diff --git a/src/app/(main)/boards/BoardAddButton.tsx b/src/app/(main)/boards/BoardAddButton.tsx
new file mode 100644
index 000000000..54e89f354
--- /dev/null
+++ b/src/app/(main)/boards/BoardAddButton.tsx
@@ -0,0 +1,20 @@
+import { useMessages, useNavigation } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import type { Board } from '@/lib/types';
+import { BoardEditForm } from './BoardEditForm';
+
+export function BoardAddButton() {
+ const { t, labels } = useMessages();
+ const { teamId, router, renderUrl } = useNavigation();
+
+ const handleSave = (board: Board) => {
+ router.push(renderUrl(`/boards/${board.id}/design`, false));
+ };
+
+ return (
+ } label={t(labels.addBoard)} variant="primary" width="600px">
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardDeleteButton.tsx b/src/app/(main)/boards/BoardDeleteButton.tsx
new file mode 100644
index 000000000..e8ae8d3fd
--- /dev/null
+++ b/src/app/(main)/boards/BoardDeleteButton.tsx
@@ -0,0 +1,46 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function BoardDeleteButton({
+ boardId,
+ name,
+ onSave,
+}: {
+ boardId: string;
+ name: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, isPending, error, touch } = useDeleteQuery(`/boards/${boardId}`);
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('boards');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } title={t(labels.confirm)} variant="quiet" width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={getErrorMessage(error)}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardDesignButton.tsx b/src/app/(main)/boards/BoardDesignButton.tsx
new file mode 100644
index 000000000..20a06f62c
--- /dev/null
+++ b/src/app/(main)/boards/BoardDesignButton.tsx
@@ -0,0 +1,16 @@
+import { Icon } from '@umami/react-zen';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useNavigation } from '@/components/hooks';
+import { LayoutDashboard } from '@/components/icons';
+
+export function BoardDesignButton({ boardId }: { boardId: string }) {
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardEditButton.tsx b/src/app/(main)/boards/BoardEditButton.tsx
new file mode 100644
index 000000000..f8de69cc1
--- /dev/null
+++ b/src/app/(main)/boards/BoardEditButton.tsx
@@ -0,0 +1,21 @@
+import { Icon } from '@umami/react-zen';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+
+export function BoardEditButton({ boardId }: { boardId: string }) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardEditForm.tsx b/src/app/(main)/boards/BoardEditForm.tsx
new file mode 100644
index 000000000..ec405ff35
--- /dev/null
+++ b/src/app/(main)/boards/BoardEditForm.tsx
@@ -0,0 +1,181 @@
+import {
+ Box,
+ Button,
+ Form,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ Loading,
+ Row,
+ Select,
+ TextField,
+} from '@umami/react-zen';
+import { useBoardQuery, useMessages, useNavigation, useUpdateQuery } from '@/components/hooks';
+import { LinkSelect } from '@/components/input/LinkSelect';
+import { PixelSelect } from '@/components/input/PixelSelect';
+import { WebsiteSelect } from '@/components/input/WebsiteSelect';
+import {
+ BOARD_TYPES,
+ type BoardType,
+ getBoardEntity,
+ getBoardType,
+ requiresBoardEntity,
+ setBoardEntity,
+} from '@/lib/boards';
+import type { Board } from '@/lib/types';
+
+interface BoardFormValues {
+ name: string;
+ description: string;
+ type: BoardType;
+ entityId: string;
+}
+
+function getDefaultValues(board?: Partial): BoardFormValues {
+ const boardType = getBoardType(board, { coerceDashboard: true });
+ const { entityId } = getBoardEntity(board);
+
+ return {
+ name: board?.name ?? '',
+ description: board?.description ?? '',
+ type: boardType,
+ entityId: entityId ?? '',
+ };
+}
+
+export function BoardEditForm({
+ boardId,
+ teamId,
+ onSave,
+ onClose,
+}: {
+ boardId?: string;
+ teamId?: string;
+ onSave?: (board: Board) => void | Promise;
+ onClose?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { teamId: navigationTeamId } = useNavigation();
+ const resolvedTeamId = teamId ?? navigationTeamId;
+ const { data: board, isLoading } = useBoardQuery(boardId || '');
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(
+ boardId ? `/boards/${boardId}` : '/boards',
+ {
+ id: boardId,
+ teamId: resolvedTeamId,
+ },
+ );
+ const values = getDefaultValues(board);
+
+ const handleSubmit = async (data: BoardFormValues) => {
+ const result = await mutateAsync({
+ name: data.name,
+ description: data.description,
+ type: data.type,
+ parameters: setBoardEntity(board?.parameters, data.type, data.entityId || undefined),
+ });
+
+ toast(t(messages.saved));
+ touch('boards');
+ touch(`board:${result.id}`);
+ await onSave?.(result);
+ onClose?.();
+ };
+
+ if (boardId && isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardEntityBadge.tsx b/src/app/(main)/boards/BoardEntityBadge.tsx
new file mode 100644
index 000000000..31d7081ab
--- /dev/null
+++ b/src/app/(main)/boards/BoardEntityBadge.tsx
@@ -0,0 +1,29 @@
+import { Icon, Row, Text } from '@umami/react-zen';
+import { Favicon } from '@/components/common/Favicon';
+import { Grid2x2, Link } from '@/components/icons';
+import type { BoardEntityType } from '@/lib/boards';
+
+export function BoardEntityBadge({
+ type,
+ name,
+ domain,
+}: {
+ type: BoardEntityType;
+ name: string;
+ domain?: string;
+}) {
+ return (
+
+
+ {type === 'pixel' ? (
+
+ ) : type === 'link' ? (
+
+ ) : (
+
+ )}
+
+ {name}
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardProvider.tsx b/src/app/(main)/boards/BoardProvider.tsx
new file mode 100644
index 000000000..dc5168424
--- /dev/null
+++ b/src/app/(main)/boards/BoardProvider.tsx
@@ -0,0 +1,155 @@
+'use client';
+import { Loading, useToast } from '@umami/react-zen';
+import { createContext, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';
+import { v4 as uuid } from 'uuid';
+import { useApi, useMessages, useModified, useNavigation } from '@/components/hooks';
+import { BOARD_TYPES, getBoardType } from '@/lib/boards';
+import { useBoardQuery } from '@/components/hooks/queries/useBoardQuery';
+import type { Board, BoardParameters } from '@/lib/types';
+import { getComponentDefinition } from './boardComponentRegistry';
+
+export type LayoutGetter = () => Partial | null;
+
+export interface BoardContextValue {
+ board: Partial;
+ editing: boolean;
+ updateBoard: (data: Partial) => void;
+ saveBoard: () => Promise;
+ isPending: boolean;
+ registerLayoutGetter: (getter: LayoutGetter) => void;
+}
+
+export const BoardContext = createContext(null);
+
+const createDefaultBoard = (): Partial => ({
+ type: BOARD_TYPES.mixed,
+ name: '',
+ description: '',
+ parameters: {
+ rows: [{ id: uuid(), columns: [{ id: uuid(), component: null }] }],
+ },
+});
+
+function sanitizeBoardParameters(parameters?: BoardParameters): BoardParameters | undefined {
+ if (!parameters?.rows) {
+ return parameters;
+ }
+
+ return {
+ ...parameters,
+ rows: parameters.rows.map(row => ({
+ ...row,
+ columns: row.columns.map(column => {
+ if (column.component && !getComponentDefinition(column.component.type)) {
+ return {
+ ...column,
+ component: null,
+ };
+ }
+
+ return column;
+ }),
+ })),
+ };
+}
+
+export function BoardProvider({
+ boardId,
+ editing = false,
+ children,
+}: {
+ boardId?: string;
+ editing?: boolean;
+ children: ReactNode;
+}) {
+ const { data, isFetching, isLoading } = useBoardQuery(boardId);
+ const { post, useMutation } = useApi();
+ const { touch } = useModified();
+ const { toast } = useToast();
+ const { t, labels, messages } = useMessages();
+ const { router, renderUrl, teamId } = useNavigation();
+
+ const [board, setBoard] = useState>(data ?? createDefaultBoard());
+ const boardRef = useRef>(data ?? createDefaultBoard());
+ const layoutGetterRef = useRef(null);
+
+ const registerLayoutGetter = useCallback((getter: LayoutGetter) => {
+ layoutGetterRef.current = getter;
+ }, []);
+
+ useEffect(() => {
+ if (data) {
+ const nextBoard = {
+ ...data,
+ type: getBoardType(data, { coerceDashboard: true }),
+ parameters: sanitizeBoardParameters(data.parameters),
+ };
+
+ boardRef.current = nextBoard;
+ setBoard(nextBoard);
+ }
+ }, [data]);
+
+ const { mutateAsync, isPending } = useMutation({
+ mutationFn: (boardData: Partial) => {
+ if (boardData.id) {
+ return post(`/boards/${boardData.id}`, boardData);
+ }
+ return post('/boards', {
+ ...boardData,
+ type: boardData.type || BOARD_TYPES.mixed,
+ slug: '',
+ teamId,
+ });
+ },
+ });
+
+ const updateBoard = useCallback((data: Partial) => {
+ setBoard(current => {
+ const nextBoard = { ...current, ...data };
+ boardRef.current = nextBoard;
+
+ return nextBoard;
+ });
+ }, []);
+
+ const saveBoard = useCallback(async () => {
+ const currentBoard = boardRef.current;
+ const defaultName = t(labels.untitled);
+
+ // Get current layout sizes from BoardEditBody if registered
+ const layoutData = layoutGetterRef.current?.();
+ const parameters = sanitizeBoardParameters(
+ layoutData ? { ...currentBoard.parameters, ...layoutData } : currentBoard.parameters,
+ );
+
+ const result = await mutateAsync({
+ ...currentBoard,
+ name: currentBoard.name || defaultName,
+ parameters,
+ });
+
+ toast(t(messages.saved));
+ touch('boards');
+
+ if (currentBoard.id) {
+ touch(`board:${currentBoard.id}`);
+ } else if (result?.id) {
+ router.push(renderUrl(`/boards/${result.id}`));
+ }
+
+ return result;
+ }, [mutateAsync, toast, t, labels.untitled, messages.saved, touch, router, renderUrl]);
+
+ if (boardId && isFetching && isLoading) {
+ return ;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardsDataTable.tsx b/src/app/(main)/boards/BoardsDataTable.tsx
new file mode 100644
index 000000000..a041e6392
--- /dev/null
+++ b/src/app/(main)/boards/BoardsDataTable.tsx
@@ -0,0 +1,14 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useBoardsQuery, useNavigation } from '@/components/hooks';
+import { BoardsTable } from './BoardsTable';
+
+export function BoardsDataTable() {
+ const { teamId } = useNavigation();
+ const query = useBoardsQuery({ teamId });
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardsPage.tsx b/src/app/(main)/boards/BoardsPage.tsx
new file mode 100644
index 000000000..8a3126531
--- /dev/null
+++ b/src/app/(main)/boards/BoardsPage.tsx
@@ -0,0 +1,25 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { BoardAddButton } from './BoardAddButton';
+import { BoardsDataTable } from './BoardsDataTable';
+
+export function BoardsPage() {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/BoardsTable.tsx b/src/app/(main)/boards/BoardsTable.tsx
new file mode 100644
index 000000000..25a10cdee
--- /dev/null
+++ b/src/app/(main)/boards/BoardsTable.tsx
@@ -0,0 +1,37 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { BoardDeleteButton } from './BoardDeleteButton';
+import { BoardDesignButton } from './BoardDesignButton';
+import { BoardEditButton } from './BoardEditButton';
+
+export function BoardsTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+ {({ id, name }: any) => {
+ return {name};
+ }}
+
+
+
+ {(row: any) => }
+
+
+ {({ id, name }: any) => {
+ return (
+
+
+
+
+
+ );
+ }}
+
+
+ );
+}
diff --git a/src/app/(main)/boards/TextBlock.tsx b/src/app/(main)/boards/TextBlock.tsx
new file mode 100644
index 000000000..6e199ec5e
--- /dev/null
+++ b/src/app/(main)/boards/TextBlock.tsx
@@ -0,0 +1,10 @@
+'use client';
+import { Text } from '@umami/react-zen';
+
+export function TextBlock({ text }: { text?: string }) {
+ if (!text) {
+ return null;
+ }
+
+ return {text} ;
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardComponentRenderer.tsx b/src/app/(main)/boards/[boardId]/BoardComponentRenderer.tsx
new file mode 100644
index 000000000..ec2a30df1
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardComponentRenderer.tsx
@@ -0,0 +1,47 @@
+import { Column, Text } from '@umami/react-zen';
+import { memo } from 'react';
+import type { BoardComponentConfig } from '@/lib/types';
+import { getComponentDefinition } from '../boardComponentRegistry';
+
+function BoardComponentRendererComponent({
+ config,
+ websiteId,
+ entityType,
+}: {
+ config: BoardComponentConfig;
+ websiteId?: string;
+ entityType?: string;
+}) {
+ const definition = getComponentDefinition(config.type);
+
+ if (!definition) {
+ return (
+
+ Unknown component: {config.type}
+
+ );
+ }
+
+ const Component =
+ (entityType && definition.componentByEntityType?.[entityType]) || definition.component;
+
+ if (!websiteId && definition.requiresWebsite !== false) {
+ return (
+
+ Select a website
+
+ );
+ }
+
+ return ;
+}
+
+export const BoardComponentRenderer = memo(
+ BoardComponentRendererComponent,
+ (prevProps, nextProps) =>
+ prevProps.websiteId === nextProps.websiteId &&
+ prevProps.entityType === nextProps.entityType &&
+ prevProps.config === nextProps.config,
+);
+
+BoardComponentRenderer.displayName = 'BoardComponentRenderer';
diff --git a/src/app/(main)/boards/[boardId]/BoardComponentSelect.tsx b/src/app/(main)/boards/[boardId]/BoardComponentSelect.tsx
new file mode 100644
index 000000000..3a03ffea0
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardComponentSelect.tsx
@@ -0,0 +1,399 @@
+import {
+ Button,
+ Column,
+ Focusable,
+ ListItem,
+ Row,
+ Select,
+ Text,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useMemo, useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { LinkSelect } from '@/components/input/LinkSelect';
+import { PixelSelect } from '@/components/input/PixelSelect';
+import { WebsiteSelect } from '@/components/input/WebsiteSelect';
+import type { BoardComponentConfig } from '@/lib/types';
+import {
+ BOARD_ENTITY_TYPES,
+ type BoardEntityType,
+ type BoardType,
+ getComponentEntity,
+ isBoardComponentSupported,
+ isOpenBoardType,
+} from '@/lib/boards';
+import {
+ type ComponentDefinition,
+ type ConfigField,
+ getComponentDefinitions,
+} from '../boardComponentRegistry';
+import { BoardComponentRenderer } from './BoardComponentRenderer';
+
+export function BoardComponentSelect({
+ teamId,
+ boardType,
+ boardEntityType,
+ boardEntityId,
+ initialConfig,
+ onSelect,
+ onClose,
+}: {
+ teamId?: string;
+ boardType: BoardType;
+ boardEntityType?: BoardEntityType;
+ boardEntityId?: string;
+ initialConfig?: BoardComponentConfig;
+ onSelect: (config: BoardComponentConfig) => void;
+ onClose: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const initialEntity = getComponentEntity(initialConfig);
+ const [selectedDef, setSelectedDef] = useState(null);
+ const [configValues, setConfigValues] = useState>({});
+ const [selectedEntityType, setSelectedEntityType] = useState(
+ initialEntity.entityType || boardEntityType || BOARD_ENTITY_TYPES.website,
+ );
+ const [selectedEntityId, setSelectedEntityId] = useState(
+ initialEntity.entityId || boardEntityId,
+ );
+ const [title, setTitle] = useState('');
+ const [description, setDescription] = useState('');
+
+ const allDefinitions = useMemo(
+ () => getComponentDefinitions().toSorted((a, b) => a.name.localeCompare(b.name)),
+ [],
+ );
+ const activeEntityType = isOpenBoardType(boardType) ? selectedEntityType : boardEntityType;
+ const isSelectedDefSupported = selectedDef
+ ? isBoardComponentSupported(selectedDef.type, activeEntityType)
+ : false;
+
+ const getDefaultConfigValues = (def: ComponentDefinition, config?: BoardComponentConfig) => {
+ const defaults: Record = {};
+
+ for (const field of def.configFields ?? []) {
+ defaults[field.name] = field.defaultValue;
+ }
+
+ if (def.defaultProps) {
+ Object.assign(defaults, def.defaultProps);
+ }
+
+ if (config?.props) {
+ Object.assign(defaults, config.props);
+ }
+
+ return defaults;
+ };
+
+ useEffect(() => {
+ if (!initialConfig) {
+ return;
+ }
+
+ const definition = allDefinitions.find(def => def.type === initialConfig.type);
+
+ if (!definition) {
+ return;
+ }
+
+ setSelectedDef(definition);
+ setConfigValues(getDefaultConfigValues(definition, initialConfig));
+ setSelectedEntityType(
+ initialEntity.entityType || boardEntityType || BOARD_ENTITY_TYPES.website,
+ );
+ setSelectedEntityId(initialEntity.entityId || boardEntityId);
+ setTitle(initialConfig.title ?? definition.name);
+ setDescription(initialConfig.description || '');
+ }, [
+ initialConfig,
+ allDefinitions,
+ boardEntityId,
+ boardEntityType,
+ initialEntity.entityId,
+ initialEntity.entityType,
+ ]);
+
+ const handleSelectComponent = (def: ComponentDefinition) => {
+ setSelectedDef(def);
+ setConfigValues(getDefaultConfigValues(def));
+ setTitle(def.name);
+ setDescription('');
+ };
+
+ const handleConfigChange = (name: string, value: any) => {
+ setConfigValues(prev => ({ ...prev, [name]: value }));
+ };
+
+ const needsWebsite = selectedDef?.requiresWebsite !== false;
+ const isOpenType = isOpenBoardType(boardType);
+ const hasSelectedEntity = isOpenType ? !!selectedEntityId : !!boardEntityId;
+ const resolvedEntityType = needsWebsite
+ ? isOpenType
+ ? selectedEntityType
+ : boardEntityType
+ : undefined;
+ const resolvedEntityId = needsWebsite
+ ? isOpenType
+ ? selectedEntityId
+ : boardEntityId
+ : undefined;
+
+ const handleEntityTypeChange = (value: string) => {
+ setSelectedEntityType(value as BoardEntityType);
+ setSelectedEntityId(undefined);
+ };
+
+ const handleAdd = () => {
+ if (!selectedDef || !isSelectedDefSupported || (needsWebsite && !resolvedEntityId)) return;
+
+ const props: Record = {};
+
+ if (selectedDef.defaultProps) {
+ Object.assign(props, selectedDef.defaultProps);
+ }
+
+ Object.assign(props, configValues);
+
+ for (const field of selectedDef.configFields ?? []) {
+ if (field.type === 'number' && props[field.name] != null && props[field.name] !== '') {
+ props[field.name] = Number(props[field.name]);
+ }
+ }
+
+ const config: BoardComponentConfig = {
+ type: selectedDef.type,
+ ...(needsWebsite && isOpenType && resolvedEntityId
+ ? { entityType: resolvedEntityType, entityId: resolvedEntityId }
+ : {}),
+ title,
+ description,
+ };
+
+ if (Object.keys(props).length > 0) {
+ config.props = props;
+ }
+
+ onSelect(config);
+ };
+
+ const previewConfig: BoardComponentConfig | null = useMemo(
+ () =>
+ selectedDef
+ ? {
+ type: selectedDef.type,
+ props: { ...selectedDef.defaultProps, ...configValues },
+ }
+ : null,
+ [selectedDef, configValues],
+ );
+
+ const canSave = !!selectedDef && isSelectedDefSupported && (!needsWebsite || !!resolvedEntityId);
+ const availableDefinitions = useMemo(
+ () =>
+ allDefinitions.filter(
+ def =>
+ isBoardComponentSupported(def.type, activeEntityType) || def.type === selectedDef?.type,
+ ),
+ [activeEntityType, allDefinitions, selectedDef?.type],
+ );
+
+ return (
+
+
+
+ {t(labels.properties)}
+
+ {needsWebsite && isOpenType && (
+ <>
+
+
+ {t(labels.type)}
+
+
+ {t(labels.website)}
+ {t(labels.pixel)}
+ {t(labels.link)}
+
+
+
+
+ {selectedEntityType === BOARD_ENTITY_TYPES.pixel
+ ? t(labels.pixel)
+ : selectedEntityType === BOARD_ENTITY_TYPES.link
+ ? t(labels.link)
+ : t(labels.website)}
+
+ {selectedEntityType === BOARD_ENTITY_TYPES.pixel ? (
+
+ ) : selectedEntityType === BOARD_ENTITY_TYPES.link ? (
+
+ ) : (
+
+ )}
+
+ >
+ )}
+
+
+
+ {t(labels.title)}
+
+
+
+
+
+
+ {t(labels.description)}
+
+
+
+
+ {selectedDef?.configFields && selectedDef.configFields.length > 0 && (
+
+ {selectedDef.configFields.map((field: ConfigField) => (
+
+
+ {field.label}
+
+
+ {field.type === 'select' && (
+ handleConfigChange(field.name, value)}
+ maxHeight={300}
+ popoverProps={{ style: { width: 220 } }}
+ >
+ {(field.optionsByEntityType?.[activeEntityType] ?? field.options)?.map(
+ option => (
+
+ {option.label}
+
+ ),
+ )}
+
+ )}
+
+ {field.type === 'text' && (
+ handleConfigChange(field.name, value)}
+ />
+ )}
+
+ {field.type === 'number' && (
+ handleConfigChange(field.name, value)}
+ />
+ )}
+
+ {field.type === 'textarea' && (
+ handleConfigChange(field.name, value)}
+ style={{ minHeight: 200 }}
+ />
+ )}
+
+ ))}
+
+ )}
+
+
+
+ Components
+
+ {hasSelectedEntity ? (
+
+ {availableDefinitions.map(def => {
+ const Icon = def.icon;
+
+ return (
+
+ handleSelectComponent(def)}
+ >
+
+
+
+ {def.name}
+
+
+ {def.description}
+
+
+
+
+ );
+ })}
+
+ ) : (
+
+ {t(messages.selectBoardEntityFirst)}
+
+ )}
+
+
+
+
+ Preview
+
+ {hasSelectedEntity && previewConfig && (!needsWebsite || resolvedEntityId) ? (
+
+ ) : (
+
+
+ {!hasSelectedEntity
+ ? t(messages.selectBoardEntityFirst)
+ : resolvedEntityId
+ ? t(messages.selectComponentPreview)
+ : t(messages.selectBoardEntityFirst)}
+
+
+ )}
+
+
+
+
+
+
+ {t(labels.cancel)}
+
+
+ {t(labels.save)}
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardControls.tsx b/src/app/(main)/boards/[boardId]/BoardControls.tsx
new file mode 100644
index 000000000..326a415f8
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardControls.tsx
@@ -0,0 +1,30 @@
+import { Box } from '@umami/react-zen';
+import { LinkControls } from '@/app/(main)/links/[linkId]/LinkControls';
+import { PixelControls } from '@/app/(main)/pixels/[pixelId]/PixelControls';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useBoard } from '@/components/hooks';
+import { BOARD_ENTITY_TYPES, getBoardEntity, getFirstBoardComponentEntity } from '@/lib/boards';
+
+export function BoardControls() {
+ const { board } = useBoard();
+ const boardEntity = getBoardEntity(board);
+ const fallbackEntity = getFirstBoardComponentEntity(board);
+ const entityType = boardEntity.entityType || fallbackEntity.entityType;
+ const entityId = boardEntity.entityId || fallbackEntity.entityId;
+
+ if (!entityId) {
+ return null;
+ }
+
+ return (
+
+ {entityType === BOARD_ENTITY_TYPES.pixel ? (
+
+ ) : entityType === BOARD_ENTITY_TYPES.link ? (
+
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardEditBody.tsx b/src/app/(main)/boards/[boardId]/BoardEditBody.tsx
new file mode 100644
index 000000000..ad94800dd
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardEditBody.tsx
@@ -0,0 +1,180 @@
+import { Box, Button, Icon, Row, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import { produce } from 'immer';
+import { Fragment, useEffect, useRef } from 'react';
+import { Group, type GroupImperativeHandle, Panel, Separator } from 'react-resizable-panels';
+import { v4 as uuid } from 'uuid';
+import { useBoard } from '@/components/hooks';
+import { GripHorizontal, Plus } from '@/components/icons';
+import { getBoardEntity, getBoardType, requiresBoardEntity } from '@/lib/boards';
+import { BoardEditRow } from './BoardEditRow';
+import { BUTTON_ROW_HEIGHT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT } from './boardConstants';
+
+export function BoardEditBody({ requiresBoardWebsite = true }: { requiresBoardWebsite?: boolean }) {
+ const { board, updateBoard, registerLayoutGetter } = useBoard();
+ const rowGroupRef = useRef(null);
+ const columnGroupRefs = useRef>(new Map());
+
+ useEffect(() => {
+ registerLayoutGetter(() => {
+ const rows = board?.parameters?.rows;
+
+ if (!rows?.length) return null;
+
+ const rowLayout = rowGroupRef.current?.getLayout();
+
+ const updatedRows = rows.map(row => {
+ const columnGroupRef = columnGroupRefs.current.get(row.id);
+ const columnLayout = columnGroupRef?.getLayout();
+
+ const updatedColumns = row.columns.map(col => ({
+ ...col,
+ size: columnLayout?.[col.id],
+ }));
+
+ return {
+ ...row,
+ size: rowLayout?.[row.id],
+ columns: updatedColumns,
+ };
+ });
+
+ return { rows: updatedRows };
+ });
+ }, [registerLayoutGetter, board?.parameters?.rows]);
+
+ const registerColumnGroupRef = (rowId: string, ref: GroupImperativeHandle | null) => {
+ if (ref) {
+ columnGroupRefs.current.set(rowId, ref);
+ } else {
+ columnGroupRefs.current.delete(rowId);
+ }
+ };
+
+ const handle = () => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ if (!draft.rows) {
+ draft.rows = [];
+ }
+ draft.rows.push({ id: uuid(), columns: [{ id: uuid(), component: null }] });
+ }),
+ });
+ };
+
+ const handleRemoveRow = (id: string) => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ if (!draft.rows) {
+ return;
+ }
+
+ draft.rows = draft.rows.filter(row => row?.id !== id);
+ }),
+ });
+ };
+
+ const handleMoveRowUp = (id: string) => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ if (!draft.rows) return;
+
+ const index = draft.rows.findIndex(row => row.id === id);
+ if (index > 0) {
+ const temp = draft.rows[index - 1];
+ draft.rows[index - 1] = draft.rows[index];
+ draft.rows[index] = temp;
+ }
+ }),
+ });
+ };
+
+ const handleMoveRowDown = (id: string) => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ if (!draft.rows) return;
+
+ const index = draft.rows.findIndex(row => row.id === id);
+ if (index < draft.rows.length - 1) {
+ const temp = draft.rows[index + 1];
+ draft.rows[index + 1] = draft.rows[index];
+ draft.rows[index] = temp;
+ }
+ }),
+ });
+ };
+
+ const boardType = getBoardType(board);
+ const { entityId } = getBoardEntity(board);
+ const canEdit = requiresBoardWebsite ? !requiresBoardEntity(boardType) || !!entityId : true;
+ const rows = board?.parameters?.rows ?? [];
+ const minHeight = (rows.length || 1) * MAX_ROW_HEIGHT + BUTTON_ROW_HEIGHT;
+
+ return (
+
+
+ {rows.map((row, index) => (
+
+
+
+
+ {(index < rows.length - 1 || canEdit) && (
+
+
+
+
+
+
+
+ )}
+
+ ))}
+ {canEdit && (
+
+
+
+
+
+
+
+
+ Add row
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardEditColumn.tsx b/src/app/(main)/boards/[boardId]/BoardEditColumn.tsx
new file mode 100644
index 000000000..0a89ea25c
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardEditColumn.tsx
@@ -0,0 +1,149 @@
+import { Panel } from '@/components/common/Panel';
+import { useBoard, useMessages, useNavigation } from '@/components/hooks';
+import { Pencil, Plus, X } from '@/components/icons';
+import { getBoardEntity, getBoardType, getResolvedComponentEntity } from '@/lib/boards';
+import type { BoardComponentConfig } from '@/lib/types';
+import {
+ Box,
+ Button,
+ Column,
+ Dialog,
+ Icon,
+ Modal,
+ Row,
+ Tooltip,
+ TooltipTrigger,
+} from '@umami/react-zen';
+import { useMemo, useState } from 'react';
+import { getComponentDefinition } from '../boardComponentRegistry';
+import { BoardComponentRenderer } from './BoardComponentRenderer';
+import { BoardComponentSelect } from './BoardComponentSelect';
+
+export function BoardEditColumn({
+ id,
+ component,
+ canEdit,
+ onRemove,
+ onSetComponent,
+ canRemove = true,
+}: {
+ id: string;
+ component?: BoardComponentConfig;
+ canEdit: boolean;
+ onRemove: (id: string) => void;
+ onSetComponent: (id: string, config: BoardComponentConfig | null) => void;
+ canRemove?: boolean;
+}) {
+ const [showSelect, setShowSelect] = useState(false);
+ const [showActions, setShowActions] = useState(false);
+ const { board } = useBoard();
+ const { t, labels } = useMessages();
+ const { teamId } = useNavigation();
+ const boardType = getBoardType(board);
+ const { entityType: boardEntityType, entityId: boardEntityId } = getBoardEntity(board);
+ const definition = component ? getComponentDefinition(component.type) : undefined;
+ const { entityType, entityId } = getResolvedComponentEntity(board, component);
+ const renderedComponent = useMemo(() => {
+ if (!component || (!entityId && definition?.requiresWebsite !== false)) {
+ return null;
+ }
+
+ return ;
+ }, [component, definition?.requiresWebsite, entityId, entityType]);
+
+ const handleSelect = (config: BoardComponentConfig) => {
+ onSetComponent(id, config);
+ setShowSelect(false);
+ };
+
+ const hasComponent = !!component;
+ const canRemoveAction = hasComponent || canRemove;
+ const title = component?.title;
+ const description = component?.description;
+
+ const handleRemove = () => {
+ if (hasComponent) {
+ onSetComponent(id, null);
+ } else {
+ onRemove(id);
+ }
+ };
+
+ return (
+ setShowActions(true)}
+ onMouseLeave={() => setShowActions(false)}
+ >
+ {canEdit && (showActions || !hasComponent) && (
+
+
+
+ setShowSelect(true)}>
+
+ {hasComponent ? : }
+
+
+ {t(hasComponent ? labels.edit : labels.selectComponent)}
+
+ {canRemoveAction && (
+
+
+
+
+
+
+ {t(labels.remove)}
+
+ )}
+
+
+ )}
+ {renderedComponent && (
+
+
+ {renderedComponent}
+
+
+ )}
+
+
+ {() => (
+ setShowSelect(false)}
+ />
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx b/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx
new file mode 100644
index 000000000..2dfa719b6
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardEditHeader.tsx
@@ -0,0 +1,38 @@
+import { Button, LoadingButton, Row } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useBoard, useMessages, useNavigation } from '@/components/hooks';
+
+export function BoardDesignHeader() {
+ const { board, saveBoard, isPending } = useBoard();
+ const { t, labels } = useMessages();
+ const { router, renderUrl } = useNavigation();
+ const title = board?.name || t(labels.untitled);
+
+ const handleSave = async () => {
+ await saveBoard();
+ if (board.id) {
+ router.push(renderUrl(`/boards/${board.id}`));
+ }
+ };
+
+ const handleCancel = () => {
+ if (board.id) {
+ router.push(renderUrl(`/boards/${board.id}`));
+ } else {
+ router.push(renderUrl('/boards'));
+ }
+ };
+
+ return (
+
+
+
+ {t(labels.cancel)}
+
+
+ {t(labels.save)}
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardEditPage.tsx b/src/app/(main)/boards/[boardId]/BoardEditPage.tsx
new file mode 100644
index 000000000..6ae3fcb65
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardEditPage.tsx
@@ -0,0 +1,21 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { BoardProvider } from '@/app/(main)/boards/BoardProvider';
+import { PageBody } from '@/components/common/PageBody';
+import { BoardControls } from './BoardControls';
+import { BoardEditBody } from './BoardEditBody';
+import { BoardDesignHeader } from './BoardEditHeader';
+
+export function BoardDesignPage({ boardId }: { boardId: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardEditRow.tsx b/src/app/(main)/boards/[boardId]/BoardEditRow.tsx
new file mode 100644
index 000000000..f6306ffa9
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardEditRow.tsx
@@ -0,0 +1,202 @@
+import { Box, Button, Column, Icon, Row, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import { produce } from 'immer';
+import { Fragment, useState } from 'react';
+import {
+ Group,
+ type GroupImperativeHandle,
+ Panel as ResizablePanel,
+ Separator,
+} from 'react-resizable-panels';
+import { v4 as uuid } from 'uuid';
+import { useBoard } from '@/components/hooks';
+import { ChevronDown, GripVertical, Minus, Plus } from '@/components/icons';
+import type { BoardColumn as BoardColumnType, BoardComponentConfig } from '@/lib/types';
+import { BoardEditColumn } from './BoardEditColumn';
+import { MAX_COLUMNS, MIN_COLUMN_WIDTH } from './boardConstants';
+
+export function BoardEditRow({
+ rowId,
+ rowIndex,
+ rowCount,
+ columns,
+ canEdit,
+ onRemove,
+ onMoveUp,
+ onMoveDown,
+ onRegisterRef,
+}: {
+ rowId: string;
+ rowIndex: number;
+ rowCount: number;
+ columns: BoardColumnType[];
+ canEdit: boolean;
+ onRemove: (id: string) => void;
+ onMoveUp: (id: string) => void;
+ onMoveDown: (id: string) => void;
+ onRegisterRef: (rowId: string, ref: GroupImperativeHandle | null) => void;
+}) {
+ const { board, updateBoard } = useBoard();
+ const [showActions, setShowActions] = useState(false);
+ const moveUpDisabled = rowIndex === 0;
+ const addColumnDisabled = columns.length >= MAX_COLUMNS;
+ const moveDownDisabled = rowIndex === rowCount - 1;
+
+ const handleGroupRef = (ref: GroupImperativeHandle | null) => {
+ onRegisterRef(rowId, ref);
+ };
+
+ const handleAddColumn = () => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ const rowIndex = draft.rows.findIndex(row => row.id === rowId);
+ const row = draft.rows[rowIndex];
+
+ if (!row) {
+ draft.rows[rowIndex] = { id: uuid(), columns: [] };
+ }
+ row.columns.push({ id: uuid(), component: null });
+ }),
+ });
+ };
+
+ const handleRemoveColumn = (columnId: string) => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ const row = draft.rows.find(row => row.id === rowId);
+ if (row) {
+ row.columns = row.columns.filter(col => col.id !== columnId);
+ }
+ }),
+ });
+ };
+
+ const handleSetComponent = (columnId: string, config: BoardComponentConfig | null) => {
+ updateBoard({
+ parameters: produce(board.parameters, draft => {
+ const row = draft.rows.find(row => row.id === rowId);
+ if (row) {
+ const col = row.columns.find(col => col.id === columnId);
+ if (col) {
+ col.component = config;
+ }
+ }
+ }),
+ });
+ };
+
+ return (
+ setShowActions(true)}
+ onMouseLeave={() => setShowActions(false)}
+ >
+
+ {columns?.map((column, index) => (
+
+
+ 1}
+ />
+
+ {index < columns.length - 1 && (
+
+
+
+
+
+
+
+ )}
+
+ ))}
+
+ {canEdit && showActions && (
+
+
+ onMoveUp(rowId)}
+ isDisabled={moveUpDisabled}
+ style={moveUpDisabled ? { pointerEvents: 'none' } : undefined}
+ >
+
+
+
+
+ Move row up
+
+
+
+
+
+
+
+ Add column
+
+
+ onRemove(rowId)}>
+
+
+
+
+ Remove row
+
+
+ onMoveDown(rowId)}
+ isDisabled={moveDownDisabled}
+ style={moveDownDisabled ? { pointerEvents: 'none' } : undefined}
+ >
+
+
+
+
+ Move row down
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardShareButton.tsx b/src/app/(main)/boards/[boardId]/BoardShareButton.tsx
new file mode 100644
index 000000000..77d6cc609
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardShareButton.tsx
@@ -0,0 +1,19 @@
+import { Share } from '@/components/icons';
+import { useMessages } from '@/components/hooks';
+import { DialogButton } from '@/components/input/DialogButton';
+import { BoardShareDialog } from './BoardShareDialog';
+
+export function BoardShareButton({ boardId }: { boardId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ }
+ label={t(labels.share)}
+ title={null}
+ width="900px"
+ >
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardShareCreateForm.tsx b/src/app/(main)/boards/[boardId]/BoardShareCreateForm.tsx
new file mode 100644
index 000000000..1842edcc9
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardShareCreateForm.tsx
@@ -0,0 +1,57 @@
+import { Button, Column, Form, FormField, FormSubmitButton, Row, TextField } from '@umami/react-zen';
+import { useState } from 'react';
+import { useApi, useMessages, useModified } from '@/components/hooks';
+
+export function BoardShareCreateForm({
+ boardId,
+ onSave,
+ onCancel,
+}: {
+ boardId: string;
+ onSave?: () => void;
+ onCancel?: () => void;
+}) {
+ const { post } = useApi();
+ const { touch } = useModified();
+ const { t, labels, getErrorMessage } = useMessages();
+ const [isPending, setIsPending] = useState(false);
+ const [error, setError] = useState(null);
+
+ const handleSubmit = async (data: { name: string }) => {
+ setIsPending(true);
+ setError(null);
+
+ try {
+ await post(`/boards/${boardId}/shares`, {
+ name: data.name,
+ });
+
+ touch('shares');
+ onSave?.();
+ } catch (e) {
+ setError(e);
+ } finally {
+ setIsPending(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardShareDialog.tsx b/src/app/(main)/boards/[boardId]/BoardShareDialog.tsx
new file mode 100644
index 000000000..ba7a84774
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardShareDialog.tsx
@@ -0,0 +1,63 @@
+import { Button, Column, Heading, Row, Text } from '@umami/react-zen';
+import { useState } from 'react';
+import { Plus } from '@/components/icons';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useBoardSharesQuery, useMessages } from '@/components/hooks';
+import { BoardShareCreateForm } from './BoardShareCreateForm';
+import { BoardSharesTable } from './BoardSharesTable';
+
+export function BoardShareDialog({ boardId }: { boardId: string }) {
+ const { data, error, isLoading } = useBoardSharesQuery({ boardId });
+ const shares = data?.data || [];
+ const hasShares = shares.length > 0;
+
+ return (
+
+
+
+ );
+}
+
+function BoardShareDialogContent({
+ boardId,
+ hasShares,
+ shares,
+}: {
+ boardId: string;
+ hasShares: boolean;
+ shares: any[];
+}) {
+ const { t, labels, messages } = useMessages();
+ const [isCreating, setIsCreating] = useState(false);
+ const showCreateForm = isCreating;
+
+ return (
+
+
+ {t(labels.share)}
+ {!isCreating && (
+ setIsCreating(true)}>
+ } label={t(labels.add)} />
+
+ )}
+
+ {showCreateForm && (
+ setIsCreating(false)}
+ onCancel={() => setIsCreating(false)}
+ />
+ )}
+ {hasShares && (
+ {t(messages.shareUrl)}
+ )}
+ {!showCreateForm &&
+ (hasShares ? (
+
+ ) : (
+ {t(messages.noDataAvailable)}
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardSharesTable.tsx b/src/app/(main)/boards/[boardId]/BoardSharesTable.tsx
new file mode 100644
index 000000000..3f4e81531
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardSharesTable.tsx
@@ -0,0 +1,48 @@
+import { ShareDeleteButton } from '@/app/(main)/websites/[websiteId]/settings/ShareDeleteButton';
+import { CopyButton } from '@/components/common/CopyButton';
+import { ExternalLink } from '@/components/common/ExternalLink';
+import { useConfig, useMessages, useMobile } from '@/components/hooks';
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+
+export function BoardSharesTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { cloudMode } = useConfig();
+ const { isMobile } = useMobile();
+
+ const getUrl = (slug: string) => {
+ if (cloudMode) {
+ return `${process.env.cloudUrl}/share/${slug}`;
+ }
+
+ return `${window?.location.origin}${process.env.basePath || ''}/share/${slug}`;
+ };
+
+ return (
+
+
+ {({ name }: any) => name}
+
+
+ {({ slug }: any) => {
+ const url = getUrl(slug);
+
+ return (
+
+
+ {isMobile ? slug : url}
+
+
+
+ );
+ }}
+
+
+ {({ id, slug }: any) => (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardViewBody.tsx b/src/app/(main)/boards/[boardId]/BoardViewBody.tsx
new file mode 100644
index 000000000..436f285b8
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardViewBody.tsx
@@ -0,0 +1,16 @@
+import { Column } from '@umami/react-zen';
+import { useBoard } from '@/components/hooks';
+import { BoardViewRow } from './BoardViewRow';
+
+export function BoardViewBody({ showEntityBadges = true }: { showEntityBadges?: boolean }) {
+ const { board } = useBoard();
+ const rows = board?.parameters?.rows ?? [];
+
+ return (
+
+ {rows.map(row => (
+
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardViewColumn.tsx b/src/app/(main)/boards/[boardId]/BoardViewColumn.tsx
new file mode 100644
index 000000000..5bb2f8b65
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardViewColumn.tsx
@@ -0,0 +1,51 @@
+import { Column, Heading, Row, Text } from '@umami/react-zen';
+import { Panel } from '@/components/common/Panel';
+import { useBoard } from '@/components/hooks';
+import { getBoardType, getResolvedComponentEntity, isOpenBoardType } from '@/lib/boards';
+import type { BoardComponentConfig } from '@/lib/types';
+import { BoardEntityBadge } from '../BoardEntityBadge';
+import { getComponentDefinition } from '../boardComponentRegistry';
+import { useBoardEntityBadgeProps } from '../useBoardEntityBadgeProps';
+import { BoardComponentRenderer } from './BoardComponentRenderer';
+
+export function BoardViewColumn({
+ component,
+ showEntityBadge = true,
+}: {
+ component?: BoardComponentConfig;
+ showEntityBadge?: boolean;
+}) {
+ const { board } = useBoard();
+ const boardType = getBoardType(board);
+ const definition = component ? getComponentDefinition(component.type) : undefined;
+ const { entityType, entityId } = getResolvedComponentEntity(board, component);
+ const entityBadge = useBoardEntityBadgeProps(entityType, entityId, showEntityBadge);
+
+ if (!component || (!entityId && definition?.requiresWebsite !== false)) {
+ return null;
+ }
+
+ const title = component.title;
+ const description = component.description;
+
+ const showBadge = showEntityBadge && isOpenBoardType(boardType) && !!entityBadge;
+
+ return (
+
+ {showBadge ? (
+
+ {title && {title} }
+
+
+ ) : (
+ title && {title}
+ )}
+ {description && {description} }
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx b/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx
new file mode 100644
index 000000000..8533e4534
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardViewHeader.tsx
@@ -0,0 +1,41 @@
+import { Row } from '@umami/react-zen';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useBoard, useMessages, useNavigation } from '@/components/hooks';
+import { getBoardEntity } from '@/lib/boards';
+import { Edit, LayoutDashboard } from '@/components/icons';
+import { BoardEntityBadge } from '../BoardEntityBadge';
+import { useBoardEntityBadgeProps } from '../useBoardEntityBadgeProps';
+
+export function BoardViewHeader({
+ showActions = true,
+ showEntityBadge = true,
+}: {
+ showActions?: boolean;
+ showEntityBadge?: boolean;
+}) {
+ const { board } = useBoard();
+ const { renderUrl } = useNavigation();
+ const { t, labels } = useMessages();
+ const { entityType, entityId } = getBoardEntity(board);
+ const entityBadge = useBoardEntityBadgeProps(entityType, entityId, showEntityBadge);
+
+ return (
+
+
+ {showEntityBadge && entityBadge && }
+ {showActions && board?.id && (
+ <>
+
+ }>Design
+
+
+ }>{t(labels.edit)}
+
+ >
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardViewPage.tsx b/src/app/(main)/boards/[boardId]/BoardViewPage.tsx
new file mode 100644
index 000000000..334fcd1cf
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardViewPage.tsx
@@ -0,0 +1,31 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { BoardProvider } from '@/app/(main)/boards/BoardProvider';
+import { PageBody } from '@/components/common/PageBody';
+import { BoardControls } from './BoardControls';
+import { BoardViewBody } from './BoardViewBody';
+import { BoardViewHeader } from './BoardViewHeader';
+
+export function BoardViewPage({
+ boardId,
+ showActions = true,
+ showControls = true,
+ showEntityBadges = true,
+}: {
+ boardId: string;
+ showActions?: boolean;
+ showControls?: boolean;
+ showEntityBadges?: boolean;
+}) {
+ return (
+
+
+
+
+ {showControls && }
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/BoardViewRow.tsx b/src/app/(main)/boards/[boardId]/BoardViewRow.tsx
new file mode 100644
index 000000000..15a6b3a06
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/BoardViewRow.tsx
@@ -0,0 +1,28 @@
+import { Box, Row } from '@umami/react-zen';
+import type { BoardColumn } from '@/lib/types';
+import { BoardViewColumn } from './BoardViewColumn';
+import { MIN_COLUMN_WIDTH } from './boardConstants';
+
+export function BoardViewRow({
+ columns,
+ showEntityBadges = true,
+}: {
+ columns: BoardColumn[];
+ showEntityBadges?: boolean;
+}) {
+ return (
+
+ {columns.map(column => (
+
+
+
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/boardConstants.ts b/src/app/(main)/boards/[boardId]/boardConstants.ts
new file mode 100644
index 000000000..4d1bb5c6f
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/boardConstants.ts
@@ -0,0 +1,5 @@
+export const MIN_ROW_HEIGHT = 150;
+export const MAX_ROW_HEIGHT = 600;
+export const MIN_COLUMN_WIDTH = 300;
+export const BUTTON_ROW_HEIGHT = 60;
+export const MAX_COLUMNS = 4;
diff --git a/src/app/(main)/boards/[boardId]/design/page.tsx b/src/app/(main)/boards/[boardId]/design/page.tsx
new file mode 100644
index 000000000..ec55c213d
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/design/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { BoardDesignPage } from '../BoardEditPage';
+
+export default async function ({ params }: { params: Promise<{ boardId: string }> }) {
+ const { boardId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Design Board',
+};
diff --git a/src/app/(main)/boards/[boardId]/edit/BoardEditPage.tsx b/src/app/(main)/boards/[boardId]/edit/BoardEditPage.tsx
new file mode 100644
index 000000000..4867cc5a8
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/edit/BoardEditPage.tsx
@@ -0,0 +1,49 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import Link from 'next/link';
+import { BoardEditForm } from '@/app/(main)/boards/BoardEditForm';
+import { BoardShareDialog } from '@/app/(main)/boards/[boardId]/BoardShareDialog';
+import { IconLabel } from '@/components/common/IconLabel';
+import { Panel } from '@/components/common/Panel';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useBoardQuery, useMessages, useNavigation } from '@/components/hooks';
+import { ArrowLeft, LayoutDashboard } from '@/components/icons';
+
+export function BoardEditPage({ boardId }: { boardId: string }) {
+ const { data: board } = useBoardQuery(boardId);
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+ <>
+
+
+ } label="Board" />
+
+
+ }
+ />
+ >
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/boards/[boardId]/edit/page.tsx b/src/app/(main)/boards/[boardId]/edit/page.tsx
new file mode 100644
index 000000000..9a5562dd9
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/edit/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { BoardEditPage } from './BoardEditPage';
+
+export default async function ({ params }: { params: Promise<{ boardId: string }> }) {
+ const { boardId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Edit Board',
+};
diff --git a/src/app/(main)/boards/[boardId]/page.tsx b/src/app/(main)/boards/[boardId]/page.tsx
new file mode 100644
index 000000000..4758f9fb0
--- /dev/null
+++ b/src/app/(main)/boards/[boardId]/page.tsx
@@ -0,0 +1,17 @@
+import type { Metadata } from 'next';
+import { redirect } from 'next/navigation';
+import { BoardViewPage } from './BoardViewPage';
+
+export default async function ({ params }: { params: Promise<{ boardId: string }> }) {
+ const { boardId } = await params;
+
+ if (boardId === 'create') {
+ redirect('/boards');
+ }
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Board',
+};
diff --git a/src/app/(main)/boards/boardComponentRegistry.tsx b/src/app/(main)/boards/boardComponentRegistry.tsx
new file mode 100644
index 000000000..2af1c7006
--- /dev/null
+++ b/src/app/(main)/boards/boardComponentRegistry.tsx
@@ -0,0 +1,218 @@
+import { TextBlock } from '@/app/(main)/boards/TextBlock';
+import { LinkMetricsBar } from '@/app/(main)/links/[linkId]/LinkMetricsBar';
+import { PixelMetricsBar } from '@/app/(main)/pixels/[pixelId]/PixelMetricsBar';
+import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart';
+import { WebsiteMetricsBar } from '@/app/(main)/websites/[websiteId]/WebsiteMetricsBar';
+import {
+ Calendar,
+ ChartColumnBig,
+ ChartPie,
+ FileText,
+ Globe,
+ PanelTop,
+ Sheet,
+} from '@/components/icons';
+import { EventsChart } from '@/components/metrics/EventsChart';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { WeeklyTraffic } from '@/components/metrics/WeeklyTraffic';
+import { WorldMap } from '@/components/metrics/WorldMap';
+import type { ComponentType } from 'react';
+
+export interface ConfigField {
+ name: string;
+ label: string;
+ type: 'select' | 'number' | 'text' | 'textarea';
+ options?: { label: string; value: string }[];
+ optionsByEntityType?: Record;
+ defaultValue?: any;
+}
+
+export interface ComponentDefinition {
+ type: string;
+ name: string;
+ description: string;
+ category: string;
+ icon: ComponentType;
+ component: ComponentType;
+ componentByEntityType?: Record>;
+ defaultProps?: Record;
+ configFields?: ConfigField[];
+ requiresWebsite?: boolean;
+}
+
+export const CATEGORIES = [
+ { key: 'overview', name: 'Overview' },
+ { key: 'tables', name: 'Tables' },
+ { key: 'visualization', name: 'Visualization' },
+ { key: 'content', name: 'Content' },
+] as const;
+
+const METRIC_TYPES = [
+ { label: 'Path', value: 'path' },
+ { label: 'Entry page', value: 'entry' },
+ { label: 'Exit page', value: 'exit' },
+ { label: 'Title', value: 'title' },
+ { label: 'Query', value: 'query' },
+ { label: 'Referrer', value: 'referrer' },
+ { label: 'Channel', value: 'channel' },
+ { label: 'Country', value: 'country' },
+ { label: 'Region', value: 'region' },
+ { label: 'City', value: 'city' },
+ { label: 'Browser', value: 'browser' },
+ { label: 'OS', value: 'os' },
+ { label: 'Device', value: 'device' },
+ { label: 'Language', value: 'language' },
+ { label: 'Screen', value: 'screen' },
+ { label: 'UTM Source', value: 'utmSource' },
+ { label: 'UTM Medium', value: 'utmMedium' },
+ { label: 'UTM Campaign', value: 'utmCampaign' },
+ { label: 'UTM Content', value: 'utmContent' },
+ { label: 'UTM Term', value: 'utmTerm' },
+ { label: 'Event', value: 'event' },
+ { label: 'Hostname', value: 'hostname' },
+];
+
+const PIXEL_LINK_METRIC_TYPES = METRIC_TYPES.filter(({ value }) =>
+ [
+ 'referrer',
+ 'country',
+ 'region',
+ 'city',
+ 'browser',
+ 'os',
+ 'device',
+ 'query',
+ 'utmSource',
+ 'utmMedium',
+ 'utmCampaign',
+ 'utmContent',
+ 'utmTerm',
+ ].includes(value),
+);
+
+const LIMIT_OPTIONS = [
+ { label: '5', value: '5' },
+ { label: '10', value: '10' },
+ { label: '20', value: '20' },
+];
+
+const PixelMetricsBarAdapter = ({ websiteId }: { websiteId?: string }) =>
+ websiteId ? : null;
+
+const LinkMetricsBarAdapter = ({ websiteId }: { websiteId?: string }) =>
+ websiteId ? : null;
+
+const componentDefinitions: ComponentDefinition[] = [
+ // Overview
+ {
+ type: 'WebsiteMetricsBar',
+ name: 'Metrics bar',
+ description: 'Key metrics: views, visitors, bounces, time on site',
+ category: 'overview',
+ icon: PanelTop,
+ component: WebsiteMetricsBar,
+ componentByEntityType: {
+ pixel: PixelMetricsBarAdapter,
+ link: LinkMetricsBarAdapter,
+ },
+ },
+ {
+ type: 'WebsiteChart',
+ name: 'Website chart',
+ description: 'Page views and visitors over time',
+ category: 'overview',
+ icon: ChartColumnBig,
+ component: WebsiteChart,
+ },
+
+ // Tables
+ {
+ type: 'MetricsTable',
+ name: 'Metrics table',
+ description: 'Table of metrics by dimension',
+ category: 'tables',
+ icon: Sheet,
+ component: MetricsTable,
+ defaultProps: { type: 'path', limit: 10 },
+ configFields: [
+ {
+ name: 'type',
+ label: 'Metric type',
+ type: 'select',
+ options: METRIC_TYPES,
+ optionsByEntityType: {
+ pixel: PIXEL_LINK_METRIC_TYPES,
+ link: PIXEL_LINK_METRIC_TYPES,
+ },
+ defaultValue: 'path',
+ },
+ {
+ name: 'limit',
+ label: 'Rows',
+ type: 'select',
+ options: LIMIT_OPTIONS,
+ defaultValue: '10',
+ },
+ ],
+ },
+
+ // Visualization
+ {
+ type: 'WorldMap',
+ name: 'World map',
+ description: 'Geographic distribution of visitors',
+ category: 'visualization',
+ icon: Globe,
+ component: WorldMap,
+ },
+ {
+ type: 'WeeklyTraffic',
+ name: 'Weekly traffic',
+ description: 'Traffic heatmap by day and hour',
+ category: 'visualization',
+ icon: Calendar,
+ component: WeeklyTraffic,
+ },
+ {
+ type: 'EventsChart',
+ name: 'Events chart',
+ description: 'Custom events over time',
+ category: 'visualization',
+ icon: ChartPie,
+ component: EventsChart,
+ },
+
+ // Content
+ {
+ type: 'TextBlock',
+ name: 'Text',
+ description: 'Free-form text content',
+ category: 'content',
+ icon: FileText,
+ component: TextBlock,
+ requiresWebsite: false,
+ defaultProps: { text: '' },
+ configFields: [
+ {
+ name: 'text',
+ label: 'Text',
+ type: 'textarea',
+ defaultValue: '',
+ },
+ ],
+ },
+];
+
+const definitionMap = new Map(componentDefinitions.map(def => [def.type, def]));
+
+export function getComponentDefinitions(): ComponentDefinition[] {
+ return componentDefinitions;
+}
+
+export function getComponentDefinition(type: string): ComponentDefinition | undefined {
+ return definitionMap.get(type);
+}
+
+export function getComponentsByCategory(category: string): ComponentDefinition[] {
+ return componentDefinitions.filter(def => def.category === category);
+}
diff --git a/src/app/(main)/boards/create/page.tsx b/src/app/(main)/boards/create/page.tsx
new file mode 100644
index 000000000..f8ec472c4
--- /dev/null
+++ b/src/app/(main)/boards/create/page.tsx
@@ -0,0 +1,13 @@
+'use client';
+import { useEffect } from 'react';
+import { useNavigation } from '@/components/hooks';
+
+export default function CreateBoardPage() {
+ const { router, renderUrl } = useNavigation();
+
+ useEffect(() => {
+ router.replace(renderUrl('/boards', false));
+ }, [router, renderUrl]);
+
+ return null;
+}
diff --git a/src/app/(main)/boards/page.tsx b/src/app/(main)/boards/page.tsx
new file mode 100644
index 000000000..e8ca66244
--- /dev/null
+++ b/src/app/(main)/boards/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { BoardsPage } from './BoardsPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Boards',
+};
diff --git a/src/app/(main)/boards/useBoardEntityBadgeProps.ts b/src/app/(main)/boards/useBoardEntityBadgeProps.ts
new file mode 100644
index 000000000..42958352e
--- /dev/null
+++ b/src/app/(main)/boards/useBoardEntityBadgeProps.ts
@@ -0,0 +1,28 @@
+import { useLinkQuery, usePixelQuery, useWebsiteQuery } from '@/components/hooks';
+import type { BoardEntityType } from '@/lib/boards';
+
+export function useBoardEntityBadgeProps(
+ entityType?: BoardEntityType,
+ entityId?: string,
+ enabled = true,
+) {
+ const { data: website } = useWebsiteQuery(
+ enabled && entityType === 'website' ? entityId : undefined,
+ );
+ const { data: pixel } = usePixelQuery(enabled && entityType === 'pixel' ? entityId : undefined);
+ const { data: link } = useLinkQuery(enabled && entityType === 'link' ? entityId : undefined);
+
+ if (entityType === 'website' && website?.name) {
+ return { type: entityType, name: website.name, domain: website.domain ?? undefined };
+ }
+
+ if (entityType === 'pixel' && pixel?.name) {
+ return { type: entityType, name: pixel.name };
+ }
+
+ if (entityType === 'link' && link?.name) {
+ return { type: entityType, name: link.name };
+ }
+
+ return null;
+}
diff --git a/src/app/(main)/console/TestConsole.module.css b/src/app/(main)/console/TestConsole.module.css
deleted file mode 100644
index 88b70ab3d..000000000
--- a/src/app/(main)/console/TestConsole.module.css
+++ /dev/null
@@ -1,33 +0,0 @@
-.container {
- display: grid;
- gap: 30px;
- padding-bottom: 40px;
-}
-
-.actions {
- border: 1px solid var(--base400);
- border-radius: 5px;
- padding: 0 20px 20px 20px;
- display: grid;
- gap: 40px;
- grid-template-columns: repeat(3, minmax(300px, 1fr));
- box-shadow: 0 0 0 10px var(--base100);
-}
-
-.header {
- font-size: 16px;
- font-weight: 700;
- margin: 20px 0;
-}
-
-.group {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-
-.wrapped {
- border: 1px solid var(--blue900);
- border-radius: 4px;
- padding: 8px 16px;
-}
diff --git a/src/app/(main)/console/TestConsole.tsx b/src/app/(main)/console/[websiteId]/TestConsolePage.tsx
similarity index 58%
rename from src/app/(main)/console/TestConsole.tsx
rename to src/app/(main)/console/[websiteId]/TestConsolePage.tsx
index 8ed31fec6..82c8e2494 100644
--- a/src/app/(main)/console/TestConsole.tsx
+++ b/src/app/(main)/console/[websiteId]/TestConsolePage.tsx
@@ -1,35 +1,25 @@
'use client';
-import { Button } from 'react-basics';
+import { Button, Column, Grid, Heading } from '@umami/react-zen';
import Link from 'next/link';
import Script from 'next/script';
-import WebsiteSelect from '@/components/input/WebsiteSelect';
-import Page from '@/components/layout/Page';
-import PageHeader from '@/components/layout/PageHeader';
-import EventsChart from '@/components/metrics/EventsChart';
-import WebsiteChart from '../websites/[websiteId]/WebsiteChart';
-import { useApi, useNavigation } from '@/components/hooks';
-import styles from './TestConsole.module.css';
+import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useWebsiteQuery } from '@/components/hooks';
+import { EventsChart } from '@/components/metrics/EventsChart';
-export function TestConsole({ websiteId }: { websiteId?: string }) {
- const { get, useQuery } = useApi();
- const { data, isLoading, error } = useQuery({
- queryKey: ['websites:me'],
- queryFn: () => get('/me/websites'),
- });
- const { router } = useNavigation();
-
- function handleChange(value: string) {
- router.push(`/console/${value}`);
- }
+export function TestConsolePage({ websiteId }: { websiteId: string }) {
+ const { data } = useWebsiteQuery(websiteId);
function handleRunScript() {
- window['umami'].track(props => ({
+ window.umami.track(props => ({
...props,
url: '/page-view',
referrer: 'https://www.google.com',
}));
- window['umami'].track('track-event-no-data');
- window['umami'].track('track-event-with-data', {
+ window.umami.track('track-event-no-data');
+ window.umami.track('track-event-with-data', {
test: 'test-data',
boolean: true,
booleanError: 'true',
@@ -50,32 +40,32 @@ export function TestConsole({ websiteId }: { websiteId?: string }) {
}
function handleRunRevenue() {
- window['umami'].track(props => ({
+ window.umami.track(props => ({
...props,
url: '/checkout-cart',
referrer: 'https://www.google.com',
}));
- window['umami'].track('checkout-cart', {
+ window.umami.track('checkout-cart', {
revenue: parseFloat((Math.random() * 1000).toFixed(2)),
currency: 'USD',
});
- window['umami'].track('affiliate-link', {
+ window.umami.track('affiliate-link', {
revenue: parseFloat((Math.random() * 1000).toFixed(2)),
currency: 'USD',
});
- window['umami'].track('promotion-link', {
+ window.umami.track('promotion-link', {
revenue: parseFloat((Math.random() * 1000).toFixed(2)),
currency: 'USD',
});
- window['umami'].track('checkout-cart', {
+ window.umami.track('checkout-cart', {
revenue: parseFloat((Math.random() * 1000).toFixed(2)),
currency: 'EUR',
});
- window['umami'].track('promotion-link', {
+ window.umami.track('promotion-link', {
revenue: parseFloat((Math.random() * 1000).toFixed(2)),
currency: 'EUR',
});
- window['umami'].track('affiliate-link', {
+ window.umami.track('affiliate-link', {
item1: {
productIdentity: 'ABC424',
revenue: parseFloat((Math.random() * 10000).toFixed(2)),
@@ -90,7 +80,7 @@ export function TestConsole({ websiteId }: { websiteId?: string }) {
}
function handleRunIdentify() {
- window['umami'].identify({
+ window.umami.identify({
userId: 123,
name: 'brian',
number: Math.random() * 100,
@@ -114,29 +104,33 @@ export function TestConsole({ websiteId }: { websiteId?: string }) {
return null;
}
- const website = data?.data.find(({ id }) => websiteId === id);
-
return (
-
+
-
+ {data.name}
- {website && (
-
-
-
-
-
Page links
+
+
+
+
+
+
+ Page links
- page one
+ page one
- page two
+ page two
-
-
-
Click events
+
+
+ Click events
Send event
@@ -184,21 +178,17 @@ export function TestConsole({ websiteId }: { websiteId?: string }) {
data-umami-event-id="123"
variant="primary"
>
- Button with div
+ Button with div
-
- DIV with attribute
-
-
-
-
- Nested DIV
-
+
DIV with attribute
+
-
-
-
Javascript events
+
+
+ Javascript events
Run script
@@ -208,14 +198,16 @@ export function TestConsole({ websiteId }: { websiteId?: string }) {
Revenue script
-
-
-
-
-
- )}
-
+
+
+
+
Pageviews
+
+
Events
+
+
+
+
+
);
}
-
-export default TestConsole;
diff --git a/src/app/(main)/console/[[...websiteId]]/page.tsx b/src/app/(main)/console/[websiteId]/page.tsx
similarity index 71%
rename from src/app/(main)/console/[[...websiteId]]/page.tsx
rename to src/app/(main)/console/[websiteId]/page.tsx
index 6c504f1e6..28b816152 100644
--- a/src/app/(main)/console/[[...websiteId]]/page.tsx
+++ b/src/app/(main)/console/[websiteId]/page.tsx
@@ -1,5 +1,5 @@
-import { Metadata } from 'next';
-import TestConsole from '../TestConsole';
+import type { Metadata } from 'next';
+import { TestConsolePage } from './TestConsolePage';
async function getEnabled() {
return !!process.env.ENABLE_TEST_CONSOLE;
@@ -14,7 +14,7 @@ export default async function ({ params }: { params: Promise<{ websiteId: string
return null;
}
- return
;
+ return
;
}
export const metadata: Metadata = {
diff --git a/src/app/(main)/dashboard/DashboardEdit.module.css b/src/app/(main)/dashboard/DashboardEdit.module.css
deleted file mode 100644
index 19266d17a..000000000
--- a/src/app/(main)/dashboard/DashboardEdit.module.css
+++ /dev/null
@@ -1,57 +0,0 @@
-.buttons {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: 10px;
-}
-
-.item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- width: 100%;
- padding: 20px;
- border-radius: 5px;
- border: 1px solid var(--base400);
- background: var(--base50);
- margin-bottom: 10px;
-}
-
-.text {
- position: relative;
-}
-
-.name {
- font-weight: 600;
- font-size: 16px;
-}
-
-.domain {
- font-size: 14px;
- color: var(--base700);
-}
-
-.dragActive {
- cursor: grab;
-}
-
-.dragActive:active {
- cursor: grabbing;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 20px;
- gap: 20px;
-}
-
-.search {
- max-width: 360px;
-}
-
-.active {
- border-color: var(--base600);
- box-shadow: 4px 4px 4px var(--base100);
-}
diff --git a/src/app/(main)/dashboard/DashboardEdit.tsx b/src/app/(main)/dashboard/DashboardEdit.tsx
deleted file mode 100644
index d15ae1977..000000000
--- a/src/app/(main)/dashboard/DashboardEdit.tsx
+++ /dev/null
@@ -1,160 +0,0 @@
-import { useState, useMemo, useEffect } from 'react';
-import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd';
-import classNames from 'classnames';
-import { Button, Loading, Toggle, SearchField } from 'react-basics';
-import { firstBy } from 'thenby';
-import useDashboard, { saveDashboard } from '@/store/dashboard';
-import { useMessages, useWebsites } from '@/components/hooks';
-import styles from './DashboardEdit.module.css';
-
-const DRAG_ID = 'dashboard-website-ordering';
-
-export function DashboardEdit({ teamId }: { teamId: string }) {
- const settings = useDashboard();
- const { websiteOrder, websiteActive, isEdited } = settings;
- const { formatMessage, labels } = useMessages();
- const [order, setOrder] = useState(websiteOrder || []);
- const [active, setActive] = useState(websiteActive || []);
- const [edited, setEdited] = useState(isEdited);
- const [websites, setWebsites] = useState([]);
- const [search, setSearch] = useState('');
-
- const {
- result,
- query: { isLoading },
- setParams,
- } = useWebsites({ teamId });
-
- useEffect(() => {
- if (result?.data) {
- setWebsites(prevWebsites => {
- const newWebsites = [...prevWebsites, ...result.data];
- if (newWebsites.length < result.count) {
- setParams(prevParams => ({ ...prevParams, page: prevParams.page + 1 }));
- }
- return newWebsites;
- });
- }
- }, [result]);
-
- const ordered = useMemo(() => {
- if (websites) {
- return websites
- .map((website: { id: any; name: string; domain: string }) => ({
- ...website,
- order: order.indexOf(website.id),
- }))
- .sort(firstBy('order'));
- }
- return [];
- }, [websites, order]);
-
- function handleWebsiteDrag({ destination, source }) {
- if (!destination || destination.index === source.index) return;
-
- const orderedWebsites = [...ordered];
- const [removed] = orderedWebsites.splice(source.index, 1);
- orderedWebsites.splice(destination.index, 0, removed);
-
- setOrder(orderedWebsites.map(website => website?.id || 0));
- setEdited(true);
- }
-
- function handleActiveWebsites(id: string) {
- setActive(prevActive =>
- prevActive.includes(id) ? prevActive.filter(a => a !== id) : [...prevActive, id],
- );
- setEdited(true);
- }
-
- function handleSave() {
- saveDashboard({
- editing: false,
- isEdited: edited,
- websiteOrder: order,
- websiteActive: active,
- });
- }
-
- function handleCancel() {
- saveDashboard({ editing: false, websiteOrder, websiteActive, isEdited });
- }
-
- function handleReset() {
- setOrder([]);
- setActive([]);
- setEdited(false);
- }
-
- if (isLoading) {
- return
;
- }
-
- return (
- <>
-
-
-
-
- {formatMessage(labels.save)}
-
-
- {formatMessage(labels.cancel)}
-
-
- {formatMessage(labels.reset)}
-
-
-
-
-
-
- {(provided, snapshot) => (
-
- {ordered.map(({ id, name, domain }, index) => {
- if (
- search &&
- !`${name.toLowerCase()}${domain.toLowerCase()}`.includes(search.toLowerCase())
- ) {
- return null;
- }
-
- return (
-
- {(provided, snapshot) => (
-
-
-
handleActiveWebsites(id)}
- />
-
- )}
-
- );
- })}
- {provided.placeholder}
-
- )}
-
-
-
- >
- );
-}
-
-export default DashboardEdit;
diff --git a/src/app/(main)/dashboard/DashboardEditHeader.tsx b/src/app/(main)/dashboard/DashboardEditHeader.tsx
new file mode 100644
index 000000000..a450c85ca
--- /dev/null
+++ b/src/app/(main)/dashboard/DashboardEditHeader.tsx
@@ -0,0 +1,27 @@
+import { Button, LoadingButton, Row } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useBoard, useMessages, useNavigation } from '@/components/hooks';
+
+export function DashboardEditHeader() {
+ const { saveBoard, isPending } = useBoard();
+ const { t, labels } = useMessages();
+ const { router, renderUrl } = useNavigation();
+
+ const handleSave = async () => {
+ await saveBoard();
+ router.push(renderUrl('/dashboard', false));
+ };
+
+ return (
+
+
+ router.push(renderUrl('/dashboard', false))}>
+ {t(labels.cancel)}
+
+
+ {t(labels.save)}
+
+
+
+ );
+}
diff --git a/src/app/(main)/dashboard/DashboardEditPage.tsx b/src/app/(main)/dashboard/DashboardEditPage.tsx
new file mode 100644
index 000000000..46a7853f3
--- /dev/null
+++ b/src/app/(main)/dashboard/DashboardEditPage.tsx
@@ -0,0 +1,35 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { useEffect } from 'react';
+import { BoardControls } from '@/app/(main)/boards/[boardId]/BoardControls';
+import { BoardEditBody } from '@/app/(main)/boards/[boardId]/BoardEditBody';
+import { PageBody } from '@/components/common/PageBody';
+import { useNavigation } from '@/components/hooks';
+import { DashboardEditHeader } from './DashboardEditHeader';
+import { DashboardProvider } from './DashboardProvider';
+
+export function DashboardEditPage() {
+ const { teamId, router } = useNavigation();
+
+ useEffect(() => {
+ if (teamId) {
+ router.replace('/dashboard/edit');
+ }
+ }, [teamId, router]);
+
+ if (teamId) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/dashboard/DashboardPage.tsx b/src/app/(main)/dashboard/DashboardPage.tsx
deleted file mode 100644
index 83b27e095..000000000
--- a/src/app/(main)/dashboard/DashboardPage.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-'use client';
-import { Icon, Icons, Loading, Text } from 'react-basics';
-import PageHeader from '@/components/layout/PageHeader';
-import Pager from '@/components/common/Pager';
-import WebsiteChartList from '../websites/[websiteId]/WebsiteChartList';
-import DashboardSettingsButton from '@/app/(main)/dashboard/DashboardSettingsButton';
-import DashboardEdit from '@/app/(main)/dashboard/DashboardEdit';
-import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
-import { useMessages, useLocale, useTeamUrl, useWebsites } from '@/components/hooks';
-import useDashboard from '@/store/dashboard';
-import LinkButton from '@/components/common/LinkButton';
-
-export function DashboardPage() {
- const { formatMessage, labels, messages } = useMessages();
- const { teamId, renderTeamUrl } = useTeamUrl();
- const { showCharts, editing, isEdited } = useDashboard();
- const { dir } = useLocale();
- const pageSize = isEdited ? 200 : 10;
-
- const { result, query, params, setParams } = useWebsites({ teamId }, { pageSize });
- const { page } = params;
- const hasData = !!result?.data?.length;
-
- const handlePageChange = (page: number) => {
- setParams({ ...params, page });
- };
-
- if (query.isLoading) {
- return
;
- }
-
- return (
-
-
- {!editing && hasData && }
-
- {!hasData && (
-
-
-
-
-
- {formatMessage(messages.goToSettings)}
-
-
- )}
- {hasData && (
- <>
- {editing && }
- {!editing && (
- <>
-
-
- >
- )}
- >
- )}
-
- );
-}
-
-export default DashboardPage;
diff --git a/src/app/(main)/dashboard/DashboardProvider.tsx b/src/app/(main)/dashboard/DashboardProvider.tsx
new file mode 100644
index 000000000..8d8ffb721
--- /dev/null
+++ b/src/app/(main)/dashboard/DashboardProvider.tsx
@@ -0,0 +1,113 @@
+'use client';
+import { Loading, useToast } from '@umami/react-zen';
+import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react';
+import { v4 as uuid } from 'uuid';
+import { BoardContext, type LayoutGetter } from '@/app/(main)/boards/BoardProvider';
+import { getComponentDefinition } from '@/app/(main)/boards/boardComponentRegistry';
+import { useApi, useDashboardQuery, useMessages, useModified } from '@/components/hooks';
+import { BOARD_TYPES } from '@/lib/boards';
+import type { Board, BoardParameters } from '@/lib/types';
+
+const createDefaultBoard = (): Partial
=> ({
+ type: BOARD_TYPES.dashboard,
+ name: '',
+ description: '',
+ parameters: {
+ rows: [{ id: uuid(), columns: [{ id: uuid(), component: null }] }],
+ },
+});
+
+function sanitizeBoardParameters(parameters?: BoardParameters): BoardParameters | undefined {
+ if (!parameters?.rows) {
+ return parameters;
+ }
+
+ return {
+ ...parameters,
+ rows: parameters.rows.map(row => ({
+ ...row,
+ columns: row.columns.map(column => {
+ if (column.component && !getComponentDefinition(column.component.type)) {
+ return {
+ ...column,
+ component: null,
+ };
+ }
+
+ return column;
+ }),
+ })),
+ };
+}
+
+export function DashboardProvider({
+ editing = false,
+ children,
+}: {
+ editing?: boolean;
+ children: ReactNode;
+}) {
+ const { data, isFetching, isLoading } = useDashboardQuery();
+ const { post, useMutation } = useApi();
+ const { touch } = useModified();
+ const { toast } = useToast();
+ const { t, labels, messages } = useMessages();
+ const [board, setBoard] = useState>(data ?? createDefaultBoard());
+ const layoutGetterRef = useRef(null);
+
+ const registerLayoutGetter = useCallback((getter: LayoutGetter) => {
+ layoutGetterRef.current = getter;
+ }, []);
+
+ useEffect(() => {
+ if (data) {
+ setBoard({
+ ...data,
+ parameters: sanitizeBoardParameters(data.parameters),
+ });
+ }
+ }, [data]);
+
+ const { mutateAsync, isPending } = useMutation({
+ mutationFn: (boardData: Partial) => {
+ return post('/dashboard', boardData);
+ },
+ });
+
+ const updateBoard = useCallback((data: Partial) => {
+ setBoard(current => ({ ...current, ...data }));
+ }, []);
+
+ const saveBoard = useCallback(async () => {
+ const dashboardName = t(labels.dashboard);
+ const layoutData = layoutGetterRef.current?.();
+ const parameters = sanitizeBoardParameters(
+ layoutData ? { ...board.parameters, ...layoutData } : board.parameters,
+ );
+
+ const result = await mutateAsync({
+ ...board,
+ name: dashboardName,
+ description: '',
+ parameters,
+ });
+
+ toast(t(messages.saved));
+ touch('dashboard');
+ touch('boards');
+
+ return result;
+ }, [board, labels.dashboard, messages.saved, mutateAsync, t, toast, touch]);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/app/(main)/dashboard/DashboardSettingsButton.module.css b/src/app/(main)/dashboard/DashboardSettingsButton.module.css
deleted file mode 100644
index 6e0d19c23..000000000
--- a/src/app/(main)/dashboard/DashboardSettingsButton.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.buttonGroup {
- display: flex;
- place-items: center;
- gap: 10px;
-}
diff --git a/src/app/(main)/dashboard/DashboardSettingsButton.tsx b/src/app/(main)/dashboard/DashboardSettingsButton.tsx
deleted file mode 100644
index 1c473a220..000000000
--- a/src/app/(main)/dashboard/DashboardSettingsButton.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { TooltipPopup, Icon, Text, Flexbox, Button } from 'react-basics';
-import Icons from '@/components/icons';
-import { saveDashboard } from '@/store/dashboard';
-import { useMessages } from '@/components/hooks';
-
-export function DashboardSettingsButton() {
- const { formatMessage, labels } = useMessages();
-
- const handleToggleCharts = () => {
- saveDashboard(state => ({ showCharts: !state.showCharts }));
- };
-
- const handleEdit = () => {
- saveDashboard({ editing: true });
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- {formatMessage(labels.edit)}
-
-
- );
-}
-
-export default DashboardSettingsButton;
diff --git a/src/app/(main)/dashboard/DashboardViewHeader.tsx b/src/app/(main)/dashboard/DashboardViewHeader.tsx
new file mode 100644
index 000000000..e4328fce8
--- /dev/null
+++ b/src/app/(main)/dashboard/DashboardViewHeader.tsx
@@ -0,0 +1,18 @@
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { LayoutDashboard } from '@/components/icons';
+
+export function DashboardViewHeader() {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+ }>Design
+
+
+ );
+}
diff --git a/src/app/(main)/dashboard/DashboardViewPage.tsx b/src/app/(main)/dashboard/DashboardViewPage.tsx
new file mode 100644
index 000000000..d84154ab9
--- /dev/null
+++ b/src/app/(main)/dashboard/DashboardViewPage.tsx
@@ -0,0 +1,49 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { useEffect } from 'react';
+import { BoardControls } from '@/app/(main)/boards/[boardId]/BoardControls';
+import { BoardViewBody } from '@/app/(main)/boards/[boardId]/BoardViewBody';
+import { Empty } from '@/components/common/Empty';
+import { PageBody } from '@/components/common/PageBody';
+import { useBoard, useMessages, useNavigation } from '@/components/hooks';
+import { DashboardProvider } from './DashboardProvider';
+import { DashboardViewHeader } from './DashboardViewHeader';
+
+function DashboardContent() {
+ const { board } = useBoard();
+ const { t, messages } = useMessages();
+ const rows = board?.parameters?.rows ?? [];
+ const hasComponents = rows.some(row => row.columns?.some(column => !!column.component));
+
+ if (!hasComponents) {
+ return ;
+ }
+
+ return ;
+}
+
+export function DashboardViewPage() {
+ const { teamId, router } = useNavigation();
+
+ useEffect(() => {
+ if (teamId) {
+ router.replace('/dashboard');
+ }
+ }, [teamId, router]);
+
+ if (teamId) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/dashboard/edit/page.tsx b/src/app/(main)/dashboard/edit/page.tsx
new file mode 100644
index 000000000..bda115a92
--- /dev/null
+++ b/src/app/(main)/dashboard/edit/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { DashboardEditPage } from '../DashboardEditPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Edit Dashboard',
+};
diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx
index 7a6051100..185f36b7c 100644
--- a/src/app/(main)/dashboard/page.tsx
+++ b/src/app/(main)/dashboard/page.tsx
@@ -1,8 +1,8 @@
-import DashboardPage from './DashboardPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { DashboardViewPage } from './DashboardViewPage';
-export default function () {
- return ;
+export default async function () {
+ return ;
}
export const metadata: Metadata = {
diff --git a/src/app/(main)/layout.module.css b/src/app/(main)/layout.module.css
deleted file mode 100644
index 290c38a27..000000000
--- a/src/app/(main)/layout.module.css
+++ /dev/null
@@ -1,22 +0,0 @@
-.layout {
- display: grid;
- grid-template-rows: max-content 1fr;
- grid-template-columns: 1fr;
- overflow: hidden;
-}
-
-.nav {
- height: 60px;
- width: 100vw;
- grid-column: 1;
- grid-row: 1 / 2;
-}
-
-.body {
- grid-column: 1;
- grid-row: 2 / 3;
- min-height: 0;
- height: calc(100vh - 60px);
- height: calc(100dvh - 60px);
- overflow-y: auto;
-}
diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx
index dd1baec82..98fca4ab4 100644
--- a/src/app/(main)/layout.tsx
+++ b/src/app/(main)/layout.tsx
@@ -1,21 +1,12 @@
-import { Metadata } from 'next';
-import App from './App';
-import NavBar from './NavBar';
-import Page from '@/components/layout/Page';
-import styles from './layout.module.css';
+import type { Metadata } from 'next';
+import { Suspense } from 'react';
+import { App } from './App';
-export default async function ({ children }) {
+export default function ({ children }) {
return (
-
-
-
-
-
-
-
-
+
+ {children}
+
);
}
diff --git a/src/app/(main)/links/LinkAddButton.tsx b/src/app/(main)/links/LinkAddButton.tsx
new file mode 100644
index 000000000..f7f89b81a
--- /dev/null
+++ b/src/app/(main)/links/LinkAddButton.tsx
@@ -0,0 +1,14 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { LinkEditForm } from './LinkEditForm';
+
+export function LinkAddButton({ teamId }: { teamId?: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } label={t(labels.addLink)} variant="primary" width="600px">
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/links/LinkDeleteButton.tsx b/src/app/(main)/links/LinkDeleteButton.tsx
new file mode 100644
index 000000000..f17040741
--- /dev/null
+++ b/src/app/(main)/links/LinkDeleteButton.tsx
@@ -0,0 +1,48 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function LinkDeleteButton({
+ linkId,
+ name,
+ onSave,
+}: {
+ linkId: string;
+ websiteId: string;
+ name: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, isPending, error } = useDeleteQuery(`/links/${linkId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('links');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } title={t(labels.confirm)} variant="quiet" width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={getErrorMessage(error)}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/links/LinkEditButton.tsx b/src/app/(main)/links/LinkEditButton.tsx
new file mode 100644
index 000000000..44598a5db
--- /dev/null
+++ b/src/app/(main)/links/LinkEditButton.tsx
@@ -0,0 +1,23 @@
+import { Icon } from '@umami/react-zen';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useNavigation } from '@/components/hooks';
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+
+export function LinkEditButton({ linkId }: { linkId: string }) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/links/LinkEditForm.tsx b/src/app/(main)/links/LinkEditForm.tsx
new file mode 100644
index 000000000..8b8f476be
--- /dev/null
+++ b/src/app/(main)/links/LinkEditForm.tsx
@@ -0,0 +1,154 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormField,
+ FormSubmitButton,
+ Grid,
+ Icon,
+ Label,
+ Loading,
+ Row,
+ TextField,
+} from '@umami/react-zen';
+import { useState } from 'react';
+import { useConfig, useLinkQuery, useMessages } from '@/components/hooks';
+import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery';
+import { RefreshCw } from '@/components/icons';
+import { LINKS_URL } from '@/lib/constants';
+import { getRandomChars } from '@/lib/generate';
+import { isValidUrl } from '@/lib/url';
+
+const generateId = () => getRandomChars(9);
+
+export function LinkEditForm({
+ linkId,
+ teamId,
+ onSave,
+ onClose,
+}: {
+ linkId?: string;
+ teamId?: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(
+ linkId ? `/links/${linkId}` : '/links',
+ {
+ id: linkId,
+ teamId,
+ },
+ );
+ const config = useConfig();
+ const cloudMode = config?.cloudMode;
+ const linksUrl = config?.linksUrl;
+ const hostUrl = linksUrl || LINKS_URL;
+ const { data, isLoading } = useLinkQuery(linkId);
+ const [defaultSlug] = useState(generateId());
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('links');
+ touch(`link:${linkId}`);
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ const checkUrl = (url: string) => {
+ if (!isValidUrl(url)) {
+ return t(labels.invalidUrl);
+ }
+ return true;
+ };
+
+ if (linkId && isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/links/LinkProvider.tsx b/src/app/(main)/links/LinkProvider.tsx
new file mode 100644
index 000000000..c29e13cf9
--- /dev/null
+++ b/src/app/(main)/links/LinkProvider.tsx
@@ -0,0 +1,21 @@
+'use client';
+import { Loading } from '@umami/react-zen';
+import { createContext, type ReactNode } from 'react';
+import { useLinkQuery } from '@/components/hooks/queries/useLinkQuery';
+import type { Link } from '@/generated/prisma/client';
+
+export const LinkContext = createContext (null);
+
+export function LinkProvider({ linkId, children }: { linkId?: string; children: ReactNode }) {
+ const { data: link, isLoading, isFetching } = useLinkQuery(linkId);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!link) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/links/LinksDataTable.tsx b/src/app/(main)/links/LinksDataTable.tsx
new file mode 100644
index 000000000..87da5984c
--- /dev/null
+++ b/src/app/(main)/links/LinksDataTable.tsx
@@ -0,0 +1,14 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useLinksQuery, useNavigation } from '@/components/hooks';
+import { LinksTable } from './LinksTable';
+
+export function LinksDataTable({ showActions = false }: { showActions?: boolean }) {
+ const { teamId } = useNavigation();
+ const query = useLinksQuery({ teamId });
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/links/LinksPage.tsx b/src/app/(main)/links/LinksPage.tsx
new file mode 100644
index 000000000..a82ce6da3
--- /dev/null
+++ b/src/app/(main)/links/LinksPage.tsx
@@ -0,0 +1,35 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { LinksDataTable } from '@/app/(main)/links/LinksDataTable';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { LinkAddButton } from './LinkAddButton';
+
+export function LinksPage() {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+ const { teamId } = useNavigation();
+ const { data } = useTeamMembersQuery(teamId);
+
+ const showActions =
+ (teamId &&
+ data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
+ .length > 0) ||
+ (!teamId && user.role !== ROLES.viewOnly);
+
+ return (
+
+
+
+ {showActions && }
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/links/LinksTable.tsx b/src/app/(main)/links/LinksTable.tsx
new file mode 100644
index 000000000..76fcc6df0
--- /dev/null
+++ b/src/app/(main)/links/LinksTable.tsx
@@ -0,0 +1,57 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { DateDistance } from '@/components/common/DateDistance';
+import { ExternalLink } from '@/components/common/ExternalLink';
+import { useMessages, useNavigation, useSlug } from '@/components/hooks';
+import { LinkDeleteButton } from './LinkDeleteButton';
+import { LinkEditButton } from './LinkEditButton';
+
+export interface LinksTableProps extends DataTableProps {
+ showActions?: boolean;
+}
+
+export function LinksTable({ showActions, ...props }: LinksTableProps) {
+ const { t, labels } = useMessages();
+ const { websiteId, renderUrl } = useNavigation();
+ const { getSlugUrl } = useSlug('link');
+
+ return (
+
+
+ {({ id, name }: any) => {
+ return {name};
+ }}
+
+
+ {({ slug }: any) => {
+ const url = getSlugUrl(slug);
+ return (
+
+ {url}
+
+ );
+ }}
+
+
+ {({ url }: any) => {
+ return {url} ;
+ }}
+
+
+ {(row: any) => }
+
+ {showActions && (
+
+ {({ id, name }: any) => {
+ return (
+
+
+
+
+ );
+ }}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkControls.tsx b/src/app/(main)/links/[linkId]/LinkControls.tsx
new file mode 100644
index 000000000..1d1147a82
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkControls.tsx
@@ -0,0 +1,32 @@
+import { Column, Row } from '@umami/react-zen';
+import { ExportButton } from '@/components/input/ExportButton';
+import { FilterBar } from '@/components/input/FilterBar';
+import { MonthFilter } from '@/components/input/MonthFilter';
+import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter';
+import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton';
+
+export function LinkControls({
+ linkId: websiteId,
+ allowFilter = true,
+ allowDateFilter = true,
+ allowMonthFilter,
+ allowDownload = false,
+}: {
+ linkId: string;
+ allowFilter?: boolean;
+ allowDateFilter?: boolean;
+ allowMonthFilter?: boolean;
+ allowDownload?: boolean;
+}) {
+ return (
+
+
+ {allowFilter ? :
}
+ {allowDateFilter && }
+ {allowDownload && }
+ {allowMonthFilter && }
+
+ {allowFilter && }
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx
new file mode 100644
index 000000000..ee145963d
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx
@@ -0,0 +1,33 @@
+import { Row } from '@umami/react-zen';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useLink, useMessages, useNavigation, useSlug } from '@/components/hooks';
+import { Edit, ExternalLink, Link } from '@/components/icons';
+
+export function LinkHeader({ showActions = true }: { showActions?: boolean }) {
+ const link = useLink();
+
+ return (
+ }>
+ {showActions && link.id && }
+
+ );
+}
+
+function LinkHeaderActions({ linkId, slug }: { linkId: string; slug: string }) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+ const { getSlugUrl } = useSlug('link');
+
+ return (
+
+
+ } label={t(labels.edit)} />
+
+
+ } label={t(labels.view)} />
+
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx
new file mode 100644
index 000000000..e8c946bfe
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx
@@ -0,0 +1,70 @@
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { formatLongNumber } from '@/lib/format';
+
+export function LinkMetricsBar({
+ linkId,
+}: {
+ linkId: string;
+ showChange?: boolean;
+ compareMode?: boolean;
+}) {
+ const { isAllTime } = useDateRange();
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteStatsQuery({ websiteId: linkId });
+
+ const { pageviews, visitors, visits, comparison } = data || {};
+
+ const metrics = data
+ ? [
+ {
+ value: visitors,
+ label: t(labels.visitors),
+ change: visitors - comparison.visitors,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: visits,
+ label: t(labels.visits),
+ change: visits - comparison.visits,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: pageviews,
+ label: t(labels.views),
+ change: pageviews - comparison.pageviews,
+ formatValue: formatLongNumber,
+ },
+ ]
+ : null;
+
+ return (
+
+
+ {metrics?.map(({ label, value, prev, change, formatValue, reverseColors }: any) => {
+ return (
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkPage.tsx b/src/app/(main)/links/[linkId]/LinkPage.tsx
new file mode 100644
index 000000000..5d10fa82b
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkPage.tsx
@@ -0,0 +1,40 @@
+'use client';
+import { Column, Grid } from '@umami/react-zen';
+import { LinkControls } from '@/app/(main)/links/[linkId]/LinkControls';
+import { LinkHeader } from '@/app/(main)/links/[linkId]/LinkHeader';
+import { LinkMetricsBar } from '@/app/(main)/links/[linkId]/LinkMetricsBar';
+import { LinkPanels } from '@/app/(main)/links/[linkId]/LinkPanels';
+import { LinkProvider } from '@/app/(main)/links/LinkProvider';
+import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal';
+import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart';
+import { PageBody } from '@/components/common/PageBody';
+import { Panel } from '@/components/common/Panel';
+
+const excludedIds = ['path', 'entry', 'exit', 'title', 'language', 'screen', 'event'];
+
+export function LinkPage({
+ linkId,
+ showHeaderActions = true,
+}: {
+ linkId: string;
+ showHeaderActions?: boolean;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkPanels.tsx b/src/app/(main)/links/[linkId]/LinkPanels.tsx
new file mode 100644
index 000000000..6d246618a
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkPanels.tsx
@@ -0,0 +1,83 @@
+import { Grid, Heading, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { GridRow } from '@/components/common/GridRow';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { WorldMap } from '@/components/metrics/WorldMap';
+
+export function LinkPanels({ linkId }: { linkId: string }) {
+ const { t, labels } = useMessages();
+ const tableProps = {
+ websiteId: linkId,
+ limit: 10,
+ allowDownload: false,
+ showMore: true,
+ metric: t(labels.visitors),
+ };
+ const rowProps = { minHeight: 570 };
+
+ return (
+
+
+
+ {t(labels.sources)}
+
+
+ {t(labels.referrers)}
+ {t(labels.channels)}
+
+
+
+
+
+
+
+
+
+
+ {t(labels.environment)}
+
+
+ {t(labels.browsers)}
+ {t(labels.os)}
+ {t(labels.devices)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.location)}
+
+
+ {t(labels.countries)}
+ {t(labels.regions)}
+ {t(labels.cities)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/LinkShareForm.tsx b/src/app/(main)/links/[linkId]/LinkShareForm.tsx
new file mode 100644
index 000000000..3486a71ea
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/LinkShareForm.tsx
@@ -0,0 +1,63 @@
+import { Button, Column, Heading, Row, Text } from '@umami/react-zen';
+import { useState } from 'react';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useLinkSharesQuery, useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { SimpleShareCreateForm } from '@/components/share/SimpleShareCreateForm';
+import { SimpleSharesTable } from '@/components/share/SimpleSharesTable';
+
+export function LinkShareForm({ linkId }: { linkId: string }) {
+ const { data, error, isLoading } = useLinkSharesQuery({ linkId });
+ const shares = data?.data || [];
+ const hasShares = shares.length > 0;
+
+ return (
+
+
+
+ );
+}
+
+function LinkShareFormContent({
+ linkId,
+ hasShares,
+ shares,
+}: {
+ linkId: string;
+ hasShares: boolean;
+ shares: any[];
+}) {
+ const { t, labels, messages } = useMessages();
+ const [isCreating, setIsCreating] = useState(false);
+ const showCreateForm = isCreating;
+
+ return (
+
+
+ {t(labels.share)}
+ {!isCreating && (
+ setIsCreating(true)}>
+ } label={t(labels.add)} />
+
+ )}
+
+ {showCreateForm && (
+ setIsCreating(false)}
+ onCancel={() => setIsCreating(false)}
+ />
+ )}
+ {hasShares && (
+ {t(messages.shareUrl)}
+ )}
+ {!showCreateForm &&
+ (hasShares ? (
+
+ ) : (
+ {t(messages.noDataAvailable)}
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/edit/LinkEditPage.tsx b/src/app/(main)/links/[linkId]/edit/LinkEditPage.tsx
new file mode 100644
index 000000000..6094c3b8e
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/edit/LinkEditPage.tsx
@@ -0,0 +1,46 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import Link from 'next/link';
+import { LinkEditForm } from '@/app/(main)/links/LinkEditForm';
+import { LinkProvider } from '@/app/(main)/links/LinkProvider';
+import { LinkShareForm } from '@/app/(main)/links/[linkId]/LinkShareForm';
+import { Panel } from '@/components/common/Panel';
+import { IconLabel } from '@/components/common/IconLabel';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useLink, useMessages, useNavigation } from '@/components/hooks';
+import { ArrowLeft, Link as LinkIcon } from '@/components/icons';
+
+export function LinkEditPage({ linkId }: { linkId: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function LinkEditHeader() {
+ const link = useLink();
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+ <>
+
+
+ } label={t(labels.link)} />
+
+
+ } />
+ >
+ );
+}
diff --git a/src/app/(main)/links/[linkId]/edit/page.tsx b/src/app/(main)/links/[linkId]/edit/page.tsx
new file mode 100644
index 000000000..1720b696e
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/edit/page.tsx
@@ -0,0 +1,18 @@
+import type { Metadata } from 'next';
+import { getLink } from '@/queries/prisma';
+import { LinkEditPage } from './LinkEditPage';
+
+export default async function ({ params }: { params: Promise<{ linkId: string }> }) {
+ const { linkId } = await params;
+ const link = await getLink(linkId);
+
+ if (!link || link.deletedAt) {
+ return null;
+ }
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Edit Link',
+};
diff --git a/src/app/(main)/links/[linkId]/page.tsx b/src/app/(main)/links/[linkId]/page.tsx
new file mode 100644
index 000000000..3a5f5d7ee
--- /dev/null
+++ b/src/app/(main)/links/[linkId]/page.tsx
@@ -0,0 +1,18 @@
+import type { Metadata } from 'next';
+import { getLink } from '@/queries/prisma';
+import { LinkPage } from './LinkPage';
+
+export default async function ({ params }: { params: Promise<{ linkId: string }> }) {
+ const { linkId } = await params;
+ const link = await getLink(linkId);
+
+ if (!link || link?.deletedAt) {
+ return null;
+ }
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Link',
+};
diff --git a/src/app/(main)/links/page.tsx b/src/app/(main)/links/page.tsx
new file mode 100644
index 000000000..24c9c18e3
--- /dev/null
+++ b/src/app/(main)/links/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { LinksPage } from './LinksPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Links',
+};
diff --git a/src/app/(main)/pixels/PixelAddButton.tsx b/src/app/(main)/pixels/PixelAddButton.tsx
new file mode 100644
index 000000000..be8edd418
--- /dev/null
+++ b/src/app/(main)/pixels/PixelAddButton.tsx
@@ -0,0 +1,14 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { PixelEditForm } from './PixelEditForm';
+
+export function PixelAddButton({ teamId }: { teamId?: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } label={t(labels.addPixel)} variant="primary" width="600px">
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelDeleteButton.tsx b/src/app/(main)/pixels/PixelDeleteButton.tsx
new file mode 100644
index 000000000..68bb896ce
--- /dev/null
+++ b/src/app/(main)/pixels/PixelDeleteButton.tsx
@@ -0,0 +1,47 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function PixelDeleteButton({
+ pixelId,
+ name,
+ onSave,
+}: {
+ pixelId: string;
+ name: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, isPending, error } = useDeleteQuery(`/pixels/${pixelId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('pixels');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } variant="quiet" title={t(labels.confirm)} width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={getErrorMessage(error)}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelEditButton.tsx b/src/app/(main)/pixels/PixelEditButton.tsx
new file mode 100644
index 000000000..8a8f141d6
--- /dev/null
+++ b/src/app/(main)/pixels/PixelEditButton.tsx
@@ -0,0 +1,23 @@
+import { Icon } from '@umami/react-zen';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useNavigation } from '@/components/hooks';
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+
+export function PixelEditButton({ pixelId }: { pixelId: string }) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelEditForm.tsx b/src/app/(main)/pixels/PixelEditForm.tsx
new file mode 100644
index 000000000..aa3061d55
--- /dev/null
+++ b/src/app/(main)/pixels/PixelEditForm.tsx
@@ -0,0 +1,127 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormField,
+ FormSubmitButton,
+ Icon,
+ Label,
+ Loading,
+ Row,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { useConfig, useMessages, usePixelQuery } from '@/components/hooks';
+import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery';
+import { RefreshCw } from '@/components/icons';
+import { PIXELS_URL } from '@/lib/constants';
+import { getRandomChars } from '@/lib/generate';
+
+const generateId = () => getRandomChars(9);
+
+export function PixelEditForm({
+ pixelId,
+ teamId,
+ onSave,
+ onClose,
+}: {
+ pixelId?: string;
+ teamId?: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(
+ pixelId ? `/pixels/${pixelId}` : '/pixels',
+ {
+ id: pixelId,
+ teamId,
+ },
+ );
+ const config = useConfig();
+ const pixelsUrl = config?.pixelsUrl;
+ const hostUrl = pixelsUrl || PIXELS_URL;
+ const { data, isLoading } = usePixelQuery(pixelId);
+ const [slug, setSlug] = useState(generateId());
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('pixels');
+ touch(`pixel:${pixelId}`);
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ const handleSlug = () => {
+ const slug = generateId();
+
+ setSlug(slug);
+
+ return slug;
+ };
+
+ useEffect(() => {
+ if (data) {
+ setSlug(data.slug);
+ }
+ }, [data]);
+
+ if (pixelId && isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelProvider.tsx b/src/app/(main)/pixels/PixelProvider.tsx
new file mode 100644
index 000000000..9e929d8c3
--- /dev/null
+++ b/src/app/(main)/pixels/PixelProvider.tsx
@@ -0,0 +1,21 @@
+'use client';
+import { Loading } from '@umami/react-zen';
+import { createContext, type ReactNode } from 'react';
+import { usePixelQuery } from '@/components/hooks/queries/usePixelQuery';
+import type { Pixel } from '@/generated/prisma/client';
+
+export const PixelContext = createContext(null);
+
+export function PixelProvider({ pixelId, children }: { pixelId?: string; children: ReactNode }) {
+ const { data: pixel, isLoading, isFetching } = usePixelQuery(pixelId);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!pixel) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/pixels/PixelsDataTable.tsx b/src/app/(main)/pixels/PixelsDataTable.tsx
new file mode 100644
index 000000000..6a9a9162d
--- /dev/null
+++ b/src/app/(main)/pixels/PixelsDataTable.tsx
@@ -0,0 +1,14 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useNavigation, usePixelsQuery } from '@/components/hooks';
+import { PixelsTable } from './PixelsTable';
+
+export function PixelsDataTable({ showActions = false }: { showActions?: boolean }) {
+ const { teamId } = useNavigation();
+ const query = usePixelsQuery({ teamId });
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelsPage.tsx b/src/app/(main)/pixels/PixelsPage.tsx
new file mode 100644
index 000000000..76e210061
--- /dev/null
+++ b/src/app/(main)/pixels/PixelsPage.tsx
@@ -0,0 +1,35 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { PixelAddButton } from './PixelAddButton';
+import { PixelsDataTable } from './PixelsDataTable';
+
+export function PixelsPage() {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+ const { teamId } = useNavigation();
+ const { data } = useTeamMembersQuery(teamId);
+
+ const showActions =
+ (teamId &&
+ data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
+ .length > 0) ||
+ (!teamId && user.role !== ROLES.viewOnly);
+
+ return (
+
+
+
+ {showActions && }
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx
new file mode 100644
index 000000000..98ae6a8ac
--- /dev/null
+++ b/src/app/(main)/pixels/PixelsTable.tsx
@@ -0,0 +1,54 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { DateDistance } from '@/components/common/DateDistance';
+import { ExternalLink } from '@/components/common/ExternalLink';
+import { useMessages, useNavigation, useSlug } from '@/components/hooks';
+import { PixelDeleteButton } from './PixelDeleteButton';
+import { PixelEditButton } from './PixelEditButton';
+
+export interface PixelsTableProps extends DataTableProps {
+ showActions?: boolean;
+}
+
+export function PixelsTable({ showActions, ...props }: PixelsTableProps) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+ const { getSlugUrl } = useSlug('pixel');
+
+ return (
+
+
+ {({ id, name }: any) => {
+ return {name};
+ }}
+
+
+ {({ slug }: any) => {
+ const url = getSlugUrl(slug);
+ return (
+
+ {url}
+
+ );
+ }}
+
+
+ {(row: any) => }
+
+ {showActions && (
+
+ {(row: any) => {
+ const { id, name } = row;
+
+ return (
+
+
+
+
+ );
+ }}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelControls.tsx b/src/app/(main)/pixels/[pixelId]/PixelControls.tsx
new file mode 100644
index 000000000..55dcd5764
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelControls.tsx
@@ -0,0 +1,32 @@
+import { Column, Row } from '@umami/react-zen';
+import { ExportButton } from '@/components/input/ExportButton';
+import { FilterBar } from '@/components/input/FilterBar';
+import { MonthFilter } from '@/components/input/MonthFilter';
+import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter';
+import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton';
+
+export function PixelControls({
+ pixelId: websiteId,
+ allowFilter = true,
+ allowDateFilter = true,
+ allowMonthFilter,
+ allowDownload = false,
+}: {
+ pixelId: string;
+ allowFilter?: boolean;
+ allowDateFilter?: boolean;
+ allowMonthFilter?: boolean;
+ allowDownload?: boolean;
+}) {
+ return (
+
+
+ {allowFilter ? :
}
+ {allowDateFilter && }
+ {allowDownload && }
+ {allowMonthFilter && }
+
+ {allowFilter && }
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx
new file mode 100644
index 000000000..5cda3e5da
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx
@@ -0,0 +1,33 @@
+import { Row } from '@umami/react-zen';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation, usePixel, useSlug } from '@/components/hooks';
+import { Edit, ExternalLink, Grid2x2 } from '@/components/icons';
+
+export function PixelHeader({ showActions = true }: { showActions?: boolean }) {
+ const pixel = usePixel();
+
+ return (
+ }>
+ {showActions && pixel.id && }
+
+ );
+}
+
+function PixelHeaderActions({ pixelId, slug }: { pixelId: string; slug: string }) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+ const { getSlugUrl } = useSlug('pixel');
+
+ return (
+
+
+ } label={t(labels.edit)} />
+
+
+ } label={t(labels.view)} />
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx
new file mode 100644
index 000000000..d17bc78c6
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx
@@ -0,0 +1,70 @@
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { formatLongNumber } from '@/lib/format';
+
+export function PixelMetricsBar({
+ pixelId,
+}: {
+ pixelId: string;
+ showChange?: boolean;
+ compareMode?: boolean;
+}) {
+ const { isAllTime } = useDateRange();
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteStatsQuery({ websiteId: pixelId });
+
+ const { pageviews, visitors, visits, comparison } = data || {};
+
+ const metrics = data
+ ? [
+ {
+ value: visitors,
+ label: t(labels.visitors),
+ change: visitors - comparison.visitors,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: visits,
+ label: t(labels.visits),
+ change: visits - comparison.visits,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: pageviews,
+ label: t(labels.views),
+ change: pageviews - comparison.pageviews,
+ formatValue: formatLongNumber,
+ },
+ ]
+ : null;
+
+ return (
+
+
+ {metrics?.map(({ label, value, prev, change, formatValue, reverseColors }: any) => {
+ return (
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelPage.tsx b/src/app/(main)/pixels/[pixelId]/PixelPage.tsx
new file mode 100644
index 000000000..e8d605d24
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelPage.tsx
@@ -0,0 +1,40 @@
+'use client';
+import { Column, Grid } from '@umami/react-zen';
+import { PixelControls } from '@/app/(main)/pixels/[pixelId]/PixelControls';
+import { PixelHeader } from '@/app/(main)/pixels/[pixelId]/PixelHeader';
+import { PixelMetricsBar } from '@/app/(main)/pixels/[pixelId]/PixelMetricsBar';
+import { PixelPanels } from '@/app/(main)/pixels/[pixelId]/PixelPanels';
+import { PixelProvider } from '@/app/(main)/pixels/PixelProvider';
+import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal';
+import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart';
+import { PageBody } from '@/components/common/PageBody';
+import { Panel } from '@/components/common/Panel';
+
+const excludedIds = ['path', 'entry', 'exit', 'title', 'language', 'screen', 'event'];
+
+export function PixelPage({
+ pixelId,
+ showHeaderActions = true,
+}: {
+ pixelId: string;
+ showHeaderActions?: boolean;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx
new file mode 100644
index 000000000..54079a168
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx
@@ -0,0 +1,83 @@
+import { Grid, Heading, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { GridRow } from '@/components/common/GridRow';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { WorldMap } from '@/components/metrics/WorldMap';
+
+export function PixelPanels({ pixelId }: { pixelId: string }) {
+ const { t, labels } = useMessages();
+ const tableProps = {
+ websiteId: pixelId,
+ limit: 10,
+ allowDownload: false,
+ showMore: true,
+ metric: t(labels.visitors),
+ };
+ const rowProps = { minHeight: 570 };
+
+ return (
+
+
+
+ {t(labels.sources)}
+
+
+ {t(labels.referrers)}
+ {t(labels.channels)}
+
+
+
+
+
+
+
+
+
+
+ {t(labels.environment)}
+
+
+ {t(labels.browsers)}
+ {t(labels.os)}
+ {t(labels.devices)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.location)}
+
+
+ {t(labels.countries)}
+ {t(labels.regions)}
+ {t(labels.cities)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/PixelShareForm.tsx b/src/app/(main)/pixels/[pixelId]/PixelShareForm.tsx
new file mode 100644
index 000000000..4c31bbd74
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/PixelShareForm.tsx
@@ -0,0 +1,63 @@
+import { Button, Column, Heading, Row, Text } from '@umami/react-zen';
+import { useState } from 'react';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, usePixelSharesQuery } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { SimpleShareCreateForm } from '@/components/share/SimpleShareCreateForm';
+import { SimpleSharesTable } from '@/components/share/SimpleSharesTable';
+
+export function PixelShareForm({ pixelId }: { pixelId: string }) {
+ const { data, error, isLoading } = usePixelSharesQuery({ pixelId });
+ const shares = data?.data || [];
+ const hasShares = shares.length > 0;
+
+ return (
+
+
+
+ );
+}
+
+function PixelShareFormContent({
+ pixelId,
+ hasShares,
+ shares,
+}: {
+ pixelId: string;
+ hasShares: boolean;
+ shares: any[];
+}) {
+ const { t, labels, messages } = useMessages();
+ const [isCreating, setIsCreating] = useState(false);
+ const showCreateForm = isCreating;
+
+ return (
+
+
+ {t(labels.share)}
+ {!isCreating && (
+ setIsCreating(true)}>
+ } label={t(labels.add)} />
+
+ )}
+
+ {showCreateForm && (
+ setIsCreating(false)}
+ onCancel={() => setIsCreating(false)}
+ />
+ )}
+ {hasShares && (
+ {t(messages.shareUrl)}
+ )}
+ {!showCreateForm &&
+ (hasShares ? (
+
+ ) : (
+ {t(messages.noDataAvailable)}
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/edit/PixelEditPage.tsx b/src/app/(main)/pixels/[pixelId]/edit/PixelEditPage.tsx
new file mode 100644
index 000000000..2de91bfde
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/edit/PixelEditPage.tsx
@@ -0,0 +1,46 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import Link from 'next/link';
+import { PixelEditForm } from '@/app/(main)/pixels/PixelEditForm';
+import { PixelProvider } from '@/app/(main)/pixels/PixelProvider';
+import { PixelShareForm } from '@/app/(main)/pixels/[pixelId]/PixelShareForm';
+import { Panel } from '@/components/common/Panel';
+import { IconLabel } from '@/components/common/IconLabel';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation, usePixel } from '@/components/hooks';
+import { ArrowLeft, Grid2x2 } from '@/components/icons';
+
+export function PixelEditPage({ pixelId }: { pixelId: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function PixelEditHeader() {
+ const pixel = usePixel();
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+ <>
+
+
+ } label={t(labels.pixel)} />
+
+
+ } />
+ >
+ );
+}
diff --git a/src/app/(main)/pixels/[pixelId]/edit/page.tsx b/src/app/(main)/pixels/[pixelId]/edit/page.tsx
new file mode 100644
index 000000000..2e6b1d387
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/edit/page.tsx
@@ -0,0 +1,18 @@
+import type { Metadata } from 'next';
+import { getPixel } from '@/queries/prisma';
+import { PixelEditPage } from './PixelEditPage';
+
+export default async function ({ params }: { params: Promise<{ pixelId: string }> }) {
+ const { pixelId } = await params;
+ const pixel = await getPixel(pixelId);
+
+ if (!pixel || pixel.deletedAt) {
+ return null;
+ }
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Edit Pixel',
+};
diff --git a/src/app/(main)/pixels/[pixelId]/page.tsx b/src/app/(main)/pixels/[pixelId]/page.tsx
new file mode 100644
index 000000000..e174c195c
--- /dev/null
+++ b/src/app/(main)/pixels/[pixelId]/page.tsx
@@ -0,0 +1,18 @@
+import type { Metadata } from 'next';
+import { getPixel } from '@/queries/prisma';
+import { PixelPage } from './PixelPage';
+
+export default async function ({ params }: { params: { pixelId: string } }) {
+ const { pixelId } = await params;
+ const pixel = await getPixel(pixelId);
+
+ if (!pixel || pixel?.deletedAt) {
+ return null;
+ }
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Pixel',
+};
diff --git a/src/app/(main)/pixels/page.tsx b/src/app/(main)/pixels/page.tsx
new file mode 100644
index 000000000..cc240cd24
--- /dev/null
+++ b/src/app/(main)/pixels/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { PixelsPage } from './PixelsPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Pixels',
+};
diff --git a/src/app/(main)/profile/DateRangeSetting.module.css b/src/app/(main)/profile/DateRangeSetting.module.css
deleted file mode 100644
index 9de13efe9..000000000
--- a/src/app/(main)/profile/DateRangeSetting.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.field {
- width: 200px;
-}
diff --git a/src/app/(main)/profile/DateRangeSetting.tsx b/src/app/(main)/profile/DateRangeSetting.tsx
deleted file mode 100644
index 37d2ca437..000000000
--- a/src/app/(main)/profile/DateRangeSetting.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import DateFilter from '@/components/input/DateFilter';
-import { Button, Flexbox } from 'react-basics';
-import { useDateRange, useMessages } from '@/components/hooks';
-import { DEFAULT_DATE_RANGE } from '@/lib/constants';
-import { DateRange } from '@/lib/types';
-import styles from './DateRangeSetting.module.css';
-
-export function DateRangeSetting() {
- const { formatMessage, labels } = useMessages();
- const { dateRange, saveDateRange } = useDateRange();
- const { value } = dateRange;
-
- const handleChange = (value: string | DateRange) => saveDateRange(value);
- const handleReset = () => saveDateRange(DEFAULT_DATE_RANGE);
-
- return (
-
-
- {formatMessage(labels.reset)}
-
- );
-}
-
-export default DateRangeSetting;
diff --git a/src/app/(main)/profile/LanguageSetting.module.css b/src/app/(main)/profile/LanguageSetting.module.css
deleted file mode 100644
index 141445ece..000000000
--- a/src/app/(main)/profile/LanguageSetting.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-div.menu {
- max-height: 300px;
- width: 300px;
-}
diff --git a/src/app/(main)/profile/PasswordChangeButton.tsx b/src/app/(main)/profile/PasswordChangeButton.tsx
deleted file mode 100644
index 63249a2bd..000000000
--- a/src/app/(main)/profile/PasswordChangeButton.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Button, Icon, Text, useToasts, ModalTrigger, Modal } from 'react-basics';
-import PasswordEditForm from '@/app/(main)/profile/PasswordEditForm';
-import Icons from '@/components/icons';
-import { useMessages } from '@/components/hooks';
-
-export function PasswordChangeButton() {
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
-
- const handleSave = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- };
-
- return (
- <>
-
-
-
-
-
- {formatMessage(labels.changePassword)}
-
-
- {close => }
-
-
- >
- );
-}
-
-export default PasswordChangeButton;
diff --git a/src/app/(main)/profile/PasswordEditForm.tsx b/src/app/(main)/profile/PasswordEditForm.tsx
deleted file mode 100644
index c352d5165..000000000
--- a/src/app/(main)/profile/PasswordEditForm.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import { useRef } from 'react';
-import { Form, FormRow, FormInput, FormButtons, PasswordField, Button } from 'react-basics';
-import { useApi, useMessages } from '@/components/hooks';
-
-export function PasswordEditForm({ onSave, onClose }) {
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post('/me/password', data),
- });
- const ref = useRef(null);
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- onSave();
- onClose();
- },
- });
- };
-
- const samePassword = (value: string) => {
- if (value !== ref?.current?.getValues('newPassword')) {
- return formatMessage(messages.noMatchPassword);
- }
- return true;
- };
-
- return (
-
- );
-}
-
-export default PasswordEditForm;
diff --git a/src/app/(main)/profile/ProfileHeader.tsx b/src/app/(main)/profile/ProfileHeader.tsx
deleted file mode 100644
index 05871fba0..000000000
--- a/src/app/(main)/profile/ProfileHeader.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import PageHeader from '@/components/layout/PageHeader';
-import { useMessages } from '@/components/hooks';
-
-export function ProfileHeader() {
- const { formatMessage, labels } = useMessages();
-
- return ;
-}
-
-export default ProfileHeader;
diff --git a/src/app/(main)/profile/ProfilePage.module.css b/src/app/(main)/profile/ProfilePage.module.css
deleted file mode 100644
index 77ab4919e..000000000
--- a/src/app/(main)/profile/ProfilePage.module.css
+++ /dev/null
@@ -1,9 +0,0 @@
-.container {
- margin: 0 auto;
-}
-
-@media screen and (max-width: 768px) {
- .container {
- margin: 0;
- }
-}
diff --git a/src/app/(main)/profile/ProfilePage.tsx b/src/app/(main)/profile/ProfilePage.tsx
deleted file mode 100644
index 428ce2842..000000000
--- a/src/app/(main)/profile/ProfilePage.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-import ProfileHeader from './ProfileHeader';
-import ProfileSettings from './ProfileSettings';
-import styles from './ProfilePage.module.css';
-
-export default function () {
- return (
-
- );
-}
diff --git a/src/app/(main)/profile/ProfileSettings.tsx b/src/app/(main)/profile/ProfileSettings.tsx
deleted file mode 100644
index f9dfe06dc..000000000
--- a/src/app/(main)/profile/ProfileSettings.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { Form, FormRow } from 'react-basics';
-import TimezoneSetting from '@/app/(main)/profile/TimezoneSetting';
-import DateRangeSetting from '@/app/(main)/profile/DateRangeSetting';
-import LanguageSetting from '@/app/(main)/profile/LanguageSetting';
-import ThemeSetting from '@/app/(main)/profile/ThemeSetting';
-import PasswordChangeButton from './PasswordChangeButton';
-import { useLogin, useMessages } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-
-export function ProfileSettings() {
- const { user } = useLogin();
- const { formatMessage, labels } = useMessages();
- const cloudMode = !!process.env.cloudMode;
-
- if (!user) {
- return null;
- }
-
- const { username, role } = user;
-
- const renderRole = (value: string) => {
- if (value === ROLES.user) {
- return formatMessage(labels.user);
- }
- if (value === ROLES.admin) {
- return formatMessage(labels.admin);
- }
- if (value === ROLES.viewOnly) {
- return formatMessage(labels.viewOnly);
- }
-
- return formatMessage(labels.unknown);
- };
-
- return (
-
- );
-}
-
-export default ProfileSettings;
diff --git a/src/app/(main)/profile/ThemeSetting.module.css b/src/app/(main)/profile/ThemeSetting.module.css
deleted file mode 100644
index a9810355f..000000000
--- a/src/app/(main)/profile/ThemeSetting.module.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.buttons {
- display: flex;
- gap: 10px;
-}
-
-.active {
- border: 2px solid var(--primary400);
-}
diff --git a/src/app/(main)/profile/ThemeSetting.tsx b/src/app/(main)/profile/ThemeSetting.tsx
deleted file mode 100644
index 49ea71617..000000000
--- a/src/app/(main)/profile/ThemeSetting.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import classNames from 'classnames';
-import { Button, Icon } from 'react-basics';
-import { useTheme } from '@/components/hooks';
-import Sun from '@/assets/sun.svg';
-import Moon from '@/assets/moon.svg';
-import styles from './ThemeSetting.module.css';
-
-export function ThemeSetting() {
- const { theme, saveTheme } = useTheme();
-
- return (
-
- saveTheme('light')}
- >
-
-
-
-
- saveTheme('dark')}
- >
-
-
-
-
-
- );
-}
-
-export default ThemeSetting;
diff --git a/src/app/(main)/profile/TimezoneSetting.module.css b/src/app/(main)/profile/TimezoneSetting.module.css
deleted file mode 100644
index 316016412..000000000
--- a/src/app/(main)/profile/TimezoneSetting.module.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.dropdown {
- width: 200px;
-}
-
-div.menu {
- max-height: 300px;
- width: 300px;
-}
diff --git a/src/app/(main)/profile/TimezoneSetting.tsx b/src/app/(main)/profile/TimezoneSetting.tsx
deleted file mode 100644
index 56c858136..000000000
--- a/src/app/(main)/profile/TimezoneSetting.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { useState } from 'react';
-import { Dropdown, Item, Button, Flexbox } from 'react-basics';
-import { useTimezone, useMessages } from '@/components/hooks';
-import { getTimezone } from '@/lib/date';
-import styles from './TimezoneSetting.module.css';
-
-const timezones = Intl.supportedValuesOf('timeZone');
-
-export function TimezoneSetting() {
- const [search, setSearch] = useState('');
- const { formatMessage, labels } = useMessages();
- const { timezone, saveTimezone } = useTimezone();
- const options = search
- ? timezones.filter(n => n.toLowerCase().includes(search.toLowerCase()))
- : timezones;
-
- const handleReset = () => saveTimezone(getTimezone());
-
- return (
-
- saveTimezone(value)}
- menuProps={{ className: styles.menu }}
- allowSearch={true}
- onSearch={setSearch}
- >
- {item => - {item}
}
-
- {formatMessage(labels.reset)}
-
- );
-}
-
-export default TimezoneSetting;
diff --git a/src/app/(main)/reports/ReportDeleteButton.tsx b/src/app/(main)/reports/ReportDeleteButton.tsx
deleted file mode 100644
index ca096675f..000000000
--- a/src/app/(main)/reports/ReportDeleteButton.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Button, Icon, Icons, Modal, ModalTrigger, Text } from 'react-basics';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import ConfirmationForm from '@/components/common/ConfirmationForm';
-
-export function ReportDeleteButton({
- reportId,
- reportName,
- onDelete,
-}: {
- reportId: string;
- reportName: string;
- onDelete?: () => void;
-}) {
- const { formatMessage, labels, messages } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, isPending, error } = useMutation({
- mutationFn: reportId => del(`/reports/${reportId}`),
- });
- const { touch } = useModified();
-
- const handleConfirm = (close: () => void) => {
- mutate(reportId as any, {
- onSuccess: () => {
- touch('reports');
- onDelete?.();
- close();
- },
- });
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.delete)}
-
-
- {(close: () => void) => (
- {reportName},
- })}
- isLoading={isPending}
- error={error}
- onConfirm={handleConfirm.bind(null, close)}
- onClose={close}
- buttonLabel={formatMessage(labels.delete)}
- />
- )}
-
-
- );
-}
-
-export default ReportDeleteButton;
diff --git a/src/app/(main)/reports/ReportsDataTable.tsx b/src/app/(main)/reports/ReportsDataTable.tsx
deleted file mode 100644
index 0cc5a96c4..000000000
--- a/src/app/(main)/reports/ReportsDataTable.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { useReports } from '@/components/hooks';
-import ReportsTable from './ReportsTable';
-import DataTable from '@/components/common/DataTable';
-import { ReactNode } from 'react';
-
-export default function ReportsDataTable({
- websiteId,
- teamId,
- children,
-}: {
- websiteId?: string;
- teamId?: string;
- children?: ReactNode;
-}) {
- const queryResult = useReports({ websiteId, teamId });
-
- return (
- children}>
- {({ data }) => }
-
- );
-}
diff --git a/src/app/(main)/reports/ReportsHeader.tsx b/src/app/(main)/reports/ReportsHeader.tsx
deleted file mode 100644
index ff9cb2941..000000000
--- a/src/app/(main)/reports/ReportsHeader.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import PageHeader from '@/components/layout/PageHeader';
-import { Icon, Icons, Text } from 'react-basics';
-import { useLogin, useMessages, useTeamUrl } from '@/components/hooks';
-import LinkButton from '@/components/common/LinkButton';
-import { ROLES } from '@/lib/constants';
-
-export function ReportsHeader() {
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
- const { user } = useLogin();
- const canEdit = user.role !== ROLES.viewOnly;
-
- return (
-
- {canEdit && (
-
-
-
-
- {formatMessage(labels.createReport)}
-
- )}
-
- );
-}
-
-export default ReportsHeader;
diff --git a/src/app/(main)/reports/ReportsPage.tsx b/src/app/(main)/reports/ReportsPage.tsx
deleted file mode 100644
index 64d43c702..000000000
--- a/src/app/(main)/reports/ReportsPage.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-import { Metadata } from 'next';
-import ReportsHeader from './ReportsHeader';
-import ReportsDataTable from './ReportsDataTable';
-import { useTeamUrl } from '@/components/hooks';
-
-export default function ReportsPage() {
- const { teamId } = useTeamUrl();
-
- return (
- <>
-
-
- >
- );
-}
-
-export const metadata: Metadata = {
- title: 'Reports',
-};
diff --git a/src/app/(main)/reports/ReportsTable.tsx b/src/app/(main)/reports/ReportsTable.tsx
deleted file mode 100644
index a891b6d08..000000000
--- a/src/app/(main)/reports/ReportsTable.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { GridColumn, GridTable, Icon, Icons, Text } from 'react-basics';
-import LinkButton from '@/components/common/LinkButton';
-import { useMessages, useLogin, useTeamUrl } from '@/components/hooks';
-import { REPORT_TYPES } from '@/lib/constants';
-import ReportDeleteButton from './ReportDeleteButton';
-
-export function ReportsTable({ data = [], showDomain }: { data: any[]; showDomain?: boolean }) {
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
- const { renderTeamUrl } = useTeamUrl();
-
- return (
-
-
-
-
- {row => {
- return formatMessage(
- labels[Object.keys(REPORT_TYPES).find(key => REPORT_TYPES[key] === row.type)],
- );
- }}
-
- {showDomain && (
-
- {row => row?.website?.domain}
-
- )}
-
- {row => {
- const { id, name, userId, website } = row;
- return (
- <>
- {(user.id === userId || user.id === website?.userId) && (
-
- )}
-
-
-
-
- {formatMessage(labels.view)}
-
- >
- );
- }}
-
-
- );
-}
-
-export default ReportsTable;
diff --git a/src/app/(main)/reports/[reportId]/BaseParameters.module.css b/src/app/(main)/reports/[reportId]/BaseParameters.module.css
deleted file mode 100644
index 4750c7d73..000000000
--- a/src/app/(main)/reports/[reportId]/BaseParameters.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.dropdown div {
- max-height: 300px;
-}
diff --git a/src/app/(main)/reports/[reportId]/BaseParameters.tsx b/src/app/(main)/reports/[reportId]/BaseParameters.tsx
deleted file mode 100644
index 1f4881bec..000000000
--- a/src/app/(main)/reports/[reportId]/BaseParameters.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { useContext } from 'react';
-import { FormRow } from 'react-basics';
-import { parseDateRange } from '@/lib/date';
-import DateFilter from '@/components/input/DateFilter';
-import WebsiteSelect from '@/components/input/WebsiteSelect';
-import { useMessages, useTeamUrl, useWebsite } from '@/components/hooks';
-import { ReportContext } from './Report';
-import styles from './BaseParameters.module.css';
-
-export interface BaseParametersProps {
- showWebsiteSelect?: boolean;
- allowWebsiteSelect?: boolean;
- showDateSelect?: boolean;
- allowDateSelect?: boolean;
-}
-
-export function BaseParameters({
- showWebsiteSelect = true,
- allowWebsiteSelect = true,
- showDateSelect = true,
- allowDateSelect = true,
-}: BaseParametersProps) {
- const { report, updateReport } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { teamId } = useTeamUrl();
- const { parameters } = report || {};
- const { websiteId, dateRange } = parameters || {};
- const { value, startDate, endDate } = dateRange || {};
- const { data: website } = useWebsite(websiteId);
- const { name } = website || {};
-
- const handleWebsiteSelect = (websiteId: string) => {
- updateReport({ websiteId, parameters: { websiteId } });
- };
-
- const handleDateChange = (value: string) => {
- updateReport({ parameters: { dateRange: { ...parseDateRange(value) } } });
- };
-
- return (
- <>
- {showWebsiteSelect && (
-
- {allowWebsiteSelect ? (
-
- ) : (
- name
- )}
-
- )}
- {showDateSelect && (
-
- {allowDateSelect && (
-
- )}
-
- )}
- >
- );
-}
-
-export default BaseParameters;
diff --git a/src/app/(main)/reports/[reportId]/FieldAddForm.tsx b/src/app/(main)/reports/[reportId]/FieldAddForm.tsx
deleted file mode 100644
index 6560a947a..000000000
--- a/src/app/(main)/reports/[reportId]/FieldAddForm.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { useState } from 'react';
-import { createPortal } from 'react-dom';
-import { REPORT_PARAMETERS } from '@/lib/constants';
-import PopupForm from './PopupForm';
-import FieldSelectForm from './FieldSelectForm';
-
-export function FieldAddForm({
- fields = [],
- group,
- onAdd,
- onClose,
-}: {
- fields?: any[];
- group: string;
- onAdd: (group: string, value: string) => void;
- onClose: () => void;
-}) {
- const [selected, setSelected] = useState<{
- name: string;
- type: string;
- value: string;
- }>();
-
- const handleSelect = (value: any) => {
- const { type } = value;
-
- if (group === REPORT_PARAMETERS.groups || type === 'array' || type === 'boolean') {
- value.value = group === REPORT_PARAMETERS.groups ? '' : 'total';
- handleSave(value);
- return;
- }
-
- setSelected(value);
- };
-
- const handleSave = (value: any) => {
- onAdd(group, value);
- onClose();
- };
-
- return createPortal(
-
- {!selected && }
- ,
- document.body,
- );
-}
-
-export default FieldAddForm;
diff --git a/src/app/(main)/reports/[reportId]/FieldAggregateForm.tsx b/src/app/(main)/reports/[reportId]/FieldAggregateForm.tsx
deleted file mode 100644
index 5db0e5801..000000000
--- a/src/app/(main)/reports/[reportId]/FieldAggregateForm.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Form, FormRow, Menu, Item } from 'react-basics';
-import { useMessages } from '@/components/hooks';
-
-export default function FieldAggregateForm({
- name,
- type,
- onSelect,
-}: {
- name: string;
- type: string;
- onSelect: (key: any) => void;
-}) {
- const { formatMessage, labels } = useMessages();
-
- const options = {
- number: [
- { label: formatMessage(labels.sum), value: 'sum' },
- { label: formatMessage(labels.average), value: 'average' },
- { label: formatMessage(labels.min), value: 'min' },
- { label: formatMessage(labels.max), value: 'max' },
- ],
- date: [
- { label: formatMessage(labels.min), value: 'min' },
- { label: formatMessage(labels.max), value: 'max' },
- ],
- string: [
- { label: formatMessage(labels.total), value: 'total' },
- { label: formatMessage(labels.unique), value: 'unique' },
- ],
- uuid: [
- { label: formatMessage(labels.total), value: 'total' },
- { label: formatMessage(labels.unique), value: 'unique' },
- ],
- };
-
- const items = options[type];
-
- const handleSelect = (value: any) => {
- onSelect({ name, type, value });
- };
-
- return (
-
- );
-}
diff --git a/src/app/(main)/reports/[reportId]/FieldFilterEditForm.module.css b/src/app/(main)/reports/[reportId]/FieldFilterEditForm.module.css
deleted file mode 100644
index 43a34438c..000000000
--- a/src/app/(main)/reports/[reportId]/FieldFilterEditForm.module.css
+++ /dev/null
@@ -1,36 +0,0 @@
-.menu {
- position: absolute;
- max-width: 300px;
- max-height: 210px;
-}
-
-.filter {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.dropdown {
- min-width: 200px;
-}
-
-.text {
- min-width: 200px;
-}
-
-.selected {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 8px 16px;
- white-space: nowrap;
- min-width: 200px;
- font-weight: 900;
- background: var(--base100);
- border-radius: var(--border-radius);
- cursor: pointer;
-}
-
-.search {
- position: relative;
-}
diff --git a/src/app/(main)/reports/[reportId]/FieldFilterEditForm.tsx b/src/app/(main)/reports/[reportId]/FieldFilterEditForm.tsx
deleted file mode 100644
index c1f95e804..000000000
--- a/src/app/(main)/reports/[reportId]/FieldFilterEditForm.tsx
+++ /dev/null
@@ -1,221 +0,0 @@
-import { useMemo, useState } from 'react';
-import { useFilters, useFormat, useMessages, useWebsiteValues } from '@/components/hooks';
-import { OPERATORS } from '@/lib/constants';
-import { isEqualsOperator } from '@/lib/params';
-import {
- Button,
- Dropdown,
- Flexbox,
- Form,
- FormRow,
- Icon,
- Icons,
- Item,
- Loading,
- Menu,
- SearchField,
- Text,
- TextField,
-} from 'react-basics';
-import styles from './FieldFilterEditForm.module.css';
-
-export interface FieldFilterFormProps {
- websiteId?: string;
- name: string;
- label?: string;
- type: string;
- startDate: Date;
- endDate: Date;
- operator?: string;
- defaultValue?: string;
- onChange?: (filter: { name: string; type: string; operator: string; value: string }) => void;
- allowFilterSelect?: boolean;
- isNew?: boolean;
-}
-
-export default function FieldFilterEditForm({
- websiteId,
- name,
- label,
- type,
- startDate,
- endDate,
- operator: defaultOperator = 'eq',
- defaultValue = '',
- onChange,
- allowFilterSelect = true,
- isNew,
-}: FieldFilterFormProps) {
- const { formatMessage, labels } = useMessages();
- const [operator, setOperator] = useState(defaultOperator);
- const [value, setValue] = useState(defaultValue);
- const [showMenu, setShowMenu] = useState(false);
- const isEquals = isEqualsOperator(operator);
- const [search, setSearch] = useState('');
- const [selected, setSelected] = useState(isEquals ? value : '');
- const { filters } = useFilters();
- const { formatValue } = useFormat();
- const isDisabled = !operator || (isEquals && !selected) || (!isEquals && !value);
- const {
- data: values = [],
- isLoading,
- refetch,
- } = useWebsiteValues({
- websiteId,
- type: name,
- startDate,
- endDate,
- search,
- });
-
- const filterDropdownItems = (name: string) => {
- const limitedFilters = ['country', 'region', 'city'];
-
- if (limitedFilters.includes(name)) {
- return filters.filter(f => f.type === type && !f.label.match(/contain/gi));
- } else {
- return filters.filter(f => f.type === type);
- }
- };
-
- const formattedValues = useMemo(() => {
- return values.reduce((obj: { [x: string]: string }, { value }: { value: string }) => {
- obj[value] = formatValue(value, name);
-
- return obj;
- }, {});
- }, [formatValue, name, values]);
-
- const filteredValues = useMemo(() => {
- return value
- ? values.filter((n: string | number) =>
- formattedValues[n]?.toLowerCase()?.includes(value.toLowerCase()),
- )
- : values;
- }, [value, formattedValues]);
-
- const renderFilterValue = (value: any) => {
- return filters.find((filter: { value: any }) => filter.value === value)?.label;
- };
-
- const handleAdd = () => {
- onChange({ name, type, operator, value: isEquals ? selected : value });
- };
-
- const handleMenuSelect = (value: string) => {
- setSelected(value);
- setShowMenu(false);
- };
-
- const handleSearch = (value: string) => {
- setSearch(value);
- };
-
- const handleReset = () => {
- setSelected('');
- setValue('');
- setSearch('');
- refetch();
- };
-
- const handleOperatorChange = (value: any) => {
- setOperator(value);
-
- if ([OPERATORS.equals, OPERATORS.notEquals].includes(value)) {
- setValue('');
- } else {
- setSelected('');
- }
- };
-
- const handleBlur = () => {
- window.setTimeout(() => setShowMenu(false), 500);
- };
-
- return (
-
- );
-}
-
-const ResultsMenu = ({ values, type, isLoading, onSelect }) => {
- const { formatValue } = useFormat();
- if (isLoading) {
- return (
-
- -
-
-
-
- );
- }
-
- if (!values?.length) {
- return null;
- }
-
- return (
-
- {values?.map(({ value }) => {
- return - {formatValue(value, type)}
;
- })}
-
- );
-};
diff --git a/src/app/(main)/reports/[reportId]/FieldParameters.tsx b/src/app/(main)/reports/[reportId]/FieldParameters.tsx
deleted file mode 100644
index de80cc69d..000000000
--- a/src/app/(main)/reports/[reportId]/FieldParameters.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { useFields, useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { useContext } from 'react';
-import { Button, FormRow, Icon, Popup, PopupTrigger } from 'react-basics';
-import FieldSelectForm from '../[reportId]/FieldSelectForm';
-import ParameterList from '../[reportId]/ParameterList';
-import PopupForm from '../[reportId]/PopupForm';
-import { ReportContext } from './Report';
-
-export function FieldParameters() {
- const { report, updateReport } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { parameters } = report || {};
- const { fields } = parameters || {};
- const { fields: fieldOptions } = useFields();
-
- const handleAdd = (value: { name: any }) => {
- if (!fields.find(({ name }) => name === value.name)) {
- updateReport({ parameters: { fields: fields.concat(value) } });
- }
- };
-
- const handleRemove = (name: string) => {
- updateReport({ parameters: { fields: fields.filter(f => f.name !== name) } });
- };
-
- const AddButton = () => {
- return (
-
-
-
-
-
-
-
-
- !fields.find(f => f.name === name))}
- onSelect={handleAdd}
- showType={false}
- />
-
-
-
- );
- };
-
- return (
- }>
-
- {fields.map(({ name }) => {
- return (
- handleRemove(name)}>
- {fieldOptions.find(f => f.name === name)?.label}
-
- );
- })}
-
-
- );
-}
-
-export default FieldParameters;
diff --git a/src/app/(main)/reports/[reportId]/FieldSelectForm.module.css b/src/app/(main)/reports/[reportId]/FieldSelectForm.module.css
deleted file mode 100644
index 3a5ed9b87..000000000
--- a/src/app/(main)/reports/[reportId]/FieldSelectForm.module.css
+++ /dev/null
@@ -1,20 +0,0 @@
-.menu {
- width: 360px;
- max-height: 300px;
- overflow: auto;
-}
-
-.item {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- border-radius: var(--border-radius);
-}
-
-.item:hover {
- background: var(--base75);
-}
-
-.type {
- color: var(--font-color300);
-}
diff --git a/src/app/(main)/reports/[reportId]/FieldSelectForm.tsx b/src/app/(main)/reports/[reportId]/FieldSelectForm.tsx
deleted file mode 100644
index f73d59f79..000000000
--- a/src/app/(main)/reports/[reportId]/FieldSelectForm.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Menu, Item, Form, FormRow } from 'react-basics';
-import { useMessages } from '@/components/hooks';
-import styles from './FieldSelectForm.module.css';
-import { Key } from 'react';
-
-export interface FieldSelectFormProps {
- fields?: any[];
- onSelect?: (key: any) => void;
- showType?: boolean;
-}
-
-export default function FieldSelectForm({
- fields = [],
- onSelect,
- showType = true,
-}: FieldSelectFormProps) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
- );
-}
diff --git a/src/app/(main)/reports/[reportId]/FilterParameters.module.css b/src/app/(main)/reports/[reportId]/FilterParameters.module.css
deleted file mode 100644
index 939d0652d..000000000
--- a/src/app/(main)/reports/[reportId]/FilterParameters.module.css
+++ /dev/null
@@ -1,40 +0,0 @@
-.item {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- gap: 10px;
- overflow: hidden;
-}
-
-.label {
- color: var(--base800);
- border: 1px solid var(--base300);
- font-weight: 900;
- padding: 2px 8px;
- border-radius: 5px;
- white-space: nowrap;
-}
-
-.op {
- color: var(--blue900);
- background-color: var(--blue100);
- font-size: 12px;
- font-weight: 900;
- padding: 2px 8px;
- border-radius: 5px;
- text-transform: uppercase;
- white-space: nowrap;
-}
-
-.value {
- color: var(--base900);
- background-color: var(--base100);
- font-weight: 900;
- padding: 2px 8px;
- border-radius: 5px;
- white-space: nowrap;
-}
-
-.edit {
- margin-top: 20px;
-}
diff --git a/src/app/(main)/reports/[reportId]/FilterParameters.tsx b/src/app/(main)/reports/[reportId]/FilterParameters.tsx
deleted file mode 100644
index 538c4ce51..000000000
--- a/src/app/(main)/reports/[reportId]/FilterParameters.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-import { useContext } from 'react';
-import { useMessages, useFormat, useFilters, useFields } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { Button, FormRow, Icon, Popup, PopupTrigger } from 'react-basics';
-import FilterSelectForm from '../[reportId]/FilterSelectForm';
-import ParameterList from '../[reportId]/ParameterList';
-import PopupForm from '../[reportId]/PopupForm';
-import { ReportContext } from './Report';
-import FieldFilterEditForm from '../[reportId]/FieldFilterEditForm';
-import { isSearchOperator } from '@/lib/params';
-import styles from './FilterParameters.module.css';
-
-export function FilterParameters() {
- const { report, updateReport } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { formatValue } = useFormat();
- const { parameters } = report || {};
- const { websiteId, filters, dateRange } = parameters || {};
- const { fields } = useFields();
-
- const handleAdd = (value: { name: any }) => {
- if (!filters.find(({ name }) => name === value.name)) {
- updateReport({ parameters: { filters: filters.concat(value) } });
- }
- };
-
- const handleRemove = (name: string) => {
- updateReport({ parameters: { filters: filters.filter(f => f.name !== name) } });
- };
-
- const handleChange = (close: () => void, filter: { name: any }) => {
- updateReport({
- parameters: {
- filters: filters.map(f => {
- if (filter.name === f.name) {
- return filter;
- }
- return f;
- }),
- },
- });
- close();
- };
-
- const AddButton = () => {
- return (
-
-
-
-
-
-
-
-
- !filters.find(f => f.name === name))}
- startDate={dateRange?.startDate}
- endDate={dateRange?.endDate}
- onChange={handleAdd}
- />
-
-
-
- );
- };
-
- return (
- }>
-
- {filters.map(
- ({ name, operator, value }: { name: string; operator: string; value: string }) => {
- const label = fields.find(f => f.name === name)?.label;
- const isSearch = isSearchOperator(operator);
-
- return (
- handleRemove(name)}>
-
-
- );
- },
- )}
-
-
- );
-}
-
-const FilterParameter = ({
- websiteId,
- name,
- label,
- operator,
- value,
- type = 'string',
- startDate,
- endDate,
- onChange,
-}) => {
- const { operatorLabels } = useFilters();
-
- return (
-
-
-
{label}
-
{operatorLabels[operator]}
-
{value}
-
-
- {(close: any) => (
-
-
-
- )}
-
-
- );
-};
-
-export default FilterParameters;
diff --git a/src/app/(main)/reports/[reportId]/FilterSelectForm.tsx b/src/app/(main)/reports/[reportId]/FilterSelectForm.tsx
deleted file mode 100644
index 77a36c3cc..000000000
--- a/src/app/(main)/reports/[reportId]/FilterSelectForm.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { useState } from 'react';
-import FieldSelectForm from './FieldSelectForm';
-import FieldFilterEditForm from './FieldFilterEditForm';
-
-export interface FilterSelectFormProps {
- websiteId?: string;
- fields: any[];
- startDate?: Date;
- endDate?: Date;
- onChange?: (filter: { name: string; type: string; operator: string; value: string }) => void;
- allowFilterSelect?: boolean;
-}
-
-export default function FilterSelectForm({
- websiteId,
- fields,
- startDate,
- endDate,
- onChange,
- allowFilterSelect,
-}: FilterSelectFormProps) {
- const [field, setField] = useState<{ name: string; label: string; type: string }>();
-
- if (!field) {
- return ;
- }
-
- const { name, label, type } = field;
-
- return (
-
- );
-}
diff --git a/src/app/(main)/reports/[reportId]/ParameterList.module.css b/src/app/(main)/reports/[reportId]/ParameterList.module.css
deleted file mode 100644
index 75860b256..000000000
--- a/src/app/(main)/reports/[reportId]/ParameterList.module.css
+++ /dev/null
@@ -1,29 +0,0 @@
-.list {
- display: flex;
- flex-direction: column;
- gap: 16px;
-}
-
-.item {
- display: flex;
- gap: 12px;
- width: 100%;
- flex-wrap: nowrap;
- padding: 12px;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- box-shadow: 1px 1px 1px var(--base400);
-}
-
-.value {
- display: flex;
- flex-direction: row;
- align-items: center;
- flex-wrap: wrap;
- flex: 1;
-}
-
-.icon,
-.close {
- height: 1.5rem;
-}
diff --git a/src/app/(main)/reports/[reportId]/ParameterList.tsx b/src/app/(main)/reports/[reportId]/ParameterList.tsx
deleted file mode 100644
index 3c0401a04..000000000
--- a/src/app/(main)/reports/[reportId]/ParameterList.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { ReactNode } from 'react';
-import { Icon } from 'react-basics';
-import Icons from '@/components/icons';
-import Empty from '@/components/common/Empty';
-import { useMessages } from '@/components/hooks';
-import styles from './ParameterList.module.css';
-import classNames from 'classnames';
-
-export interface ParameterListProps {
- children?: ReactNode;
-}
-
-export function ParameterList({ children }: ParameterListProps) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
- {!children && }
- {children}
-
- );
-}
-
-const Item = ({
- children,
- className,
- icon,
- onClick,
- onRemove,
-}: {
- children?: ReactNode;
- className?: string;
- icon?: ReactNode;
- onClick?: () => void;
- onRemove?: () => void;
-}) => {
- return (
-
- {icon &&
{icon} }
-
{children}
-
-
-
-
- );
-};
-
-ParameterList.Item = Item;
-
-export default ParameterList;
diff --git a/src/app/(main)/reports/[reportId]/PopupForm.module.css b/src/app/(main)/reports/[reportId]/PopupForm.module.css
deleted file mode 100644
index 5d069dd46..000000000
--- a/src/app/(main)/reports/[reportId]/PopupForm.module.css
+++ /dev/null
@@ -1,9 +0,0 @@
-.form {
- background: var(--base50);
- min-width: 300px;
- padding: 20px;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.1);
- z-index: 1000;
-}
diff --git a/src/app/(main)/reports/[reportId]/PopupForm.tsx b/src/app/(main)/reports/[reportId]/PopupForm.tsx
deleted file mode 100644
index f26661991..000000000
--- a/src/app/(main)/reports/[reportId]/PopupForm.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { CSSProperties, ReactNode } from 'react';
-import classNames from 'classnames';
-import styles from './PopupForm.module.css';
-
-export function PopupForm({
- className,
- style,
- children,
-}: {
- className?: string;
- style?: CSSProperties;
- children: ReactNode;
-}) {
- return (
- e.stopPropagation()}
- >
- {children}
-
- );
-}
-
-export default PopupForm;
diff --git a/src/app/(main)/reports/[reportId]/Report.module.css b/src/app/(main)/reports/[reportId]/Report.module.css
deleted file mode 100644
index 6aa6a9b32..000000000
--- a/src/app/(main)/reports/[reportId]/Report.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.container {
- display: grid;
- grid-template-rows: max-content 1fr;
- grid-template-columns: max-content 1fr;
- margin-bottom: 60px;
- height: 90vh;
-}
diff --git a/src/app/(main)/reports/[reportId]/Report.tsx b/src/app/(main)/reports/[reportId]/Report.tsx
deleted file mode 100644
index 1aed007cf..000000000
--- a/src/app/(main)/reports/[reportId]/Report.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { createContext, ReactNode } from 'react';
-import { Loading } from 'react-basics';
-import classNames from 'classnames';
-import { useReport } from '@/components/hooks';
-import styles from './Report.module.css';
-
-export const ReportContext = createContext(null);
-
-export function Report({
- reportId,
- defaultParameters,
- children,
- className,
-}: {
- reportId: string;
- defaultParameters: { type: string; parameters: { [key: string]: any } };
- children: ReactNode;
- className?: string;
-}) {
- const report = useReport(reportId, defaultParameters);
-
- if (!report) {
- return reportId ? : null;
- }
-
- return (
-
- {children}
-
- );
-}
-
-export default Report;
diff --git a/src/app/(main)/reports/[reportId]/ReportBody.module.css b/src/app/(main)/reports/[reportId]/ReportBody.module.css
deleted file mode 100644
index 9af1070ab..000000000
--- a/src/app/(main)/reports/[reportId]/ReportBody.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.body {
- padding-inline-start: 20px;
- grid-row: 2 / 3;
- grid-column: 2 / 3;
-}
diff --git a/src/app/(main)/reports/[reportId]/ReportBody.tsx b/src/app/(main)/reports/[reportId]/ReportBody.tsx
deleted file mode 100644
index fe2f8c91b..000000000
--- a/src/app/(main)/reports/[reportId]/ReportBody.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { useContext } from 'react';
-import { ReportContext } from './Report';
-import styles from './ReportBody.module.css';
-import { DownloadButton } from '@/components/input/DownloadButton';
-
-export function ReportBody({ children }) {
- const { report } = useContext(ReportContext);
-
- if (!report) {
- return null;
- }
-
- return (
-
- {report.type !== 'revenue' && report.type !== 'attribution' && (
-
- )}
- {children}
-
- );
-}
-
-export default ReportBody;
diff --git a/src/app/(main)/reports/[reportId]/ReportHeader.module.css b/src/app/(main)/reports/[reportId]/ReportHeader.module.css
deleted file mode 100644
index 5ff261040..000000000
--- a/src/app/(main)/reports/[reportId]/ReportHeader.module.css
+++ /dev/null
@@ -1,36 +0,0 @@
-.header {
- display: grid;
- grid-template-columns: 1fr min-content;
- align-items: center;
- grid-row: 1 / 2;
- grid-column: 1 / 3;
- margin: 20px 0 40px 0;
-}
-
-.title {
- display: flex;
- flex-direction: row;
- align-items: center;
- font-size: 24px;
- font-weight: 700;
- gap: 20px;
- height: 60px;
-}
-
-.type {
- font-size: 11px;
- font-weight: 700;
- text-transform: uppercase;
- color: var(--base600);
-}
-
-.description {
- color: var(--font-color300);
- max-width: 500px;
- height: 30px;
-}
-
-.actions {
- display: flex;
- align-items: center;
-}
diff --git a/src/app/(main)/reports/[reportId]/ReportHeader.tsx b/src/app/(main)/reports/[reportId]/ReportHeader.tsx
deleted file mode 100644
index 816a2df33..000000000
--- a/src/app/(main)/reports/[reportId]/ReportHeader.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import { useContext } from 'react';
-import { Icon, LoadingButton, InlineEditField, useToasts } from 'react-basics';
-import { useMessages, useApi, useNavigation, useTeamUrl } from '@/components/hooks';
-import { ReportContext } from './Report';
-import styles from './ReportHeader.module.css';
-import { REPORT_TYPES } from '@/lib/constants';
-import Breadcrumb from '@/components/common/Breadcrumb';
-
-export function ReportHeader({ icon }) {
- const { report, updateReport } = useContext(ReportContext);
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
- const { router } = useNavigation();
- const { renderTeamUrl } = useTeamUrl();
-
- const { post, useMutation } = useApi();
- const { mutate: create, isPending: isCreating } = useMutation({
- mutationFn: (data: any) => post(`/reports`, data),
- });
- const { mutate: update, isPending: isUpdating } = useMutation({
- mutationFn: (data: any) => post(`/reports/${data.id}`, data),
- });
-
- const { name, description, parameters } = report || {};
- const { websiteId, dateRange } = parameters || {};
- const defaultName = formatMessage(labels.untitled);
-
- const handleSave = async () => {
- if (!report.id) {
- create(report, {
- onSuccess: async ({ id }) => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- router.push(renderTeamUrl(`/reports/${id}`));
- },
- });
- } else {
- update(report, {
- onSuccess: async () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- },
- });
- }
- };
-
- const handleNameChange = (name: string) => {
- updateReport({ name: name || defaultName });
- };
-
- const handleDescriptionChange = (description: string) => {
- updateReport({ description });
- };
-
- if (!report) {
- return null;
- }
-
- return (
-
-
-
- REPORT_TYPES[key] === report?.type)],
- ),
- },
- ]}
- />
-
-
- {icon}
-
-
-
-
-
-
-
-
- {formatMessage(labels.save)}
-
-
-
- );
-}
-
-export default ReportHeader;
diff --git a/src/app/(main)/reports/[reportId]/ReportMenu.module.css b/src/app/(main)/reports/[reportId]/ReportMenu.module.css
deleted file mode 100644
index 21368411b..000000000
--- a/src/app/(main)/reports/[reportId]/ReportMenu.module.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.menu {
- position: relative;
- width: 300px;
- padding-top: 20px;
- padding-inline-end: 20px;
- border-inline-end: 1px solid var(--base300);
- grid-row: 2 / 3;
- grid-column: 1 / 2;
-}
-
-.button {
- position: absolute;
- top: 0;
- right: 0;
- display: flex;
- place-content: center;
- border: 1px solid var(--base400);
- border-right: 0;
- width: 30px;
- padding: 5px;
- cursor: pointer;
- border-radius: 4px 0 0 4px;
- z-index: 1;
-}
-
-.button:hover {
- background: var(--base75);
-}
-
-.menu.collapsed {
- width: 0;
- padding: 0;
-}
-
-.menu.collapsed .button {
- right: 0;
- border-radius: 4px 0 0 4px;
-}
diff --git a/src/app/(main)/reports/[reportId]/ReportMenu.tsx b/src/app/(main)/reports/[reportId]/ReportMenu.tsx
deleted file mode 100644
index 5cca5640a..000000000
--- a/src/app/(main)/reports/[reportId]/ReportMenu.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { useContext, useState } from 'react';
-import { ReportContext } from './Report';
-import styles from './ReportMenu.module.css';
-import { Icon, Icons } from 'react-basics';
-import classNames from 'classnames';
-
-export function ReportMenu({ children }) {
- const [collapsed, setCollapsed] = useState(false);
- const { report } = useContext(ReportContext);
-
- if (!report) {
- return null;
- }
-
- return (
-
-
setCollapsed(!collapsed)}>
-
-
-
-
- {!collapsed && children}
-
- );
-}
-
-export default ReportMenu;
diff --git a/src/app/(main)/reports/[reportId]/ReportPage.tsx b/src/app/(main)/reports/[reportId]/ReportPage.tsx
deleted file mode 100644
index aea5c0de5..000000000
--- a/src/app/(main)/reports/[reportId]/ReportPage.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-'use client';
-import { useReport } from '@/components/hooks';
-import EventDataReport from '../event-data/EventDataReport';
-import FunnelReport from '../funnel/FunnelReport';
-import GoalReport from '../goals/GoalsReport';
-import InsightsReport from '../insights/InsightsReport';
-import JourneyReport from '../journey/JourneyReport';
-import RetentionReport from '../retention/RetentionReport';
-import RevenueReport from '../revenue/RevenueReport';
-import UTMReport from '../utm/UTMReport';
-import AttributionReport from '../attribution/AttributionReport';
-
-const reports = {
- funnel: FunnelReport,
- 'event-data': EventDataReport,
- insights: InsightsReport,
- retention: RetentionReport,
- utm: UTMReport,
- goals: GoalReport,
- journey: JourneyReport,
- revenue: RevenueReport,
- attribution: AttributionReport,
-};
-
-export default function ReportPage({ reportId }: { reportId: string }) {
- const { report } = useReport(reportId);
-
- if (!report) {
- return null;
- }
-
- const ReportComponent = reports[report.type];
-
- if (!ReportComponent) {
- return null;
- }
-
- return ;
-}
diff --git a/src/app/(main)/reports/[reportId]/page.tsx b/src/app/(main)/reports/[reportId]/page.tsx
deleted file mode 100644
index 85a97d1ca..000000000
--- a/src/app/(main)/reports/[reportId]/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Metadata } from 'next';
-import ReportPage from './ReportPage';
-
-export default async function ({ params }: { params: { reportId: string } }) {
- const { reportId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Reports',
-};
diff --git a/src/app/(main)/reports/attribution/AttributionParameters.module.css b/src/app/(main)/reports/attribution/AttributionParameters.module.css
deleted file mode 100644
index 0f27d515f..000000000
--- a/src/app/(main)/reports/attribution/AttributionParameters.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.item {
- display: flex;
- align-items: center;
- gap: 10px;
- width: 100%;
-}
-
-.value {
- display: flex;
- align-self: center;
- gap: 20px;
-}
diff --git a/src/app/(main)/reports/attribution/AttributionParameters.tsx b/src/app/(main)/reports/attribution/AttributionParameters.tsx
deleted file mode 100644
index 2763273d0..000000000
--- a/src/app/(main)/reports/attribution/AttributionParameters.tsx
+++ /dev/null
@@ -1,188 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { useContext, useState } from 'react';
-import {
- Button,
- Dropdown,
- Form,
- FormButtons,
- FormInput,
- FormRow,
- Icon,
- Item,
- Popup,
- PopupTrigger,
- SubmitButton,
- Toggle,
-} from 'react-basics';
-import BaseParameters from '../[reportId]/BaseParameters';
-import ParameterList from '../[reportId]/ParameterList';
-import PopupForm from '../[reportId]/PopupForm';
-import { ReportContext } from '../[reportId]/Report';
-import FunnelStepAddForm from '../funnel/FunnelStepAddForm';
-import styles from './AttributionParameters.module.css';
-import AttributionStepAddForm from './AttributionStepAddForm';
-import useRevenueValues from '@/components/hooks/queries/useRevenueValues';
-
-export function AttributionParameters() {
- const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { id, parameters } = report || {};
- const { websiteId, dateRange, steps } = parameters || {};
- const queryEnabled = websiteId && dateRange && steps.length > 0;
- const [model, setModel] = useState('');
- const [revenueMode, setRevenueMode] = useState(false);
-
- const { data: currencyValues = [] } = useRevenueValues(
- websiteId,
- dateRange?.startDate,
- dateRange?.endDate,
- );
-
- const handleSubmit = (data: any, e: any) => {
- if (revenueMode === false) {
- delete data.currency;
- }
-
- e.stopPropagation();
- e.preventDefault();
- runReport(data);
- };
-
- const handleCheck = () => {
- setRevenueMode(!revenueMode);
- };
-
- const handleAddStep = (step: { type: string; value: string }) => {
- if (step.type === 'url') {
- setRevenueMode(false);
- }
- updateReport({ parameters: { steps: parameters.steps.concat(step) } });
- };
-
- const handleUpdateStep = (
- close: () => void,
- index: number,
- step: { type: string; value: string },
- ) => {
- if (step.type === 'url') {
- setRevenueMode(false);
- }
- const steps = [...parameters.steps];
- steps[index] = step;
- updateReport({ parameters: { steps } });
- close();
- };
-
- const handleRemoveStep = (index: number) => {
- const steps = [...parameters.steps];
- delete steps[index];
- updateReport({ parameters: { steps: steps.filter(n => n) } });
- };
-
- const AddStepButton = () => {
- return (
- 0}>
- 0}>
-
-
-
-
-
-
-
-
-
-
- );
- };
-
- const items = [
- { label: 'First-Click', value: 'firstClick' },
- { label: 'Last-Click', value: 'lastClick' },
- ];
-
- const renderModelValue = (value: any) => {
- return items.find(item => item.value === value)?.label;
- };
-
- const onModelChange = (value: any) => {
- setModel(value);
- updateReport({ parameters: { model } });
- };
-
- return (
-
- );
-}
-
-export default AttributionParameters;
diff --git a/src/app/(main)/reports/attribution/AttributionReport.tsx b/src/app/(main)/reports/attribution/AttributionReport.tsx
deleted file mode 100644
index c33a4195d..000000000
--- a/src/app/(main)/reports/attribution/AttributionReport.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import Money from '@/assets/money.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-import Report from '../[reportId]/Report';
-import ReportBody from '../[reportId]/ReportBody';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import AttributionParameters from './AttributionParameters';
-import AttributionView from './AttributionView';
-
-const defaultParameters = {
- type: REPORT_TYPES.attribution,
- parameters: { model: 'firstClick', steps: [] },
-};
-
-export default function AttributionReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/attribution/AttributionReportPage.tsx b/src/app/(main)/reports/attribution/AttributionReportPage.tsx
deleted file mode 100644
index ed7307046..000000000
--- a/src/app/(main)/reports/attribution/AttributionReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import AttributionReport from './AttributionReport';
-
-export default function AttributionReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/attribution/AttributionStepAddForm.module.css b/src/app/(main)/reports/attribution/AttributionStepAddForm.module.css
deleted file mode 100644
index a254ff088..000000000
--- a/src/app/(main)/reports/attribution/AttributionStepAddForm.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.dropdown {
- width: 140px;
-}
-
-.input {
- width: 200px;
-}
diff --git a/src/app/(main)/reports/attribution/AttributionStepAddForm.tsx b/src/app/(main)/reports/attribution/AttributionStepAddForm.tsx
deleted file mode 100644
index d36b05914..000000000
--- a/src/app/(main)/reports/attribution/AttributionStepAddForm.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import { useState } from 'react';
-import { useMessages } from '@/components/hooks';
-import { Button, FormRow, TextField, Flexbox, Dropdown, Item } from 'react-basics';
-import styles from './AttributionStepAddForm.module.css';
-
-export interface AttributionStepAddFormProps {
- type?: string;
- value?: string;
- onChange?: (step: { type: string; value: string }) => void;
-}
-
-export function AttributionStepAddForm({
- type: defaultType = 'url',
- value: defaultValue = '',
- onChange,
-}: AttributionStepAddFormProps) {
- const [type, setType] = useState(defaultType);
- const [value, setValue] = useState(defaultValue);
- const { formatMessage, labels } = useMessages();
- const items = [
- { label: formatMessage(labels.url), value: 'url' },
- { label: formatMessage(labels.event), value: 'event' },
- ];
- const isDisabled = !type || !value;
-
- const handleSave = () => {
- onChange({ type, value });
- setValue('');
- };
-
- const handleChange = e => {
- setValue(e.target.value);
- };
-
- const handleKeyDown = e => {
- if (e.key === 'Enter') {
- e.stopPropagation();
- handleSave();
- }
- };
-
- const renderTypeValue = (value: any) => {
- return items.find(item => item.value === value)?.label;
- };
-
- return (
-
-
-
- setType(value)}
- >
- {({ value, label }) => {
- return - {label}
;
- }}
-
-
-
-
-
-
- {formatMessage(defaultValue ? labels.update : labels.add)}
-
-
-
- );
-}
-
-export default AttributionStepAddForm;
diff --git a/src/app/(main)/reports/attribution/AttributionView.module.css b/src/app/(main)/reports/attribution/AttributionView.module.css
deleted file mode 100644
index f242b1d91..000000000
--- a/src/app/(main)/reports/attribution/AttributionView.module.css
+++ /dev/null
@@ -1,20 +0,0 @@
-.container {
- display: grid;
- gap: 20px;
- margin-bottom: 40px;
-}
-
-.title {
- font-size: 24px;
- line-height: 36px;
- font-weight: 700;
-}
-
-.row {
- display: grid;
- grid-template-columns: 50% 50%;
- gap: 20px;
- border-top: 1px solid var(--base300);
- padding-top: 30px;
- margin-bottom: 30px;
-}
diff --git a/src/app/(main)/reports/attribution/AttributionView.tsx b/src/app/(main)/reports/attribution/AttributionView.tsx
deleted file mode 100644
index e5b224517..000000000
--- a/src/app/(main)/reports/attribution/AttributionView.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-import PieChart from '@/components/charts/PieChart';
-import { useMessages } from '@/components/hooks';
-import { Grid, GridRow } from '@/components/layout/Grid';
-import ListTable from '@/components/metrics/ListTable';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
-import { CHART_COLORS } from '@/lib/constants';
-import { formatLongNumber } from '@/lib/format';
-import { useContext } from 'react';
-import { ReportContext } from '../[reportId]/Report';
-import styles from './AttributionView.module.css';
-
-export interface AttributionViewProps {
- isLoading?: boolean;
-}
-
-export function AttributionView({ isLoading }: AttributionViewProps) {
- const { formatMessage, labels } = useMessages();
- const { report } = useContext(ReportContext);
- const {
- data,
- parameters: { currency },
- } = report || {};
- const ATTRIBUTION_PARAMS = [
- { value: 'referrer', label: formatMessage(labels.referrers) },
- { value: 'paidAds', label: formatMessage(labels.paidAds) },
- ];
-
- if (!data) {
- return null;
- }
-
- const { pageviews, visitors, visits } = data.total;
-
- const metrics = data
- ? [
- {
- value: pageviews,
- label: formatMessage(labels.views),
- formatValue: formatLongNumber,
- },
- {
- value: visits,
- label: formatMessage(labels.visits),
- formatValue: formatLongNumber,
- },
- {
- value: visitors,
- label: formatMessage(labels.visitors),
- formatValue: formatLongNumber,
- },
- ]
- : [];
-
- function UTMTable(UTMTableProps: { data: any; title: string; utm: string }) {
- const { data, title, utm } = UTMTableProps;
- const total = data[utm].reduce((sum, { value }) => {
- return +sum + +value;
- }, 0);
-
- return (
- ({
- x: name,
- y: Number(value),
- z: (value / total) * 100,
- }))}
- />
- );
- }
-
- return (
-
-
- {metrics?.map(({ label, value, formatValue }) => {
- return ;
- })}
-
- {ATTRIBUTION_PARAMS.map(({ value, label }) => {
- const items = data[value];
- const total = items.reduce((sum, { value }) => {
- return +sum + +value;
- }, 0);
-
- const chartData = {
- labels: items.map(({ name }) => name),
- datasets: [
- {
- data: items.map(({ value }) => value),
- backgroundColor: CHART_COLORS,
- borderWidth: 0,
- },
- ],
- };
-
- return (
-
-
-
{label}
-
({
- x: name,
- y: Number(value),
- z: (value / total) * 100,
- }))}
- />
-
-
-
- );
- })}
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default AttributionView;
diff --git a/src/app/(main)/reports/attribution/page.tsx b/src/app/(main)/reports/attribution/page.tsx
deleted file mode 100644
index 9efd62201..000000000
--- a/src/app/(main)/reports/attribution/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import AttributionReportPage from './AttributionReportPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Attribution Report',
-};
diff --git a/src/app/(main)/reports/create/ReportCreatePage.tsx b/src/app/(main)/reports/create/ReportCreatePage.tsx
deleted file mode 100644
index ff3a761a2..000000000
--- a/src/app/(main)/reports/create/ReportCreatePage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import ReportTemplates from './ReportTemplates';
-
-export default function ReportCreatePage() {
- return ;
-}
diff --git a/src/app/(main)/reports/create/ReportTemplates.module.css b/src/app/(main)/reports/create/ReportTemplates.module.css
deleted file mode 100644
index 0cdcb8351..000000000
--- a/src/app/(main)/reports/create/ReportTemplates.module.css
+++ /dev/null
@@ -1,32 +0,0 @@
-.reports {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));
- gap: 20px;
-}
-
-.report {
- display: flex;
- flex-direction: column;
- gap: 20px;
- padding: 20px;
- border: 1px solid var(--base500);
- border-radius: var(--border-radius);
-}
-
-.title {
- display: flex;
- gap: 10px;
- align-items: center;
- font-size: var(--font-size-lg);
- font-weight: 700;
-}
-
-.description {
- flex: 1;
-}
-
-.buttons {
- display: flex;
- align-items: center;
- justify-content: center;
-}
diff --git a/src/app/(main)/reports/create/ReportTemplates.tsx b/src/app/(main)/reports/create/ReportTemplates.tsx
deleted file mode 100644
index 292b7322e..000000000
--- a/src/app/(main)/reports/create/ReportTemplates.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-import Funnel from '@/assets/funnel.svg';
-import Money from '@/assets/money.svg';
-import Lightbulb from '@/assets/lightbulb.svg';
-import Magnet from '@/assets/magnet.svg';
-import Path from '@/assets/path.svg';
-import Tag from '@/assets/tag.svg';
-import Target from '@/assets/target.svg';
-import Network from '@/assets/network.svg';
-import { useMessages, useTeamUrl } from '@/components/hooks';
-import PageHeader from '@/components/layout/PageHeader';
-import Link from 'next/link';
-import { Button, Icon, Icons, Text } from 'react-basics';
-import styles from './ReportTemplates.module.css';
-
-export function ReportTemplates({ showHeader = true }: { showHeader?: boolean }) {
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
-
- const reports = [
- {
- title: formatMessage(labels.insights),
- description: formatMessage(labels.insightsDescription),
- url: renderTeamUrl('/reports/insights'),
- icon: ,
- },
- {
- title: formatMessage(labels.funnel),
- description: formatMessage(labels.funnelDescription),
- url: renderTeamUrl('/reports/funnel'),
- icon: ,
- },
- {
- title: formatMessage(labels.retention),
- description: formatMessage(labels.retentionDescription),
- url: renderTeamUrl('/reports/retention'),
- icon: ,
- },
- {
- title: formatMessage(labels.utm),
- description: formatMessage(labels.utmDescription),
- url: renderTeamUrl('/reports/utm'),
- icon: ,
- },
- {
- title: formatMessage(labels.goals),
- description: formatMessage(labels.goalsDescription),
- url: renderTeamUrl('/reports/goals'),
- icon: ,
- },
- {
- title: formatMessage(labels.journey),
- description: formatMessage(labels.journeyDescription),
- url: renderTeamUrl('/reports/journey'),
- icon: ,
- },
- {
- title: formatMessage(labels.revenue),
- description: formatMessage(labels.revenueDescription),
- url: renderTeamUrl('/reports/revenue'),
- icon: ,
- },
- {
- title: formatMessage(labels.attribution),
- description: formatMessage(labels.attributionDescription),
- url: renderTeamUrl('/reports/attribution'),
- icon: ,
- },
- ];
-
- return (
- <>
- {showHeader && }
-
- {reports.map(({ title, description, url, icon }) => {
- return (
-
- );
- })}
-
- >
- );
-}
-
-function ReportItem({ title, description, url, icon }) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
- {icon}
- {title}
-
-
{description}
-
-
-
-
-
-
- {formatMessage(labels.create)}
-
-
-
-
- );
-}
-
-export default ReportTemplates;
diff --git a/src/app/(main)/reports/create/page.tsx b/src/app/(main)/reports/create/page.tsx
deleted file mode 100644
index c2b1c18c5..000000000
--- a/src/app/(main)/reports/create/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import ReportCreatePage from './ReportCreatePage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Create Report',
-};
diff --git a/src/app/(main)/reports/event-data/EventDataParameters.module.css b/src/app/(main)/reports/event-data/EventDataParameters.module.css
deleted file mode 100644
index 06b624149..000000000
--- a/src/app/(main)/reports/event-data/EventDataParameters.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.parameter {
- display: flex;
- gap: 10px;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- min-width: 0;
-}
-
-.op {
- font-weight: bold;
-}
diff --git a/src/app/(main)/reports/event-data/EventDataParameters.tsx b/src/app/(main)/reports/event-data/EventDataParameters.tsx
deleted file mode 100644
index 9e931cf5a..000000000
--- a/src/app/(main)/reports/event-data/EventDataParameters.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import { useContext } from 'react';
-import { Form, FormRow, FormButtons, SubmitButton, PopupTrigger, Icon, Popup } from 'react-basics';
-import Empty from '@/components/common/Empty';
-import Icons from '@/components/icons';
-import { useApi, useMessages } from '@/components/hooks';
-import { DATA_TYPES, REPORT_PARAMETERS } from '@/lib/constants';
-import { ReportContext } from '../[reportId]/Report';
-import FieldAddForm from '../[reportId]/FieldAddForm';
-import ParameterList from '../[reportId]/ParameterList';
-import BaseParameters from '../[reportId]/BaseParameters';
-import styles from './EventDataParameters.module.css';
-
-function useFields(websiteId, startDate, endDate) {
- const { get, useQuery } = useApi();
- const { data, error, isLoading } = useQuery({
- queryKey: ['fields', websiteId, startDate, endDate],
- queryFn: () =>
- get('/reports/event-data', {
- websiteId,
- startAt: +startDate,
- endAt: +endDate,
- }),
- enabled: !!(websiteId && startDate && endDate),
- });
-
- return { data, error, isLoading };
-}
-
-export function EventDataParameters() {
- const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels, messages } = useMessages();
- const { id, parameters } = report || {};
- const { websiteId, dateRange, fields, filters, groups } = parameters || {};
- const { startDate, endDate } = dateRange || {};
- const queryEnabled = websiteId && dateRange && fields?.length;
- const { data, error } = useFields(websiteId, startDate, endDate);
- const parametersSelected = websiteId && startDate && endDate;
- const hasData = data?.length !== 0;
-
- const parameterGroups = [
- { label: formatMessage(labels.fields), group: REPORT_PARAMETERS.fields },
- { label: formatMessage(labels.filters), group: REPORT_PARAMETERS.filters },
- ];
-
- const parameterData = {
- fields,
- filters,
- groups,
- };
-
- const handleSubmit = (values: any) => {
- runReport(values);
- };
-
- const handleAdd = (group: string, value: any) => {
- const data = parameterData[group];
-
- if (!data.find(({ name }) => name === value?.name)) {
- updateReport({ parameters: { [group]: data.concat(value) } });
- }
- };
-
- const handleRemove = (group: string) => {
- const data = [...parameterData[group]];
- updateReport({ parameters: { [group]: data.filter(({ name }) => name !== group) } });
- };
-
- const AddButton = ({ group, onAdd }) => {
- return (
-
-
-
-
-
- {(close: () => void) => {
- return (
- ({
- name: dataKey,
- type: DATA_TYPES[eventDataType],
- }))}
- group={group}
- onAdd={onAdd}
- onClose={close}
- />
- );
- }}
-
-
- );
- };
-
- return (
-
- );
-}
-
-export default EventDataParameters;
diff --git a/src/app/(main)/reports/event-data/EventDataReport.tsx b/src/app/(main)/reports/event-data/EventDataReport.tsx
deleted file mode 100644
index 8205a4881..000000000
--- a/src/app/(main)/reports/event-data/EventDataReport.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import EventDataParameters from './EventDataParameters';
-import EventDataTable from './EventDataTable';
-import Nodes from '@/assets/nodes.svg';
-
-const defaultParameters = {
- type: 'event-data',
- parameters: { fields: [], filters: [] },
-};
-
-export default function EventDataReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/event-data/EventDataReportPage.tsx b/src/app/(main)/reports/event-data/EventDataReportPage.tsx
deleted file mode 100644
index 8276acfbd..000000000
--- a/src/app/(main)/reports/event-data/EventDataReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import EventDataReport from './EventDataReport';
-
-export default function EventDataReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/event-data/EventDataTable.tsx b/src/app/(main)/reports/event-data/EventDataTable.tsx
deleted file mode 100644
index f42e792d6..000000000
--- a/src/app/(main)/reports/event-data/EventDataTable.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { useContext } from 'react';
-import { GridTable, GridColumn } from 'react-basics';
-import { useMessages } from '@/components/hooks';
-import { ReportContext } from '../[reportId]/Report';
-
-export function EventDataTable() {
- const { report } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
-
-
-
- );
-}
-
-export default EventDataTable;
diff --git a/src/app/(main)/reports/event-data/page.tsx b/src/app/(main)/reports/event-data/page.tsx
deleted file mode 100644
index 2d6477e1a..000000000
--- a/src/app/(main)/reports/event-data/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Metadata } from 'next';
-import EventDataReportPage from './EventDataReportPage';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Event Data Report',
-};
diff --git a/src/app/(main)/reports/funnel/FunnelChart.module.css b/src/app/(main)/reports/funnel/FunnelChart.module.css
deleted file mode 100644
index 7972d5736..000000000
--- a/src/app/(main)/reports/funnel/FunnelChart.module.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.chart {
- display: grid;
-}
-
-.num {
- display: flex;
- align-items: center;
- justify-content: center;
- border-radius: 100%;
- width: 50px;
- height: 50px;
- font-size: 16px;
- font-weight: 700;
- color: var(--base800);
- background: var(--base100);
- z-index: 1;
-}
-
-.step {
- display: grid;
- grid-template-columns: max-content 1fr;
- column-gap: 30px;
- position: relative;
- padding-bottom: 60px;
-}
-
-.step::before {
- content: '';
- position: absolute;
- top: 0;
- left: 25px;
- bottom: 0;
- width: 2px;
- background-color: var(--base100);
-}
-
-.step:last-child::before {
- display: none;
-}
-
-.card {
- display: grid;
- gap: 20px;
- margin-top: 14px;
-}
-
-.header {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.bar {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- background: var(--base900);
- height: 30px;
- border-radius: 5px;
- overflow: hidden;
- position: relative;
-}
-
-.label {
- color: var(--base600);
- font-weight: 700;
- text-transform: uppercase;
-}
-
-.track {
- background-color: var(--base100);
- border-radius: 5px;
-}
-
-.info {
- text-transform: lowercase;
-}
-
-.item {
- font-size: 20px;
- color: var(--base900);
- font-weight: 700;
-}
-
-.metric {
- color: var(--base700);
- display: flex;
- justify-content: space-between;
- gap: 10px;
- margin: 10px 0;
- text-transform: lowercase;
-}
-
-.visitors {
- color: var(--base900);
- font-size: 24px;
- font-weight: 900;
- margin-right: 10px;
-}
-
-.percent {
- font-size: 20px;
- font-weight: 700;
- align-self: flex-end;
-}
diff --git a/src/app/(main)/reports/funnel/FunnelChart.tsx b/src/app/(main)/reports/funnel/FunnelChart.tsx
deleted file mode 100644
index be3da6143..000000000
--- a/src/app/(main)/reports/funnel/FunnelChart.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { useContext } from 'react';
-import classNames from 'classnames';
-import { useMessages } from '@/components/hooks';
-import { ReportContext } from '../[reportId]/Report';
-import { formatLongNumber } from '@/lib/format';
-import styles from './FunnelChart.module.css';
-
-export interface FunnelChartProps {
- className?: string;
- isLoading?: boolean;
-}
-
-export function FunnelChart({ className }: FunnelChartProps) {
- const { report } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { data } = report || {};
-
- return (
-
- {data?.map(({ type, value, visitors, dropped, dropoff, remaining }, index: number) => {
- return (
-
-
{index + 1}
-
-
-
- {formatMessage(type === 'url' ? labels.viewedPage : labels.triggeredEvent)}
-
- {value}
-
-
-
- {formatLongNumber(visitors)}
- {formatMessage(labels.visitors)}
-
-
{(remaining * 100).toFixed(2)}%
-
-
- {dropoff > 0 && (
-
- {formatLongNumber(dropped)} {formatMessage(labels.visitorsDroppedOff)} (
- {(dropoff * 100).toFixed(2)}%)
-
- )}
-
-
- );
- })}
-
- );
-}
-
-export default FunnelChart;
diff --git a/src/app/(main)/reports/funnel/FunnelParameters.module.css b/src/app/(main)/reports/funnel/FunnelParameters.module.css
deleted file mode 100644
index 0f27d515f..000000000
--- a/src/app/(main)/reports/funnel/FunnelParameters.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.item {
- display: flex;
- align-items: center;
- gap: 10px;
- width: 100%;
-}
-
-.value {
- display: flex;
- align-self: center;
- gap: 20px;
-}
diff --git a/src/app/(main)/reports/funnel/FunnelParameters.tsx b/src/app/(main)/reports/funnel/FunnelParameters.tsx
deleted file mode 100644
index 3db57135e..000000000
--- a/src/app/(main)/reports/funnel/FunnelParameters.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import { useContext } from 'react';
-import { useMessages } from '@/components/hooks';
-import {
- Icon,
- Form,
- FormButtons,
- FormInput,
- FormRow,
- PopupTrigger,
- Popup,
- SubmitButton,
- TextField,
- Button,
-} from 'react-basics';
-import Icons from '@/components/icons';
-import FunnelStepAddForm from './FunnelStepAddForm';
-import { ReportContext } from '../[reportId]/Report';
-import BaseParameters from '../[reportId]/BaseParameters';
-import ParameterList from '../[reportId]/ParameterList';
-import PopupForm from '../[reportId]/PopupForm';
-import styles from './FunnelParameters.module.css';
-
-export function FunnelParameters() {
- const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { id, parameters } = report || {};
- const { websiteId, dateRange, steps } = parameters || {};
- const queryDisabled = !websiteId || !dateRange || steps?.length < 2;
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- if (!queryDisabled) {
- runReport(data);
- }
- };
-
- const handleAddStep = (step: { type: string; value: string }) => {
- updateReport({ parameters: { steps: parameters.steps.concat(step) } });
- };
-
- const handleUpdateStep = (
- close: () => void,
- index: number,
- step: { type: string; value: string },
- ) => {
- const steps = [...parameters.steps];
- steps[index] = step;
- updateReport({ parameters: { steps } });
- close();
- };
-
- const handleRemoveStep = (index: number) => {
- const steps = [...parameters.steps];
- delete steps[index];
- updateReport({ parameters: { steps: steps.filter(n => n) } });
- };
-
- const AddStepButton = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- );
- };
-
- return (
-
- );
-}
-
-export default FunnelParameters;
diff --git a/src/app/(main)/reports/funnel/FunnelReport.module.css b/src/app/(main)/reports/funnel/FunnelReport.module.css
deleted file mode 100644
index aed66b74e..000000000
--- a/src/app/(main)/reports/funnel/FunnelReport.module.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.filters {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- line-height: 32px;
- padding: 10px;
- overflow: hidden;
-}
diff --git a/src/app/(main)/reports/funnel/FunnelReport.tsx b/src/app/(main)/reports/funnel/FunnelReport.tsx
deleted file mode 100644
index e0c90e4aa..000000000
--- a/src/app/(main)/reports/funnel/FunnelReport.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import FunnelChart from './FunnelChart';
-import FunnelParameters from './FunnelParameters';
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import Funnel from '@/assets/funnel.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-
-const defaultParameters = {
- type: REPORT_TYPES.funnel,
- parameters: { window: 60, steps: [] },
-};
-
-export default function FunnelReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/funnel/FunnelReportPage.tsx b/src/app/(main)/reports/funnel/FunnelReportPage.tsx
deleted file mode 100644
index a114a8cce..000000000
--- a/src/app/(main)/reports/funnel/FunnelReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import FunnelReport from './FunnelReport';
-
-export default function FunnelReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/funnel/FunnelStepAddForm.module.css b/src/app/(main)/reports/funnel/FunnelStepAddForm.module.css
deleted file mode 100644
index a254ff088..000000000
--- a/src/app/(main)/reports/funnel/FunnelStepAddForm.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.dropdown {
- width: 140px;
-}
-
-.input {
- width: 200px;
-}
diff --git a/src/app/(main)/reports/funnel/FunnelStepAddForm.tsx b/src/app/(main)/reports/funnel/FunnelStepAddForm.tsx
deleted file mode 100644
index d7917d7d9..000000000
--- a/src/app/(main)/reports/funnel/FunnelStepAddForm.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import { useState } from 'react';
-import { useMessages } from '@/components/hooks';
-import { Button, FormRow, TextField, Flexbox, Dropdown, Item } from 'react-basics';
-import styles from './FunnelStepAddForm.module.css';
-
-export interface FunnelStepAddFormProps {
- type?: string;
- value?: string;
- onChange?: (step: { type: string; value: string }) => void;
-}
-
-export function FunnelStepAddForm({
- type: defaultType = 'url',
- value: defaultValue = '',
- onChange,
-}: FunnelStepAddFormProps) {
- const [type, setType] = useState(defaultType);
- const [value, setValue] = useState(defaultValue);
- const { formatMessage, labels } = useMessages();
- const items = [
- { label: formatMessage(labels.url), value: 'url' },
- { label: formatMessage(labels.event), value: 'event' },
- ];
- const isDisabled = !type || !value;
-
- const handleSave = () => {
- onChange({ type, value });
- setValue('');
- };
-
- const handleChange = e => {
- setValue(e.target.value);
- };
-
- const handleKeyDown = e => {
- if (e.key === 'Enter') {
- e.stopPropagation();
- handleSave();
- }
- };
-
- const renderTypeValue = (value: any) => {
- return items.find(item => item.value === value)?.label;
- };
-
- return (
-
-
-
- setType(value)}
- >
- {({ value, label }) => {
- return - {label}
;
- }}
-
-
-
-
-
-
- {formatMessage(defaultValue ? labels.update : labels.add)}
-
-
-
- );
-}
-
-export default FunnelStepAddForm;
diff --git a/src/app/(main)/reports/funnel/page.tsx b/src/app/(main)/reports/funnel/page.tsx
deleted file mode 100644
index 40270bba9..000000000
--- a/src/app/(main)/reports/funnel/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import FunnelReportPage from './FunnelReportPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Funnel Report',
-};
diff --git a/src/app/(main)/reports/goals/GoalsAddForm.module.css b/src/app/(main)/reports/goals/GoalsAddForm.module.css
deleted file mode 100644
index a254ff088..000000000
--- a/src/app/(main)/reports/goals/GoalsAddForm.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.dropdown {
- width: 140px;
-}
-
-.input {
- width: 200px;
-}
diff --git a/src/app/(main)/reports/goals/GoalsAddForm.tsx b/src/app/(main)/reports/goals/GoalsAddForm.tsx
deleted file mode 100644
index b73545337..000000000
--- a/src/app/(main)/reports/goals/GoalsAddForm.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import { useState } from 'react';
-import { Button, Dropdown, Flexbox, FormRow, Item, TextField } from 'react-basics';
-import styles from './GoalsAddForm.module.css';
-
-export function GoalsAddForm({
- type: defaultType = 'url',
- value: defaultValue = '',
- property: defaultProperty = '',
- operator: defaultAggregae = null,
- goal: defaultGoal = 10,
- onChange,
-}: {
- type?: string;
- value?: string;
- operator?: string;
- property?: string;
- goal?: number;
- onChange?: (step: {
- type: string;
- value: string;
- goal: number;
- operator?: string;
- property?: string;
- }) => void;
-}) {
- const [type, setType] = useState(defaultType);
- const [value, setValue] = useState(defaultValue);
- const [operator, setOperator] = useState(defaultAggregae);
- const [property, setProperty] = useState(defaultProperty);
- const [goal, setGoal] = useState(defaultGoal);
- const { formatMessage, labels } = useMessages();
- const items = [
- { label: formatMessage(labels.url), value: 'url' },
- { label: formatMessage(labels.event), value: 'event' },
- { label: formatMessage(labels.eventData), value: 'event-data' },
- ];
- const operators = [
- { label: formatMessage(labels.count), value: 'count' },
- { label: formatMessage(labels.average), value: 'average' },
- { label: formatMessage(labels.sum), value: 'sum' },
- ];
- const isDisabled = !type || !value;
-
- const handleSave = () => {
- onChange(
- type === 'event-data' ? { type, value, goal, operator, property } : { type, value, goal },
- );
- setValue('');
- setProperty('');
- setGoal(10);
- };
-
- const handleChange = (e, set) => {
- set(e.target.value);
- };
-
- const handleKeyDown = e => {
- if (e.key === 'Enter') {
- e.stopPropagation();
- handleSave();
- }
- };
-
- const renderTypeValue = (value: any) => {
- return items.find(item => item.value === value)?.label;
- };
-
- const renderoperatorValue = (value: any) => {
- return operators.find(item => item.value === value)?.label;
- };
-
- return (
-
-
-
- setType(value)}
- >
- {({ value, label }) => {
- return - {label}
;
- }}
-
- handleChange(e, setValue)}
- autoFocus={true}
- autoComplete="off"
- onKeyDown={handleKeyDown}
- />
-
-
- {type === 'event-data' && (
-
-
- setOperator(value)}
- >
- {({ value, label }) => {
- return - {label}
;
- }}
-
- handleChange(e, setProperty)}
- autoFocus={true}
- autoComplete="off"
- onKeyDown={handleKeyDown}
- />
-
-
- )}
-
-
- handleChange(e, setGoal)}
- autoComplete="off"
- onKeyDown={handleKeyDown}
- />
-
-
-
-
- {formatMessage(defaultValue ? labels.update : labels.add)}
-
-
-
- );
-}
-
-export default GoalsAddForm;
diff --git a/src/app/(main)/reports/goals/GoalsChart.module.css b/src/app/(main)/reports/goals/GoalsChart.module.css
deleted file mode 100644
index 799f5fddc..000000000
--- a/src/app/(main)/reports/goals/GoalsChart.module.css
+++ /dev/null
@@ -1,95 +0,0 @@
-.chart {
- display: grid;
- gap: 30px;
-}
-
-.goal {
- padding-bottom: 40px;
- border-bottom: 1px solid var(--base400);
-}
-
-.goal:last-child {
- border: 0;
-}
-
-.card {
- display: grid;
- gap: 20px;
- margin-top: 14px;
-}
-
-.header {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.label {
- color: var(--base600);
- font-weight: 700;
- text-transform: uppercase;
-}
-
-.item {
- font-size: 20px;
- color: var(--base900);
- font-weight: 700;
-}
-
-.metric {
- color: var(--base700);
- display: flex;
- justify-content: space-between;
- gap: 10px;
- margin: 10px 0;
- text-transform: lowercase;
-}
-
-.value {
- color: var(--base900);
- font-size: 24px;
- font-weight: 900;
- margin-right: 10px;
-}
-
-.percent {
- font-size: 20px;
- font-weight: 700;
- align-self: flex-end;
-}
-
-.total {
- color: var(--base700);
-}
-
-.bar {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- background: var(--base900);
- height: 10px;
- border-radius: 5px;
- overflow: hidden;
- position: relative;
-}
-
-.bar.level1 {
- background: var(--red800);
-}
-.bar.level2 {
- background: var(--orange200);
-}
-.bar.level3 {
- background: var(--orange400);
-}
-.bar.level4 {
- background: var(--orange600);
-}
-.bar.level5 {
- background: var(--green600);
-}
-
-.track {
- background-color: var(--base100);
- border-radius: 5px;
-}
diff --git a/src/app/(main)/reports/goals/GoalsChart.tsx b/src/app/(main)/reports/goals/GoalsChart.tsx
deleted file mode 100644
index 34ea485e6..000000000
--- a/src/app/(main)/reports/goals/GoalsChart.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { useContext } from 'react';
-import classNames from 'classnames';
-import { useMessages } from '@/components/hooks';
-import { ReportContext } from '../[reportId]/Report';
-import { formatLongNumber } from '@/lib/format';
-import styles from './GoalsChart.module.css';
-
-export function GoalsChart({ className }: { className?: string; isLoading?: boolean }) {
- const { report } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { data } = report || {};
-
- const getLabel = type => {
- let label = '';
- switch (type) {
- case 'url':
- label = labels.viewedPage;
- break;
- case 'event':
- label = labels.triggeredEvent;
- break;
- default:
- label = labels.collectedData;
- break;
- }
-
- return label;
- };
-
- return (
-
- {data?.map(({ type, value, goal, result, property, operator }, index: number) => {
- const percent = result > goal ? 100 : (result / goal) * 100;
-
- return (
-
-
-
- {formatMessage(getLabel(type))}
- {`${value}${
- type === 'event-data' ? `:(${operator}):${property}` : ''
- }`}
-
-
-
20 && percent <= 40,
- [styles.level3]: percent > 40 && percent <= 60,
- [styles.level4]: percent > 60 && percent <= 80,
- [styles.level5]: percent > 80,
- }),
- )}
- style={{ width: `${percent}%` }}
- >
-
-
-
- {formatLongNumber(result)}
- / {formatLongNumber(goal)}
-
-
{((result / goal) * 100).toFixed(2)}%
-
-
-
- );
- })}
-
- );
-}
-
-export default GoalsChart;
diff --git a/src/app/(main)/reports/goals/GoalsParameters.module.css b/src/app/(main)/reports/goals/GoalsParameters.module.css
deleted file mode 100644
index cd72f524e..000000000
--- a/src/app/(main)/reports/goals/GoalsParameters.module.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.value {
- width: 100%;
- margin-bottom: 8px;
- font-weight: 600;
-}
-
-.eventData {
- color: var(--orange900);
- background-color: var(--orange100);
- font-size: 12px;
- font-weight: 900;
- padding: 2px 8px;
- border-radius: 5px;
- width: fit-content;
-}
-
-.goal {
- color: var(--blue900);
- background-color: var(--blue100);
- font-size: 12px;
- font-weight: 900;
- padding: 2px 8px;
- border-radius: 5px;
- width: fit-content;
-}
diff --git a/src/app/(main)/reports/goals/GoalsParameters.tsx b/src/app/(main)/reports/goals/GoalsParameters.tsx
deleted file mode 100644
index 518666450..000000000
--- a/src/app/(main)/reports/goals/GoalsParameters.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { formatNumber } from '@/lib/format';
-import { useContext } from 'react';
-import {
- Button,
- Flexbox,
- Form,
- FormButtons,
- FormRow,
- Icon,
- Popup,
- PopupTrigger,
- SubmitButton,
-} from 'react-basics';
-import BaseParameters from '../[reportId]/BaseParameters';
-import ParameterList from '../[reportId]/ParameterList';
-import PopupForm from '../[reportId]/PopupForm';
-import { ReportContext } from '../[reportId]/Report';
-import GoalsAddForm from './GoalsAddForm';
-import styles from './GoalsParameters.module.css';
-
-export function GoalsParameters() {
- const { report, runReport, updateReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { id, parameters } = report || {};
- const { websiteId, dateRange, goals } = parameters || {};
- const queryDisabled = !websiteId || !dateRange || goals?.length < 1;
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- if (!queryDisabled) {
- runReport(data);
- }
- };
-
- const handleAddGoals = (goal: { type: string; value: string }) => {
- updateReport({ parameters: { goals: parameters.goals.concat(goal) } });
- };
-
- const handleUpdateGoals = (
- close: () => void,
- index: number,
- goal: { type: string; value: string },
- ) => {
- const goals = [...parameters.goals];
- goals[index] = goal;
- updateReport({ parameters: { goals } });
- close();
- };
-
- const handleRemoveGoals = (index: number) => {
- const goals = [...parameters.goals];
- delete goals[index];
- updateReport({ parameters: { goals: goals.filter(n => n) } });
- };
-
- const AddGoalsButton = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- );
- };
-
- return (
-
- );
-}
-
-export default GoalsParameters;
diff --git a/src/app/(main)/reports/goals/GoalsReport.module.css b/src/app/(main)/reports/goals/GoalsReport.module.css
deleted file mode 100644
index aed66b74e..000000000
--- a/src/app/(main)/reports/goals/GoalsReport.module.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.filters {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- line-height: 32px;
- padding: 10px;
- overflow: hidden;
-}
diff --git a/src/app/(main)/reports/goals/GoalsReport.tsx b/src/app/(main)/reports/goals/GoalsReport.tsx
deleted file mode 100644
index ae540f3b9..000000000
--- a/src/app/(main)/reports/goals/GoalsReport.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import GoalsChart from './GoalsChart';
-import GoalsParameters from './GoalsParameters';
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import Target from '@/assets/target.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-
-const defaultParameters = {
- type: REPORT_TYPES.goals,
- parameters: { goals: [] },
-};
-
-export default function GoalsReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/goals/GoalsReportPage.tsx b/src/app/(main)/reports/goals/GoalsReportPage.tsx
deleted file mode 100644
index cbab8bd0a..000000000
--- a/src/app/(main)/reports/goals/GoalsReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import GoalReport from './GoalsReport';
-
-export default function GoalReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/goals/page.tsx b/src/app/(main)/reports/goals/page.tsx
deleted file mode 100644
index 112ae47cf..000000000
--- a/src/app/(main)/reports/goals/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import GoalsReportPage from './GoalsReportPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Goals Report',
-};
diff --git a/src/app/(main)/reports/insights/InsightsParameters.tsx b/src/app/(main)/reports/insights/InsightsParameters.tsx
deleted file mode 100644
index 6b3402fb4..000000000
--- a/src/app/(main)/reports/insights/InsightsParameters.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import { useContext } from 'react';
-import { Form, FormButtons, SubmitButton } from 'react-basics';
-import BaseParameters from '../[reportId]/BaseParameters';
-import { ReportContext } from '../[reportId]/Report';
-import FieldParameters from '../[reportId]/FieldParameters';
-import FilterParameters from '../[reportId]/FilterParameters';
-
-export function InsightsParameters() {
- const { report, runReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { id, parameters } = report || {};
- const { websiteId, dateRange, fields, filters } = parameters || {};
- const { startDate, endDate } = dateRange || {};
- const parametersSelected = websiteId && startDate && endDate;
- const queryEnabled = websiteId && dateRange && (fields?.length || filters?.length);
-
- const handleSubmit = (values: any) => {
- runReport(values);
- };
-
- return (
-
- );
-}
-
-export default InsightsParameters;
diff --git a/src/app/(main)/reports/insights/InsightsReport.tsx b/src/app/(main)/reports/insights/InsightsReport.tsx
deleted file mode 100644
index d43576fab..000000000
--- a/src/app/(main)/reports/insights/InsightsReport.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import InsightsParameters from './InsightsParameters';
-import InsightsTable from './InsightsTable';
-import Lightbulb from '@/assets/lightbulb.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-
-const defaultParameters = {
- type: REPORT_TYPES.insights,
- parameters: { fields: [], filters: [] },
-};
-
-export default function InsightsReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/insights/InsightsReportPage.tsx b/src/app/(main)/reports/insights/InsightsReportPage.tsx
deleted file mode 100644
index 7525b7678..000000000
--- a/src/app/(main)/reports/insights/InsightsReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import InsightsReport from './InsightsReport';
-
-export default function InsightsReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/insights/InsightsTable.tsx b/src/app/(main)/reports/insights/InsightsTable.tsx
deleted file mode 100644
index 6864d9196..000000000
--- a/src/app/(main)/reports/insights/InsightsTable.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { useContext, useEffect, useState } from 'react';
-import { GridTable, GridColumn } from 'react-basics';
-import { useFormat, useMessages } from '@/components/hooks';
-import { ReportContext } from '../[reportId]/Report';
-import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
-import { formatShortTime } from '@/lib/format';
-
-export function InsightsTable() {
- const [fields, setFields] = useState([]);
- const { report } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { formatValue } = useFormat();
-
- useEffect(
- () => {
- setFields(report?.parameters?.fields);
- },
- // eslint-disable-next-line react-hooks/exhaustive-deps
- [report?.data],
- );
-
- if (!fields || !report?.parameters) {
- return ;
- }
-
- return (
-
- {fields.map(({ name, label }) => {
- return (
-
- {row => formatValue(row[name], name)}
-
- );
- })}
-
- {row => row?.views?.toLocaleString()}
-
-
- {row => row?.visits?.toLocaleString()}
-
-
- {row => row?.visitors?.toLocaleString()}
-
-
- {row => {
- const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100;
- return Math.round(+n) + '%';
- }}
-
-
- {row => {
- const n = row?.totaltime / row?.visits;
- return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`;
- }}
-
-
- );
-}
-
-export default InsightsTable;
diff --git a/src/app/(main)/reports/insights/page.tsx b/src/app/(main)/reports/insights/page.tsx
deleted file mode 100644
index 1e9e0ea6d..000000000
--- a/src/app/(main)/reports/insights/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import InsightsReportPage from './InsightsReportPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Insights Report',
-};
diff --git a/src/app/(main)/reports/journey/JourneyParameters.tsx b/src/app/(main)/reports/journey/JourneyParameters.tsx
deleted file mode 100644
index ffa5df89c..000000000
--- a/src/app/(main)/reports/journey/JourneyParameters.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { useContext } from 'react';
-import { useMessages } from '@/components/hooks';
-import {
- Dropdown,
- Form,
- FormButtons,
- FormInput,
- FormRow,
- Item,
- SubmitButton,
- TextField,
-} from 'react-basics';
-import { ReportContext } from '../[reportId]/Report';
-import BaseParameters from '../[reportId]/BaseParameters';
-
-export function JourneyParameters() {
- const { report, runReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { id, parameters } = report || {};
- const { websiteId, dateRange, steps } = parameters || {};
- const queryDisabled = !websiteId || !dateRange || !steps;
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- if (!queryDisabled) {
- runReport(data);
- }
- };
-
- return (
-
- );
-}
-
-export default JourneyParameters;
diff --git a/src/app/(main)/reports/journey/JourneyReport.tsx b/src/app/(main)/reports/journey/JourneyReport.tsx
deleted file mode 100644
index 4322fa2a1..000000000
--- a/src/app/(main)/reports/journey/JourneyReport.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-'use client';
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import JourneyParameters from './JourneyParameters';
-import JourneyView from './JourneyView';
-import Path from '@/assets/path.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-
-const defaultParameters = {
- type: REPORT_TYPES.journey,
- parameters: { steps: 5 },
-};
-
-export default function JourneyReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/journey/JourneyReportPage.tsx b/src/app/(main)/reports/journey/JourneyReportPage.tsx
deleted file mode 100644
index 0f4b78cad..000000000
--- a/src/app/(main)/reports/journey/JourneyReportPage.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import JourneyReport from './JourneyReport';
-
-export default function JourneyReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/journey/JourneyView.tsx b/src/app/(main)/reports/journey/JourneyView.tsx
deleted file mode 100644
index abddf0231..000000000
--- a/src/app/(main)/reports/journey/JourneyView.tsx
+++ /dev/null
@@ -1,253 +0,0 @@
-import { useContext, useMemo, useState } from 'react';
-import { TextOverflow, TooltipPopup } from 'react-basics';
-import { firstBy } from 'thenby';
-import classNames from 'classnames';
-import { useEscapeKey, useMessages } from '@/components/hooks';
-import { objectToArray } from '@/lib/data';
-import { ReportContext } from '../[reportId]/Report';
-import styles from './JourneyView.module.css';
-import { formatLongNumber } from '@/lib/format';
-
-const NODE_HEIGHT = 60;
-const NODE_GAP = 10;
-const LINE_WIDTH = 3;
-
-export default function JourneyView() {
- const [selectedNode, setSelectedNode] = useState(null);
- const [activeNode, setActiveNode] = useState(null);
- const { report } = useContext(ReportContext);
- const { data, parameters } = report || {};
- const { formatMessage, labels } = useMessages();
-
- useEscapeKey(() => setSelectedNode(null));
-
- const columns = useMemo(() => {
- if (!data) {
- return [];
- }
-
- const selectedPaths = selectedNode?.paths ?? [];
- const activePaths = activeNode?.paths ?? [];
- const columns = [];
-
- for (let columnIndex = 0; columnIndex < +parameters.steps; columnIndex++) {
- const nodes = {};
-
- data.forEach(({ items, count }: any, nodeIndex: any) => {
- const name = items[columnIndex];
-
- if (name) {
- const selected = !!selectedPaths.find(({ items }) => items[columnIndex] === name);
- const active = selected && !!activePaths.find(({ items }) => items[columnIndex] === name);
-
- if (!nodes[name]) {
- const paths = data.filter(({ items }) => items[columnIndex] === name);
-
- nodes[name] = {
- name,
- count,
- totalCount: count,
- nodeIndex,
- columnIndex,
- selected,
- active,
- paths,
- pathMap: paths.map(({ items, count }) => ({
- [`${columnIndex}:${items.join(':')}`]: count,
- })),
- };
- } else {
- nodes[name].totalCount += count;
- }
- }
- });
-
- columns.push({
- nodes: objectToArray(nodes).sort(firstBy('total', -1)),
- });
- }
-
- columns.forEach((column, columnIndex) => {
- const nodes = column.nodes.map((currentNode, currentNodeIndex) => {
- const previousNodes = columns[columnIndex - 1]?.nodes;
- let selectedCount = previousNodes ? 0 : currentNode.totalCount;
- let activeCount = selectedCount;
-
- const lines =
- previousNodes?.reduce((arr: any[][], previousNode: any, previousNodeIndex: number) => {
- const fromCount = selectedNode?.paths.reduce((sum, path) => {
- if (
- previousNode.name === path.items[columnIndex - 1] &&
- currentNode.name === path.items[columnIndex]
- ) {
- sum += path.count;
- }
- return sum;
- }, 0);
-
- if (currentNode.selected && previousNode.selected && fromCount) {
- arr.push([previousNodeIndex, currentNodeIndex]);
- selectedCount += fromCount;
-
- if (previousNode.active) {
- activeCount += fromCount;
- }
- }
-
- return arr;
- }, []) || [];
-
- return { ...currentNode, selectedCount, activeCount, lines };
- });
-
- const visitorCount = nodes.reduce(
- (sum: number, { selected, selectedCount, active, activeCount, totalCount }) => {
- if (!selectedNode) {
- sum += totalCount;
- } else if (!activeNode && selectedNode && selected) {
- sum += selectedCount;
- } else if (activeNode && active) {
- sum += activeCount;
- }
- return sum;
- },
- 0,
- );
-
- const previousTotal = columns[columnIndex - 1]?.visitorCount ?? 0;
- const dropOff =
- previousTotal > 0 ? ((visitorCount - previousTotal) / previousTotal) * 100 : 0;
-
- Object.assign(column, { nodes, visitorCount, dropOff });
- });
-
- return columns;
- }, [data, selectedNode, activeNode]);
-
- const handleClick = (name: string, columnIndex: number, paths: any[]) => {
- if (name !== selectedNode?.name || columnIndex !== selectedNode?.columnIndex) {
- setSelectedNode({ name, columnIndex, paths });
- } else {
- setSelectedNode(null);
- }
- setActiveNode(null);
- };
-
- if (!data) {
- return null;
- }
-
- return (
-
-
- {columns.map((column, columnIndex) => {
- const dropOffPercent = `${~~column.dropOff}%`;
- return (
-
-
-
{columnIndex + 1}
-
-
- {formatLongNumber(column.visitorCount)} {formatMessage(labels.visitors)}
-
- {columnIndex > 0 &&
{dropOffPercent}
}
-
-
-
- {column.nodes.map(
- ({
- name,
- totalCount,
- selected,
- active,
- paths,
- activeCount,
- selectedCount,
- lines,
- }) => {
- const nodeCount = selected
- ? active
- ? activeCount
- : selectedCount
- : totalCount;
-
- return (
-
selected && setActiveNode({ name, columnIndex, paths })}
- onMouseLeave={() => selected && setActiveNode(null)}
- >
-
handleClick(name, columnIndex, paths)}
- >
-
- {name}
-
-
-
- {formatLongNumber(nodeCount)}
-
-
- {columnIndex < columns.length &&
- lines.map(([fromIndex, nodeIndex], i) => {
- const height =
- (Math.abs(nodeIndex - fromIndex) + 1) * (NODE_HEIGHT + NODE_GAP) -
- NODE_GAP;
- const midHeight =
- (Math.abs(nodeIndex - fromIndex) - 1) * (NODE_HEIGHT + NODE_GAP) +
- NODE_GAP +
- LINE_WIDTH;
- const nodeName = columns[columnIndex - 1]?.nodes[fromIndex].name;
-
- return (
-
- path.items[columnIndex] === name &&
- path.items[columnIndex - 1] === nodeName,
- ),
- [styles.up]: fromIndex < nodeIndex,
- [styles.down]: fromIndex > nodeIndex,
- [styles.flat]: fromIndex === nodeIndex,
- })}
- style={{ height }}
- >
-
-
-
-
- );
- })}
-
-
- );
- },
- )}
-
-
- );
- })}
-
-
- );
-}
diff --git a/src/app/(main)/reports/journey/page.tsx b/src/app/(main)/reports/journey/page.tsx
deleted file mode 100644
index 447747cc3..000000000
--- a/src/app/(main)/reports/journey/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Metadata } from 'next';
-import JourneyReportPage from './JourneyReportPage';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Journey Report',
-};
diff --git a/src/app/(main)/reports/page.tsx b/src/app/(main)/reports/page.tsx
deleted file mode 100644
index ef4e56ada..000000000
--- a/src/app/(main)/reports/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import ReportsPage from './ReportsPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Reports',
-};
diff --git a/src/app/(main)/reports/retention/RetentionParameters.tsx b/src/app/(main)/reports/retention/RetentionParameters.tsx
deleted file mode 100644
index 56cbdbd38..000000000
--- a/src/app/(main)/reports/retention/RetentionParameters.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useContext } from 'react';
-import { useMessages } from '@/components/hooks';
-import { Form, FormButtons, FormRow, SubmitButton } from 'react-basics';
-import { ReportContext } from '../[reportId]/Report';
-import { MonthSelect } from '@/components/input/MonthSelect';
-import BaseParameters from '../[reportId]/BaseParameters';
-import { parseDateRange } from '@/lib/date';
-
-export function RetentionParameters() {
- const { report, runReport, isRunning, updateReport } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { id, parameters } = report || {};
- const { websiteId, dateRange } = parameters || {};
- const { startDate } = dateRange || {};
- const queryDisabled = !websiteId || !dateRange;
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- if (!queryDisabled) {
- runReport(data);
- }
- };
-
- const handleDateChange = value => {
- updateReport({ parameters: { dateRange: { ...parseDateRange(value) } } });
- };
-
- return (
-
- );
-}
-
-export default RetentionParameters;
diff --git a/src/app/(main)/reports/retention/RetentionReport.module.css b/src/app/(main)/reports/retention/RetentionReport.module.css
deleted file mode 100644
index aed66b74e..000000000
--- a/src/app/(main)/reports/retention/RetentionReport.module.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.filters {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- line-height: 32px;
- padding: 10px;
- overflow: hidden;
-}
diff --git a/src/app/(main)/reports/retention/RetentionReport.tsx b/src/app/(main)/reports/retention/RetentionReport.tsx
deleted file mode 100644
index 054a1a66b..000000000
--- a/src/app/(main)/reports/retention/RetentionReport.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import RetentionTable from './RetentionTable';
-import RetentionParameters from './RetentionParameters';
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import Magnet from '@/assets/magnet.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-import { parseDateRange } from '@/lib/date';
-import { endOfMonth, startOfMonth } from 'date-fns';
-
-const defaultParameters = {
- type: REPORT_TYPES.retention,
- parameters: {
- dateRange: parseDateRange(
- `range:${startOfMonth(new Date()).getTime()}:${endOfMonth(new Date()).getTime()}`,
- ),
- },
-};
-
-export default function RetentionReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/retention/RetentionReportPage.tsx b/src/app/(main)/reports/retention/RetentionReportPage.tsx
deleted file mode 100644
index 4d3e19e9d..000000000
--- a/src/app/(main)/reports/retention/RetentionReportPage.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-'use client';
-import { Metadata } from 'next';
-import RetentionReport from './RetentionReport';
-
-export default function RetentionReportPage() {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Retention Report',
-};
diff --git a/src/app/(main)/reports/retention/RetentionTable.module.css b/src/app/(main)/reports/retention/RetentionTable.module.css
deleted file mode 100644
index bfe3ac1c4..000000000
--- a/src/app/(main)/reports/retention/RetentionTable.module.css
+++ /dev/null
@@ -1,52 +0,0 @@
-.table {
- display: flex;
- flex-direction: column;
-}
-
-.header {
- font-weight: 700;
-}
-
-.row {
- display: flex;
- flex-direction: row;
- gap: 1px;
- margin-bottom: 1px;
-}
-
-.cell {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 60px;
- height: 60px;
- background: var(--blue200);
- border-radius: var(--border-radius);
-}
-
-.date {
- display: flex;
- align-items: center;
- min-width: 160px;
-}
-
-.visitors {
- display: flex;
- align-items: center;
- min-width: 80px;
-}
-
-.day {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 60px;
- height: 60px;
- text-align: center;
- font-size: var(--font-size-sm);
- font-weight: 400;
-}
-
-.empty {
- background: var(--blue100);
-}
diff --git a/src/app/(main)/reports/retention/RetentionTable.tsx b/src/app/(main)/reports/retention/RetentionTable.tsx
deleted file mode 100644
index 23f0a8b0e..000000000
--- a/src/app/(main)/reports/retention/RetentionTable.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { useContext } from 'react';
-import classNames from 'classnames';
-import { ReportContext } from '../[reportId]/Report';
-import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
-import { useMessages, useLocale } from '@/components/hooks';
-import { formatDate } from '@/lib/date';
-import styles from './RetentionTable.module.css';
-
-const DAYS = [1, 2, 3, 4, 5, 6, 7, 14, 21, 28];
-
-export function RetentionTable({ days = DAYS }) {
- const { formatMessage, labels } = useMessages();
- const { locale } = useLocale();
- const { report } = useContext(ReportContext);
- const { data } = report || {};
-
- if (!data) {
- return ;
- }
-
- const rows = data.reduce((arr: any[], row: { date: any; visitors: any; day: any }) => {
- const { date, visitors, day } = row;
- if (day === 0) {
- return arr.concat({
- date,
- visitors,
- records: days
- .reduce((arr, day) => {
- arr[day] = data.find(x => x.date === date && x.day === day);
- return arr;
- }, [])
- .filter(n => n),
- });
- }
- return arr;
- }, []);
-
- const totalDays = rows.length;
-
- return (
- <>
-
-
-
{formatMessage(labels.date)}
-
{formatMessage(labels.visitors)}
- {days.map(n => (
-
- {formatMessage(labels.day)} {n}
-
- ))}
-
- {rows.map(({ date, visitors, records }, rowIndex) => {
- return (
-
-
{formatDate(date, 'PP', locale)}
-
{visitors}
- {days.map(day => {
- if (totalDays - rowIndex < day) {
- return null;
- }
- const percentage = records.filter(a => a.day === day)[0]?.percentage;
- return (
-
- {percentage ? `${Number(percentage).toFixed(2)}%` : ''}
-
- );
- })}
-
- );
- })}
-
- >
- );
-}
-
-export default RetentionTable;
diff --git a/src/app/(main)/reports/retention/page.tsx b/src/app/(main)/reports/retention/page.tsx
deleted file mode 100644
index 0f04fe981..000000000
--- a/src/app/(main)/reports/retention/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Metadata } from 'next';
-import RetentionReportPage from './RetentionReportPage';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Retention Report',
-};
diff --git a/src/app/(main)/reports/revenue/RevenueParameters.tsx b/src/app/(main)/reports/revenue/RevenueParameters.tsx
deleted file mode 100644
index 5cee14de9..000000000
--- a/src/app/(main)/reports/revenue/RevenueParameters.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import useRevenueValues from '@/components/hooks/queries/useRevenueValues';
-import { useContext } from 'react';
-import { Dropdown, Form, FormButtons, FormInput, FormRow, Item, SubmitButton } from 'react-basics';
-import BaseParameters from '../[reportId]/BaseParameters';
-import { ReportContext } from '../[reportId]/Report';
-
-export function RevenueParameters() {
- const { report, runReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { id, parameters } = report || {};
- const { websiteId, dateRange } = parameters || {};
- const queryEnabled = websiteId && dateRange;
- const { data: values = [] } = useRevenueValues(
- websiteId,
- dateRange?.startDate,
- dateRange?.endDate,
- );
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- runReport(data);
- };
-
- return (
-
- );
-}
-
-export default RevenueParameters;
diff --git a/src/app/(main)/reports/revenue/RevenueReport.tsx b/src/app/(main)/reports/revenue/RevenueReport.tsx
deleted file mode 100644
index 8400c6516..000000000
--- a/src/app/(main)/reports/revenue/RevenueReport.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import Money from '@/assets/money.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-import Report from '../[reportId]/Report';
-import ReportBody from '../[reportId]/ReportBody';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import RevenueParameters from './RevenueParameters';
-import RevenueView from './RevenueView';
-
-const defaultParameters = {
- type: REPORT_TYPES.revenue,
- parameters: {},
-};
-
-export default function RevenueReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/revenue/RevenueReportPage.tsx b/src/app/(main)/reports/revenue/RevenueReportPage.tsx
deleted file mode 100644
index e48c29d2e..000000000
--- a/src/app/(main)/reports/revenue/RevenueReportPage.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client';
-import RevenueReport from './RevenueReport';
-
-export default function RevenueReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/revenue/RevenueTable.tsx b/src/app/(main)/reports/revenue/RevenueTable.tsx
deleted file mode 100644
index 184797e99..000000000
--- a/src/app/(main)/reports/revenue/RevenueTable.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
-import { useMessages } from '@/components/hooks';
-import { useContext } from 'react';
-import { GridColumn, GridTable } from 'react-basics';
-import { ReportContext } from '../[reportId]/Report';
-import { formatLongCurrency } from '@/lib/format';
-
-export function RevenueTable() {
- const { report } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
- const { data } = report || {};
-
- if (!data) {
- return ;
- }
-
- return (
-
-
- {row => row.currency}
-
-
- {row => formatLongCurrency(row.sum, row.currency)}
-
-
- {row => formatLongCurrency(row.count ? row.sum / row.count : 0, row.currency)}
-
-
- {row => row.count}
-
-
- {row => row.unique_count}
-
-
- );
-}
-
-export default RevenueTable;
diff --git a/src/app/(main)/reports/revenue/RevenueView.module.css b/src/app/(main)/reports/revenue/RevenueView.module.css
deleted file mode 100644
index 9b35260e2..000000000
--- a/src/app/(main)/reports/revenue/RevenueView.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.container {
- display: grid;
- gap: 20px;
- margin-bottom: 40px;
-}
-
-.row {
- display: flex;
- align-items: center;
- gap: 10px;
-}
diff --git a/src/app/(main)/reports/revenue/RevenueView.tsx b/src/app/(main)/reports/revenue/RevenueView.tsx
deleted file mode 100644
index bd3d6c637..000000000
--- a/src/app/(main)/reports/revenue/RevenueView.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import classNames from 'classnames';
-import { colord } from 'colord';
-import BarChart from '@/components/charts/BarChart';
-import PieChart from '@/components/charts/PieChart';
-import TypeIcon from '@/components/common/TypeIcon';
-import { useCountryNames, useLocale, useMessages } from '@/components/hooks';
-import { GridRow } from '@/components/layout/Grid';
-import ListTable from '@/components/metrics/ListTable';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
-import { renderDateLabels } from '@/lib/charts';
-import { CHART_COLORS } from '@/lib/constants';
-import { formatLongCurrency, formatLongNumber } from '@/lib/format';
-import { useCallback, useContext, useMemo } from 'react';
-import { ReportContext } from '../[reportId]/Report';
-import RevenueTable from './RevenueTable';
-import styles from './RevenueView.module.css';
-
-export interface RevenueViewProps {
- isLoading?: boolean;
-}
-
-export function RevenueView({ isLoading }: RevenueViewProps) {
- const { formatMessage, labels } = useMessages();
- const { locale } = useLocale();
- const { countryNames } = useCountryNames(locale);
- const { report } = useContext(ReportContext);
- const {
- data,
- parameters: { dateRange, currency },
- } = report || {};
- const showTable = data?.table.length > 1;
-
- const renderCountryName = useCallback(
- ({ x: code }) => (
-
-
- {countryNames[code]}
-
- ),
- [countryNames, locale],
- );
-
- const chartData = useMemo(() => {
- if (!data) return [];
-
- const map = (data.chart as any[]).reduce((obj, { x, t, y }) => {
- if (!obj[x]) {
- obj[x] = [];
- }
-
- obj[x].push({ x: t, y });
-
- return obj;
- }, {});
-
- return {
- datasets: Object.keys(map).map((key, index) => {
- const color = colord(CHART_COLORS[index % CHART_COLORS.length]);
- return {
- label: key,
- data: map[key],
- lineTension: 0,
- backgroundColor: color.alpha(0.6).toRgbString(),
- borderColor: color.alpha(0.7).toRgbString(),
- borderWidth: 1,
- };
- }),
- };
- }, [data]);
-
- const countryData = useMemo(() => {
- if (!data) return [];
-
- const labels = data.country.map(({ name }) => name);
- const datasets = [
- {
- data: data.country.map(({ value }) => value),
- backgroundColor: CHART_COLORS,
- borderWidth: 0,
- },
- ];
-
- return { labels, datasets };
- }, [data]);
-
- const metricData = useMemo(() => {
- if (!data) return [];
-
- const { sum, count, unique_count } = data.total;
-
- return [
- {
- value: sum,
- label: formatMessage(labels.total),
- formatValue: n => formatLongCurrency(n, currency),
- },
- {
- value: count ? sum / count : 0,
- label: formatMessage(labels.average),
- formatValue: n => formatLongCurrency(n, currency),
- },
- {
- value: count,
- label: formatMessage(labels.transactions),
- formatValue: formatLongNumber,
- },
- {
- value: unique_count,
- label: formatMessage(labels.uniqueCustomers),
- formatValue: formatLongNumber,
- },
- ] as any;
- }, [data, locale]);
-
- return (
- <>
-
-
- {metricData?.map(({ label, value, formatValue }) => {
- return ;
- })}
-
- {data && (
- <>
-
-
- ({
- x: name,
- y: Number(value),
- z: (value / data?.total.sum) * 100,
- }))}
- renderLabel={renderCountryName}
- />
-
-
- >
- )}
- {showTable &&
}
-
- >
- );
-}
-
-export default RevenueView;
diff --git a/src/app/(main)/reports/revenue/page.tsx b/src/app/(main)/reports/revenue/page.tsx
deleted file mode 100644
index a8b79f086..000000000
--- a/src/app/(main)/reports/revenue/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import RevenueReportPage from './RevenueReportPage';
-import { Metadata } from 'next';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Revenue Report',
-};
diff --git a/src/app/(main)/reports/utm/UTMParameters.tsx b/src/app/(main)/reports/utm/UTMParameters.tsx
deleted file mode 100644
index 5ae6017f2..000000000
--- a/src/app/(main)/reports/utm/UTMParameters.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useContext } from 'react';
-import { useMessages } from '@/components/hooks';
-import { Form, FormButtons, SubmitButton } from 'react-basics';
-import { ReportContext } from '../[reportId]/Report';
-import BaseParameters from '../[reportId]/BaseParameters';
-
-export function UTMParameters() {
- const { report, runReport, isRunning } = useContext(ReportContext);
- const { formatMessage, labels } = useMessages();
-
- const { id, parameters } = report || {};
- const { websiteId, dateRange } = parameters || {};
- const queryDisabled = !websiteId || !dateRange;
-
- const handleSubmit = (data: any, e: any) => {
- e.stopPropagation();
- e.preventDefault();
-
- if (!queryDisabled) {
- runReport(data);
- }
- };
-
- return (
-
- );
-}
-
-export default UTMParameters;
diff --git a/src/app/(main)/reports/utm/UTMReport.tsx b/src/app/(main)/reports/utm/UTMReport.tsx
deleted file mode 100644
index d9d2f579a..000000000
--- a/src/app/(main)/reports/utm/UTMReport.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-'use client';
-import Report from '../[reportId]/Report';
-import ReportHeader from '../[reportId]/ReportHeader';
-import ReportMenu from '../[reportId]/ReportMenu';
-import ReportBody from '../[reportId]/ReportBody';
-import UTMParameters from './UTMParameters';
-import UTMView from './UTMView';
-import Tag from '@/assets/tag.svg';
-import { REPORT_TYPES } from '@/lib/constants';
-
-const defaultParameters = {
- type: REPORT_TYPES.utm,
- parameters: {},
-};
-
-export default function UTMReport({ reportId }: { reportId?: string }) {
- return (
-
- } />
-
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(main)/reports/utm/UTMReportPage.tsx b/src/app/(main)/reports/utm/UTMReportPage.tsx
deleted file mode 100644
index 926a42632..000000000
--- a/src/app/(main)/reports/utm/UTMReportPage.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import UTMReport from './UTMReport';
-
-export default function UTMReportPage() {
- return ;
-}
diff --git a/src/app/(main)/reports/utm/UTMView.module.css b/src/app/(main)/reports/utm/UTMView.module.css
deleted file mode 100644
index fa7cc0b42..000000000
--- a/src/app/(main)/reports/utm/UTMView.module.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.title {
- font-size: 24px;
- line-height: 36px;
- font-weight: 700;
-}
-
-.row {
- display: grid;
- grid-template-columns: 50% 50%;
- gap: 20px;
- border-bottom: 1px solid var(--base300);
- padding-bottom: 30px;
- margin-bottom: 30px;
-}
diff --git a/src/app/(main)/reports/utm/UTMView.tsx b/src/app/(main)/reports/utm/UTMView.tsx
deleted file mode 100644
index a8200c2cf..000000000
--- a/src/app/(main)/reports/utm/UTMView.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import { useContext } from 'react';
-import { firstBy } from 'thenby';
-import { ReportContext } from '../[reportId]/Report';
-import { CHART_COLORS, UTM_PARAMS } from '@/lib/constants';
-import PieChart from '@/components/charts/PieChart';
-import ListTable from '@/components/metrics/ListTable';
-import styles from './UTMView.module.css';
-import { useMessages } from '@/components/hooks';
-
-function toArray(data: { [key: string]: number } = {}) {
- return Object.keys(data)
- .map(key => {
- return { name: key, value: data[key] };
- })
- .sort(firstBy('value', -1));
-}
-
-function parseParameters(data: any[]) {
- return data.reduce((obj, { url_query, num }) => {
- try {
- const searchParams = new URLSearchParams(url_query);
-
- for (const [key, value] of searchParams) {
- if (key.match(/^utm_(\w+)$/)) {
- const name = value;
- if (!obj[key]) {
- obj[key] = { [name]: Number(num) };
- } else if (!obj[key][name]) {
- obj[key][name] = Number(num);
- } else {
- obj[key][name] += Number(num);
- }
- }
- }
- } catch {
- // Ignore
- }
-
- return obj;
- }, {});
-}
-
-export default function UTMView() {
- const { formatMessage, labels } = useMessages();
- const { report } = useContext(ReportContext);
- const { data } = report || {};
-
- if (!data) {
- return null;
- }
-
- return (
-
- {UTM_PARAMS.map(param => {
- const items = toArray(parseParameters(data)[param]);
- const chartData = {
- labels: items.map(({ name }) => name),
- datasets: [
- {
- data: items.map(({ value }) => value),
- backgroundColor: CHART_COLORS,
- borderWidth: 0,
- },
- ],
- };
- const total = items.reduce((sum, { value }) => {
- return +sum + +value;
- }, 0);
-
- return (
-
-
-
{param.replace(/^utm_/, '')}
-
({
- x: name,
- y: value,
- z: (value / total) * 100,
- }))}
- />
-
-
-
- );
- })}
-
- );
-}
diff --git a/src/app/(main)/reports/utm/page.tsx b/src/app/(main)/reports/utm/page.tsx
deleted file mode 100644
index 7fa506608..000000000
--- a/src/app/(main)/reports/utm/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Metadata } from 'next';
-import UTMReportPage from './UTMReportPage';
-
-export default function () {
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Goals Report',
-};
diff --git a/src/app/(main)/settings/SettingsLayout.tsx b/src/app/(main)/settings/SettingsLayout.tsx
index 08dcc3eb1..1003b61ae 100644
--- a/src/app/(main)/settings/SettingsLayout.tsx
+++ b/src/app/(main)/settings/SettingsLayout.tsx
@@ -1,25 +1,12 @@
'use client';
-import { ReactNode } from 'react';
-import { useLogin, useMessages } from '@/components/hooks';
-import MenuLayout from '@/components/layout/MenuLayout';
+import { Column } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { PageBody } from '@/components/common/PageBody';
-export default function SettingsLayout({ children }: { children: ReactNode }) {
- const { user } = useLogin();
- const { formatMessage, labels } = useMessages();
-
- const items = [
- {
- key: 'websites',
- label: formatMessage(labels.websites),
- url: '/settings/websites',
- },
- { key: 'teams', label: formatMessage(labels.teams), url: '/settings/teams' },
- user.isAdmin && {
- key: 'users',
- label: formatMessage(labels.users),
- url: '/settings/users',
- },
- ].filter(n => n);
-
- return {children} ;
+export function SettingsLayout({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ );
}
diff --git a/src/app/(main)/settings/SettingsNav.tsx b/src/app/(main)/settings/SettingsNav.tsx
new file mode 100644
index 000000000..47cdb9cb5
--- /dev/null
+++ b/src/app/(main)/settings/SettingsNav.tsx
@@ -0,0 +1,106 @@
+import { Column, Focusable, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import Link from 'next/link';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { ArrowLeft, Settings2, UserCircle, Users } from '@/components/icons';
+
+export function SettingsNav({
+ isCollapsed,
+ onItemClick,
+}: {
+ isCollapsed?: boolean;
+ onItemClick?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { renderUrl, pathname } = useNavigation();
+
+ const items = [
+ {
+ label: t(labels.application),
+ items: [
+ {
+ id: 'preferences',
+ label: t(labels.preferences),
+ path: renderUrl('/settings/preferences'),
+ icon: ,
+ },
+ ],
+ },
+ {
+ label: t(labels.account),
+ items: [
+ {
+ id: 'profile',
+ label: t(labels.profile),
+ path: renderUrl('/settings/profile'),
+ icon: ,
+ },
+ {
+ id: 'teams',
+ label: t(labels.teams),
+ path: renderUrl('/settings/teams'),
+ icon: ,
+ },
+ ],
+ },
+ ];
+
+ const selectedKey = items
+ .flatMap(e => e.items)
+ .find(({ path }) => path && pathname.includes(path.split('?')[0]))?.id;
+
+ return (
+
+
+
+
+
+ } label={isCollapsed ? '' : t(labels.back)} padding />
+
+
+ {t(labels.back)}
+
+
+ {items.map(({ label: sectionLabel, items: sectionItems }, index) => (
+
+ {!isCollapsed && (
+
+ {sectionLabel}
+
+ )}
+ {sectionItems.map(({ id, path, label, icon }) => {
+ const isSelected = selectedKey === id;
+ return (
+
+
+
+
+
+
+
+ {label}
+
+
+ );
+ })}
+
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/settings/layout.tsx b/src/app/(main)/settings/layout.tsx
index 573897d5e..4e773a37f 100644
--- a/src/app/(main)/settings/layout.tsx
+++ b/src/app/(main)/settings/layout.tsx
@@ -1,5 +1,5 @@
-import SettingsLayout from './SettingsLayout';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { SettingsLayout } from './SettingsLayout';
export default function ({ children }) {
if (process.env.cloudMode) {
diff --git a/src/app/(main)/settings/preferences/DateRangeSetting.tsx b/src/app/(main)/settings/preferences/DateRangeSetting.tsx
new file mode 100644
index 000000000..6719cd22e
--- /dev/null
+++ b/src/app/(main)/settings/preferences/DateRangeSetting.tsx
@@ -0,0 +1,33 @@
+import { Button, Row } from '@umami/react-zen';
+import { useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { DateFilter } from '@/components/input/DateFilter';
+import { DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE } from '@/lib/constants';
+import { getItem, setItem } from '@/lib/storage';
+
+export function DateRangeSetting() {
+ const { t, labels } = useMessages();
+ const [date, setDate] = useState(getItem(DATE_RANGE_CONFIG) || DEFAULT_DATE_RANGE_VALUE);
+
+ const handleChange = (value: string) => {
+ setItem(DATE_RANGE_CONFIG, value);
+ setDate(value);
+ };
+
+ const handleReset = () => {
+ setItem(DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE);
+ setDate(DEFAULT_DATE_RANGE_VALUE);
+ };
+
+ return (
+
+
+ {t(labels.reset)}
+
+ );
+}
diff --git a/src/app/(main)/profile/LanguageSetting.tsx b/src/app/(main)/settings/preferences/LanguageSetting.tsx
similarity index 52%
rename from src/app/(main)/profile/LanguageSetting.tsx
rename to src/app/(main)/settings/preferences/LanguageSetting.tsx
index fd8699fd1..34470c36c 100644
--- a/src/app/(main)/profile/LanguageSetting.tsx
+++ b/src/app/(main)/settings/preferences/LanguageSetting.tsx
@@ -1,16 +1,14 @@
+import { Button, ListItem, Row, Select } from '@umami/react-zen';
import { useState } from 'react';
-import { Button, Dropdown, Item, Flexbox } from 'react-basics';
import { useLocale, useMessages } from '@/components/hooks';
import { DEFAULT_LOCALE } from '@/lib/constants';
import { languages } from '@/lib/lang';
-import styles from './LanguageSetting.module.css';
export function LanguageSetting() {
const [search, setSearch] = useState('');
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const { locale, saveLocale } = useLocale();
-
- const options = search
+ const items = search
? Object.keys(languages).filter(n => {
return (
n.toLowerCase().includes(search.toLowerCase()) ||
@@ -21,24 +19,31 @@ export function LanguageSetting() {
const handleReset = () => saveLocale(DEFAULT_LOCALE);
- const renderValue = (value: string | number) => languages?.[value]?.label;
+ const handleOpen = (isOpen: boolean) => {
+ if (isOpen) {
+ setSearch('');
+ }
+ };
return (
-
-
+ saveLocale(val as string)}
- allowSearch={true}
+ allowSearch
onSearch={setSearch}
- menuProps={{ className: styles.menu }}
+ onOpenChange={handleOpen}
+ listProps={{ style: { maxHeight: 300 } }}
+ style={{ minWidth: '250px' }}
>
- {item => - {languages[item].label}
}
-
- {formatMessage(labels.reset)}
-
+ {items.map(item => (
+
+ {languages[item].label}
+
+ ))}
+ {!items.length && }
+
+ {t(labels.reset)}
+
);
}
-
-export default LanguageSetting;
diff --git a/src/app/(main)/settings/preferences/PreferenceSettings.tsx b/src/app/(main)/settings/preferences/PreferenceSettings.tsx
new file mode 100644
index 000000000..55695946b
--- /dev/null
+++ b/src/app/(main)/settings/preferences/PreferenceSettings.tsx
@@ -0,0 +1,41 @@
+import { Column, Label } from '@umami/react-zen';
+import { useLoginQuery, useMessages } from '@/components/hooks';
+import { DateRangeSetting } from './DateRangeSetting';
+import { LanguageSetting } from './LanguageSetting';
+import { ThemeSetting } from './ThemeSetting';
+import { TimezoneSetting } from './TimezoneSetting';
+import { VersionSetting } from './VersionSetting';
+
+export function PreferenceSettings() {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+
+ if (!user) {
+ return null;
+ }
+
+ return (
+
+
+ {t(labels.defaultDateRange)}
+
+
+
+ {t(labels.timezone)}
+
+
+
+ {t(labels.language)}
+
+
+
+ {t(labels.theme)}
+
+
+
+ {t(labels.version)}
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/preferences/PreferencesPage.tsx b/src/app/(main)/settings/preferences/PreferencesPage.tsx
new file mode 100644
index 000000000..2cbfd6dbf
--- /dev/null
+++ b/src/app/(main)/settings/preferences/PreferencesPage.tsx
@@ -0,0 +1,22 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { PreferenceSettings } from './PreferenceSettings';
+
+export function PreferencesPage() {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/preferences/ThemeSetting.tsx b/src/app/(main)/settings/preferences/ThemeSetting.tsx
new file mode 100644
index 000000000..03bd6a6e4
--- /dev/null
+++ b/src/app/(main)/settings/preferences/ThemeSetting.tsx
@@ -0,0 +1,21 @@
+import { Button, Icon, Row, useTheme } from '@umami/react-zen';
+import { Moon, Sun } from '@/components/icons';
+
+export function ThemeSetting() {
+ const { theme, setTheme } = useTheme();
+
+ return (
+
+ setTheme('light')}>
+
+
+
+
+ setTheme('dark')}>
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/preferences/TimezoneSetting.tsx b/src/app/(main)/settings/preferences/TimezoneSetting.tsx
new file mode 100644
index 000000000..f206a6e4f
--- /dev/null
+++ b/src/app/(main)/settings/preferences/TimezoneSetting.tsx
@@ -0,0 +1,45 @@
+import { Button, ListItem, Row, Select } from '@umami/react-zen';
+import { useState } from 'react';
+import { useMessages, useTimezone } from '@/components/hooks';
+import { getTimezone } from '@/lib/date';
+
+const timezones = Intl.supportedValuesOf('timeZone');
+
+export function TimezoneSetting() {
+ const [search, setSearch] = useState('');
+ const { t, labels } = useMessages();
+ const { timezone, saveTimezone } = useTimezone();
+ const items = search
+ ? timezones.filter(n => n.toLowerCase().includes(search.toLowerCase()))
+ : timezones;
+
+ const handleReset = () => saveTimezone(getTimezone());
+
+ const handleOpen = isOpen => {
+ if (isOpen) {
+ setSearch('');
+ }
+ };
+
+ return (
+
+ saveTimezone(value)}
+ allowSearch={true}
+ onSearch={setSearch}
+ onOpenChange={handleOpen}
+ listProps={{ style: { maxHeight: 300 } }}
+ style={{ minWidth: '250px' }}
+ >
+ {items.map((item: any) => (
+
+ {item}
+
+ ))}
+ {!items.length && }
+
+ {t(labels.reset)}
+
+ );
+}
diff --git a/src/app/(main)/settings/preferences/VersionSetting.tsx b/src/app/(main)/settings/preferences/VersionSetting.tsx
new file mode 100644
index 000000000..afca1de6b
--- /dev/null
+++ b/src/app/(main)/settings/preferences/VersionSetting.tsx
@@ -0,0 +1,8 @@
+'use client';
+
+import { Text } from '@umami/react-zen';
+import { CURRENT_VERSION } from '@/lib/constants';
+
+export function VersionSetting() {
+ return {CURRENT_VERSION} ;
+}
diff --git a/src/app/(main)/settings/preferences/page.tsx b/src/app/(main)/settings/preferences/page.tsx
new file mode 100644
index 000000000..dd16870e1
--- /dev/null
+++ b/src/app/(main)/settings/preferences/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { PreferencesPage } from './PreferencesPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Preferences',
+};
diff --git a/src/app/(main)/settings/profile/PasswordChangeButton.tsx b/src/app/(main)/settings/profile/PasswordChangeButton.tsx
new file mode 100644
index 000000000..105269dd4
--- /dev/null
+++ b/src/app/(main)/settings/profile/PasswordChangeButton.tsx
@@ -0,0 +1,29 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen';
+import { useMessages } from '@/components/hooks';
+import { LockKeyhole } from '@/components/icons';
+import { PasswordEditForm } from './PasswordEditForm';
+
+export function PasswordChangeButton() {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+
+ const handleSave = () => {
+ toast(t(messages.saved));
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.changePassword)}
+
+
+
+ {({ close }) => }
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/profile/PasswordEditForm.tsx b/src/app/(main)/settings/profile/PasswordEditForm.tsx
new file mode 100644
index 000000000..8a1615a07
--- /dev/null
+++ b/src/app/(main)/settings/profile/PasswordEditForm.tsx
@@ -0,0 +1,67 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ PasswordField,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+
+export function PasswordEditForm({ onSave, onClose }) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery('/me/password');
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave();
+ onClose();
+ },
+ });
+ };
+
+ const samePassword = (value: string, values: Record) => {
+ if (value !== values.newPassword) {
+ return t(messages.noMatchPassword);
+ }
+ return true;
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/settings/profile/ProfileHeader.tsx b/src/app/(main)/settings/profile/ProfileHeader.tsx
new file mode 100644
index 000000000..09cabbe2c
--- /dev/null
+++ b/src/app/(main)/settings/profile/ProfileHeader.tsx
@@ -0,0 +1,8 @@
+import { SectionHeader } from '@/components/common/SectionHeader';
+import { useMessages } from '@/components/hooks';
+
+export function ProfileHeader() {
+ const { t, labels } = useMessages();
+
+ return ;
+}
diff --git a/src/app/(main)/settings/profile/ProfilePage.tsx b/src/app/(main)/settings/profile/ProfilePage.tsx
new file mode 100644
index 000000000..896464a13
--- /dev/null
+++ b/src/app/(main)/settings/profile/ProfilePage.tsx
@@ -0,0 +1,22 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { ProfileSettings } from './ProfileSettings';
+
+export function ProfilePage() {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/profile/ProfileSettings.tsx b/src/app/(main)/settings/profile/ProfileSettings.tsx
new file mode 100644
index 000000000..e991dcda5
--- /dev/null
+++ b/src/app/(main)/settings/profile/ProfileSettings.tsx
@@ -0,0 +1,51 @@
+import { Column, Label, Row } from '@umami/react-zen';
+import { useConfig, useLoginQuery, useMessages } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { PasswordChangeButton } from './PasswordChangeButton';
+
+export function ProfileSettings() {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+ const { cloudMode } = useConfig();
+
+ if (!user) {
+ return null;
+ }
+
+ const { username, role } = user;
+
+ const renderRole = (value: string) => {
+ if (value === ROLES.user) {
+ return t(labels.user);
+ }
+ if (value === ROLES.admin) {
+ return t(labels.admin);
+ }
+ if (value === ROLES.viewOnly) {
+ return t(labels.viewOnly);
+ }
+
+ return t(labels.unknown);
+ };
+
+ return (
+
+
+ {t(labels.username)}
+ {username}
+
+
+ {t(labels.role)}
+ {renderRole(role)}
+
+ {!cloudMode && (
+
+ {t(labels.password)}
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/profile/page.tsx b/src/app/(main)/settings/profile/page.tsx
similarity index 58%
rename from src/app/(main)/profile/page.tsx
rename to src/app/(main)/settings/profile/page.tsx
index 0c1f0082e..6060b91f6 100644
--- a/src/app/(main)/profile/page.tsx
+++ b/src/app/(main)/settings/profile/page.tsx
@@ -1,5 +1,5 @@
-import { Metadata } from 'next';
-import ProfilePage from './ProfilePage';
+import type { Metadata } from 'next';
+import { ProfilePage } from './ProfilePage';
export default function () {
return ;
diff --git a/src/app/(main)/settings/teams/TeamAddForm.tsx b/src/app/(main)/settings/teams/TeamAddForm.tsx
deleted file mode 100644
index e940aa17a..000000000
--- a/src/app/(main)/settings/teams/TeamAddForm.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { useApi, useMessages } from '@/components/hooks';
-import {
- Button,
- Form,
- FormButtons,
- FormInput,
- FormRow,
- SubmitButton,
- TextField,
-} from 'react-basics';
-
-export function TeamAddForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) {
- const { formatMessage, labels } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post('/teams', data),
- });
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- onSave?.();
- onClose?.();
- },
- });
- };
-
- return (
-
- );
-}
-
-export default TeamAddForm;
diff --git a/src/app/(main)/settings/teams/TeamJoinForm.tsx b/src/app/(main)/settings/teams/TeamJoinForm.tsx
deleted file mode 100644
index 78be872c3..000000000
--- a/src/app/(main)/settings/teams/TeamJoinForm.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useRef } from 'react';
-import {
- Form,
- FormRow,
- FormInput,
- FormButtons,
- TextField,
- Button,
- SubmitButton,
-} from 'react-basics';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-
-export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) {
- const { formatMessage, labels } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error } = useMutation({ mutationFn: (data: any) => post('/teams/join', data) });
- const ref = useRef(null);
- const { touch } = useModified();
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- touch('teams:members');
- onSave?.();
- onClose?.();
- },
- });
- };
-
- return (
-
- );
-}
-
-export default TeamJoinForm;
diff --git a/src/app/(main)/settings/teams/TeamLeaveButton.tsx b/src/app/(main)/settings/teams/TeamLeaveButton.tsx
deleted file mode 100644
index 5f5b54f3e..000000000
--- a/src/app/(main)/settings/teams/TeamLeaveButton.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { useLocale, useLogin, useMessages, useModified } from '@/components/hooks';
-import { useRouter } from 'next/navigation';
-import { Button, Icon, Icons, Modal, ModalTrigger, Text } from 'react-basics';
-import TeamDeleteForm from './TeamLeaveForm';
-
-export function TeamLeaveButton({ teamId, teamName }: { teamId: string; teamName: string }) {
- const { formatMessage, labels } = useMessages();
- const router = useRouter();
- const { dir } = useLocale();
- const { user } = useLogin();
- const { touch } = useModified();
-
- const handleLeave = async () => {
- touch('teams');
- router.push('/settings/teams');
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.leave)}
-
-
- {(close: () => void) => (
-
- )}
-
-
- );
-}
-
-export default TeamLeaveButton;
diff --git a/src/app/(main)/settings/teams/TeamLeaveForm.tsx b/src/app/(main)/settings/teams/TeamLeaveForm.tsx
deleted file mode 100644
index 389ba4ea7..000000000
--- a/src/app/(main)/settings/teams/TeamLeaveForm.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import ConfirmationForm from '@/components/common/ConfirmationForm';
-
-export function TeamLeaveForm({
- teamId,
- userId,
- teamName,
- onSave,
- onClose,
-}: {
- teamId: string;
- userId: string;
- teamName: string;
- onSave: () => void;
- onClose: () => void;
-}) {
- const { formatMessage, labels, messages } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: () => del(`/teams/${teamId}/users/${userId}`),
- });
- const { touch } = useModified();
-
- const handleConfirm = async () => {
- mutate(null, {
- onSuccess: async () => {
- touch('teams:members');
- onSave();
- onClose();
- },
- });
- };
-
- return (
- {teamName},
- })}
- onConfirm={handleConfirm}
- onClose={onClose}
- isLoading={isPending}
- error={error}
- />
- );
-}
-
-export default TeamLeaveForm;
diff --git a/src/app/(main)/settings/teams/TeamsAddButton.tsx b/src/app/(main)/settings/teams/TeamsAddButton.tsx
deleted file mode 100644
index 58c138a8a..000000000
--- a/src/app/(main)/settings/teams/TeamsAddButton.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Button, Icon, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
-import Icons from '@/components/icons';
-import { useMessages, useModified } from '@/components/hooks';
-import TeamAddForm from './TeamAddForm';
-import { messages } from '@/components/messages';
-
-export function TeamsAddButton({ onSave }: { onSave?: () => void }) {
- const { formatMessage, labels } = useMessages();
- const { showToast } = useToasts();
- const { touch } = useModified();
-
- const handleSave = async () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- touch('teams');
- onSave?.();
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.createTeam)}
-
-
- {(close: () => void) => }
-
-
- );
-}
-
-export default TeamsAddButton;
diff --git a/src/app/(main)/settings/teams/TeamsDataTable.tsx b/src/app/(main)/settings/teams/TeamsDataTable.tsx
deleted file mode 100644
index 9b8c9b278..000000000
--- a/src/app/(main)/settings/teams/TeamsDataTable.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import DataTable from '@/components/common/DataTable';
-import TeamsTable from '@/app/(main)/settings/teams/TeamsTable';
-import { useLogin, useTeams } from '@/components/hooks';
-import { ReactNode } from 'react';
-
-export function TeamsDataTable({
- allowEdit,
- showActions,
- children,
-}: {
- allowEdit?: boolean;
- showActions?: boolean;
- children?: ReactNode;
-}) {
- const { user } = useLogin();
- const queryResult = useTeams(user.id);
-
- return (
- children}>
- {({ data }) => {
- return ;
- }}
-
- );
-}
-
-export default TeamsDataTable;
diff --git a/src/app/(main)/settings/teams/TeamsHeader.tsx b/src/app/(main)/settings/teams/TeamsHeader.tsx
deleted file mode 100644
index e1911a197..000000000
--- a/src/app/(main)/settings/teams/TeamsHeader.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Flexbox } from 'react-basics';
-import PageHeader from '@/components/layout/PageHeader';
-import { ROLES } from '@/lib/constants';
-import { useLogin, useMessages } from '@/components/hooks';
-import TeamsJoinButton from './TeamsJoinButton';
-import TeamsAddButton from './TeamsAddButton';
-
-export function TeamsHeader({ allowCreate = true }: { allowCreate?: boolean }) {
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
- const cloudMode = !!process.env.cloudMode;
-
- return (
-
-
- {!cloudMode && }
- {allowCreate && user.role !== ROLES.viewOnly && }
-
-
- );
-}
-
-export default TeamsHeader;
diff --git a/src/app/(main)/settings/teams/TeamsJoinButton.tsx b/src/app/(main)/settings/teams/TeamsJoinButton.tsx
deleted file mode 100644
index bbf2d6858..000000000
--- a/src/app/(main)/settings/teams/TeamsJoinButton.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Button, Icon, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
-import Icons from '@/components/icons';
-import { useMessages, useModified } from '@/components/hooks';
-import TeamJoinForm from './TeamJoinForm';
-
-export function TeamsJoinButton() {
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
- const { touch } = useModified();
-
- const handleJoin = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- touch('teams');
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.joinTeam)}
-
-
- {close => }
-
-
- );
-}
-
-export default TeamsJoinButton;
diff --git a/src/app/(main)/settings/teams/TeamsSettingsPage.tsx b/src/app/(main)/settings/teams/TeamsSettingsPage.tsx
index 9b45845bc..dc3e3bc85 100644
--- a/src/app/(main)/settings/teams/TeamsSettingsPage.tsx
+++ b/src/app/(main)/settings/teams/TeamsSettingsPage.tsx
@@ -1,12 +1,16 @@
'use client';
-import TeamsDataTable from './TeamsDataTable';
-import TeamsHeader from './TeamsHeader';
+import { Column } from '@umami/react-zen';
+import { TeamsDataTable } from '@/app/(main)/teams/TeamsDataTable';
+import { TeamsHeader } from '@/app/(main)/teams/TeamsHeader';
+import { Panel } from '@/components/common/Panel';
-export default function TeamsSettingsPage() {
+export function TeamsSettingsPage() {
return (
- <>
+
-
- >
+
+
+
+
);
}
diff --git a/src/app/(main)/settings/teams/TeamsTable.tsx b/src/app/(main)/settings/teams/TeamsTable.tsx
deleted file mode 100644
index 8e7efa275..000000000
--- a/src/app/(main)/settings/teams/TeamsTable.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { GridColumn, GridTable, Icon, Text } from 'react-basics';
-import { useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { ROLES } from '@/lib/constants';
-import LinkButton from '@/components/common/LinkButton';
-
-export function TeamsTable({
- data = [],
- showActions = true,
-}: {
- data: any[];
- allowEdit?: boolean;
- showActions?: boolean;
-}) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
-
- {row => row.teamUser.find(({ role }) => role === ROLES.teamOwner)?.user?.username}
-
-
- {row => row._count.website}
-
-
- {row => row._count.teamUser}
-
- {showActions && (
-
- {row => {
- const { id } = row;
-
- return (
-
-
-
-
- {formatMessage(labels.view)}
-
- );
- }}
-
- )}
-
- );
-}
-
-export default TeamsTable;
diff --git a/src/app/(main)/settings/teams/WebsiteTags.module.css b/src/app/(main)/settings/teams/WebsiteTags.module.css
deleted file mode 100644
index 5ca7af51e..000000000
--- a/src/app/(main)/settings/teams/WebsiteTags.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.filters {
- display: flex;
- justify-content: flex-start;
- align-items: flex-start;
-}
-
-.tag {
- text-align: center;
- margin-bottom: 10px;
- margin-inline-end: 20px;
-}
diff --git a/src/app/(main)/settings/teams/WebsiteTags.tsx b/src/app/(main)/settings/teams/WebsiteTags.tsx
deleted file mode 100644
index 4a0f109d8..000000000
--- a/src/app/(main)/settings/teams/WebsiteTags.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Button, Icon, Icons, Text } from 'react-basics';
-import styles from './WebsiteTags.module.css';
-
-export function WebsiteTags({
- items = [],
- websites = [],
- onClick,
-}: {
- items: any[];
- websites: any[];
- onClick: (e: Event) => void;
-}) {
- if (websites.length === 0) {
- return null;
- }
-
- return (
-
- {websites.map(websiteId => {
- const website = items.find(a => a.id === websiteId);
-
- return (
-
- onClick(websiteId)} variant="primary" size="sm">
-
- {`${website.name}`}
-
-
-
-
-
-
- );
- })}
-
- );
-}
-
-export default WebsiteTags;
diff --git a/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx b/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx
new file mode 100644
index 000000000..9539625f8
--- /dev/null
+++ b/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx
@@ -0,0 +1,11 @@
+'use client';
+import { TeamSettings } from '@/app/(main)/teams/[teamId]/TeamSettings';
+import { TeamProvider } from '@/app/(main)/teams/TeamProvider';
+
+export function TeamSettingsPage({ teamId }: { teamId: string }) {
+ return (
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/teams/[teamId]/page.tsx b/src/app/(main)/settings/teams/[teamId]/page.tsx
new file mode 100644
index 000000000..58a380bc2
--- /dev/null
+++ b/src/app/(main)/settings/teams/[teamId]/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { TeamSettingsPage } from './TeamSettingsPage';
+
+export default async function ({ params }: { params: Promise<{ teamId: string }> }) {
+ const { teamId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Teams',
+};
diff --git a/src/app/(main)/settings/teams/page.tsx b/src/app/(main)/settings/teams/page.tsx
index 4342b607f..a0913f45a 100644
--- a/src/app/(main)/settings/teams/page.tsx
+++ b/src/app/(main)/settings/teams/page.tsx
@@ -1,5 +1,5 @@
-import { Metadata } from 'next';
-import TeamsSettingsPage from './TeamsSettingsPage';
+import type { Metadata } from 'next';
+import { TeamsSettingsPage } from './TeamsSettingsPage';
export default function () {
return ;
diff --git a/src/app/(main)/settings/users/UserAddButton.tsx b/src/app/(main)/settings/users/UserAddButton.tsx
deleted file mode 100644
index 674771b6e..000000000
--- a/src/app/(main)/settings/users/UserAddButton.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Button, Icon, Text, Modal, Icons, ModalTrigger, useToasts } from 'react-basics';
-import UserAddForm from './UserAddForm';
-import { useMessages, useModified } from '@/components/hooks';
-
-export function UserAddButton({ onSave }: { onSave?: () => void }) {
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
- const { touch } = useModified();
-
- const handleSave = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- touch('users');
- onSave?.();
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.createUser)}
-
-
- {(close: () => void) => }
-
-
- );
-}
-
-export default UserAddButton;
diff --git a/src/app/(main)/settings/users/UserAddForm.tsx b/src/app/(main)/settings/users/UserAddForm.tsx
deleted file mode 100644
index a6998e5da..000000000
--- a/src/app/(main)/settings/users/UserAddForm.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import {
- Dropdown,
- Item,
- Form,
- FormRow,
- FormButtons,
- FormInput,
- TextField,
- PasswordField,
- SubmitButton,
- Button,
-} from 'react-basics';
-import { useApi, useMessages } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-import { messages } from '@/components/messages';
-
-export function UserAddForm({ onSave, onClose }) {
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post(`/users`, data),
- });
- const { formatMessage, labels } = useMessages();
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- onSave(data);
- onClose();
- },
- });
- };
-
- const renderValue = (value: string) => {
- if (value === ROLES.user) {
- return formatMessage(labels.user);
- }
- if (value === ROLES.admin) {
- return formatMessage(labels.admin);
- }
- if (value === ROLES.viewOnly) {
- return formatMessage(labels.viewOnly);
- }
- };
-
- return (
-
- );
-}
-
-export default UserAddForm;
diff --git a/src/app/(main)/settings/users/UserDeleteButton.tsx b/src/app/(main)/settings/users/UserDeleteButton.tsx
deleted file mode 100644
index d4c3da0a0..000000000
--- a/src/app/(main)/settings/users/UserDeleteButton.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { Button, Icon, Icons, Modal, ModalTrigger, Text } from 'react-basics';
-import { useMessages, useLogin } from '@/components/hooks';
-import UserDeleteForm from './UserDeleteForm';
-
-export function UserDeleteButton({
- userId,
- username,
- onDelete,
-}: {
- userId: string;
- username: string;
- onDelete?: () => void;
-}) {
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
-
- return (
-
-
-
-
-
- {formatMessage(labels.delete)}
-
-
- {(close: () => void) => (
-
- )}
-
-
- );
-}
-
-export default UserDeleteButton;
diff --git a/src/app/(main)/settings/users/UserDeleteForm.tsx b/src/app/(main)/settings/users/UserDeleteForm.tsx
deleted file mode 100644
index 5c307cdcc..000000000
--- a/src/app/(main)/settings/users/UserDeleteForm.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import ConfirmationForm from '@/components/common/ConfirmationForm';
-
-export function UserDeleteForm({ userId, username, onSave, onClose }) {
- const { messages, labels, formatMessage } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({ mutationFn: () => del(`/users/${userId}`) });
- const { touch } = useModified();
-
- const handleConfirm = async () => {
- mutate(null, {
- onSuccess: async () => {
- touch('users');
- onSave?.();
- onClose?.();
- },
- });
- };
-
- return (
- {username},
- })}
- onConfirm={handleConfirm}
- onClose={onClose}
- buttonLabel={formatMessage(labels.delete)}
- isLoading={isPending}
- error={error}
- />
- );
-}
-
-export default UserDeleteForm;
diff --git a/src/app/(main)/settings/users/UsersDataTable.tsx b/src/app/(main)/settings/users/UsersDataTable.tsx
deleted file mode 100644
index 867f4090d..000000000
--- a/src/app/(main)/settings/users/UsersDataTable.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import DataTable from '@/components/common/DataTable';
-import { useUsers } from '@/components/hooks';
-import UsersTable from './UsersTable';
-import { ReactNode } from 'react';
-
-export function UsersDataTable({
- showActions,
- children,
-}: {
- showActions?: boolean;
- children?: ReactNode;
-}) {
- const queryResult = useUsers();
-
- return (
- children}>
- {({ data }) => }
-
- );
-}
-
-export default UsersDataTable;
diff --git a/src/app/(main)/settings/users/UsersHeader.tsx b/src/app/(main)/settings/users/UsersHeader.tsx
deleted file mode 100644
index d07a159f6..000000000
--- a/src/app/(main)/settings/users/UsersHeader.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import PageHeader from '@/components/layout/PageHeader';
-import { useMessages } from '@/components/hooks';
-import UserAddButton from './UserAddButton';
-
-export function UsersHeader({ onAdd }: { onAdd?: () => void }) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
-
- );
-}
-
-export default UsersHeader;
diff --git a/src/app/(main)/settings/users/UsersSettingsPage.tsx b/src/app/(main)/settings/users/UsersSettingsPage.tsx
deleted file mode 100644
index 664f58d1b..000000000
--- a/src/app/(main)/settings/users/UsersSettingsPage.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-'use client';
-import UsersDataTable from './UsersDataTable';
-import UsersHeader from './UsersHeader';
-
-export default function UsersSettingsPage() {
- return (
- <>
-
-
- >
- );
-}
diff --git a/src/app/(main)/settings/users/UsersTable.tsx b/src/app/(main)/settings/users/UsersTable.tsx
deleted file mode 100644
index 197995f01..000000000
--- a/src/app/(main)/settings/users/UsersTable.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Text, Icon, Icons, GridTable, GridColumn } from 'react-basics';
-import { formatDistance } from 'date-fns';
-import { ROLES } from '@/lib/constants';
-import { useMessages, useLocale } from '@/components/hooks';
-import UserDeleteButton from './UserDeleteButton';
-import LinkButton from '@/components/common/LinkButton';
-
-export function UsersTable({
- data = [],
- showActions = true,
-}: {
- data: any[];
- showActions?: boolean;
-}) {
- const { formatMessage, labels } = useMessages();
- const { dateLocale } = useLocale();
-
- return (
-
-
-
- {row =>
- formatMessage(
- labels[Object.keys(ROLES).find(key => ROLES[key] === row.role)] || labels.unknown,
- )
- }
-
-
- {row =>
- formatDistance(new Date(row.createdAt), new Date(), {
- addSuffix: true,
- locale: dateLocale,
- })
- }
-
-
- {row => row._count.website}
-
- {showActions && (
-
- {row => {
- const { id, username } = row;
- return (
- <>
-
-
-
-
-
- {formatMessage(labels.edit)}
-
- >
- );
- }}
-
- )}
-
- );
-}
-
-export default UsersTable;
diff --git a/src/app/(main)/settings/users/[userId]/UserEditForm.tsx b/src/app/(main)/settings/users/[userId]/UserEditForm.tsx
deleted file mode 100644
index 89bd5c024..000000000
--- a/src/app/(main)/settings/users/[userId]/UserEditForm.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import {
- Dropdown,
- Item,
- Form,
- FormRow,
- FormButtons,
- FormInput,
- TextField,
- SubmitButton,
- PasswordField,
-} from 'react-basics';
-import { useApi, useLogin, useMessages } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-import { useContext, useRef } from 'react';
-import { UserContext } from './UserProvider';
-
-export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () => void }) {
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error } = useMutation({
- mutationFn: ({
- username,
- password,
- role,
- }: {
- username: string;
- password: string;
- role: string;
- }) => post(`/users/${userId}`, { username, password, role }),
- });
- const ref = useRef(null);
- const user = useContext(UserContext);
- const { user: login } = useLogin();
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- ref.current.reset(data);
- onSave?.();
- },
- });
- };
-
- const renderValue = (value: string) => {
- if (value === ROLES.user) {
- return formatMessage(labels.user);
- }
- if (value === ROLES.admin) {
- return formatMessage(labels.admin);
- }
- if (value === ROLES.viewOnly) {
- return formatMessage(labels.viewOnly);
- }
- };
-
- return (
-
- );
-}
-
-export default UserEditForm;
diff --git a/src/app/(main)/settings/users/[userId]/UserPage.tsx b/src/app/(main)/settings/users/[userId]/UserPage.tsx
deleted file mode 100644
index 50d5ab7ed..000000000
--- a/src/app/(main)/settings/users/[userId]/UserPage.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-'use client';
-import UserSettings from './UserSettings';
-import UserProvider from './UserProvider';
-
-export default function ({ userId }: { userId: string }) {
- return (
-
-
-
- );
-}
diff --git a/src/app/(main)/settings/users/[userId]/UserProvider.tsx b/src/app/(main)/settings/users/[userId]/UserProvider.tsx
deleted file mode 100644
index ed559c910..000000000
--- a/src/app/(main)/settings/users/[userId]/UserProvider.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { createContext, ReactNode, useEffect } from 'react';
-import { useModified, useUser } from '@/components/hooks';
-import { Loading } from 'react-basics';
-
-export const UserContext = createContext(null);
-
-export function UserProvider({ userId, children }: { userId: string; children: ReactNode }) {
- const { modified } = useModified(`user:${userId}`);
- const { data: user, isFetching, isLoading, refetch } = useUser(userId);
-
- useEffect(() => {
- if (modified) {
- refetch();
- }
- }, [modified]);
-
- if (isFetching && isLoading) {
- return ;
- }
-
- return {children} ;
-}
-
-export default UserProvider;
diff --git a/src/app/(main)/settings/users/[userId]/UserSettings.tsx b/src/app/(main)/settings/users/[userId]/UserSettings.tsx
deleted file mode 100644
index 0d98205ff..000000000
--- a/src/app/(main)/settings/users/[userId]/UserSettings.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Key, useContext, useState } from 'react';
-import { Item, Tabs, useToasts } from 'react-basics';
-import Icons from '@/components/icons';
-import UserEditForm from './UserEditForm';
-import PageHeader from '@/components/layout/PageHeader';
-import { useMessages } from '@/components/hooks';
-import UserWebsites from './UserWebsites';
-import { UserContext } from './UserProvider';
-import Breadcrumb from '@/components/common/Breadcrumb';
-
-export function UserSettings({ userId }: { userId: string }) {
- const { formatMessage, labels, messages } = useMessages();
- const [tab, setTab] = useState('details');
- const user = useContext(UserContext);
- const { showToast } = useToasts();
-
- const handleSave = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- };
-
- const breadcrumb = (
-
- );
-
- return (
- <>
- } breadcrumb={breadcrumb} />
-
- - {formatMessage(labels.details)}
- - {formatMessage(labels.websites)}
-
- {tab === 'details' && }
- {tab === 'websites' && }
- >
- );
-}
-
-export default UserSettings;
diff --git a/src/app/(main)/settings/users/[userId]/UserWebsites.tsx b/src/app/(main)/settings/users/[userId]/UserWebsites.tsx
deleted file mode 100644
index 15521b17b..000000000
--- a/src/app/(main)/settings/users/[userId]/UserWebsites.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import WebsitesTable from '@/app/(main)/settings/websites/WebsitesTable';
-import DataTable from '@/components/common/DataTable';
-import { useWebsites } from '@/components/hooks';
-
-export function UserWebsites({ userId }) {
- const queryResult = useWebsites({ userId });
-
- return (
-
- {({ data }) => (
-
- )}
-
- );
-}
-
-export default UserWebsites;
diff --git a/src/app/(main)/settings/users/[userId]/page.tsx b/src/app/(main)/settings/users/[userId]/page.tsx
deleted file mode 100644
index 3b3a3fac9..000000000
--- a/src/app/(main)/settings/users/[userId]/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import UserPage from './UserPage';
-import { Metadata } from 'next';
-
-export default async function ({ params }: { params: { userId: string } }) {
- const { userId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'User Settings',
-};
diff --git a/src/app/(main)/settings/users/page.tsx b/src/app/(main)/settings/users/page.tsx
deleted file mode 100644
index 01d5156f2..000000000
--- a/src/app/(main)/settings/users/page.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Metadata } from 'next';
-import UsersSettingsPage from './UsersSettingsPage';
-
-export default function () {
- return ;
-}
-export const metadata: Metadata = {
- title: 'Users',
-};
diff --git a/src/app/(main)/settings/websites/WebsiteAddButton.tsx b/src/app/(main)/settings/websites/WebsiteAddButton.tsx
deleted file mode 100644
index 6f32fc9f8..000000000
--- a/src/app/(main)/settings/websites/WebsiteAddButton.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useMessages, useModified } from '@/components/hooks';
-import { Button, Icon, Icons, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
-import WebsiteAddForm from './WebsiteAddForm';
-
-export function WebsiteAddButton({ teamId, onSave }: { teamId: string; onSave?: () => void }) {
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
- const { touch } = useModified();
-
- const handleSave = async () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- touch('websites');
- onSave?.();
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.addWebsite)}
-
-
- {(close: () => void) => (
-
- )}
-
-
- );
-}
-
-export default WebsiteAddButton;
diff --git a/src/app/(main)/settings/websites/WebsiteAddForm.tsx b/src/app/(main)/settings/websites/WebsiteAddForm.tsx
deleted file mode 100644
index 906724120..000000000
--- a/src/app/(main)/settings/websites/WebsiteAddForm.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import {
- Form,
- FormRow,
- FormInput,
- FormButtons,
- TextField,
- Button,
- SubmitButton,
-} from 'react-basics';
-import { useApi } from '@/components/hooks';
-import { DOMAIN_REGEX } from '@/lib/constants';
-import { useMessages } from '@/components/hooks';
-
-export function WebsiteAddForm({
- teamId,
- onSave,
- onClose,
-}: {
- teamId?: string;
- onSave?: () => void;
- onClose?: () => void;
-}) {
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post('/websites', { ...data, teamId }),
- });
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- onSave?.();
- onClose?.();
- },
- });
- };
-
- return (
-
- );
-}
-
-export default WebsiteAddForm;
diff --git a/src/app/(main)/settings/websites/Websites.module.css b/src/app/(main)/settings/websites/Websites.module.css
deleted file mode 100644
index 2a7cc6e79..000000000
--- a/src/app/(main)/settings/websites/Websites.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.website {
- padding-bottom: 30px;
- border-bottom: 1px solid var(--base300);
- margin-bottom: 30px;
- align-self: stretch;
-}
-
-.website:last-child {
- border-bottom: 0;
- margin-bottom: 20px;
-}
diff --git a/src/app/(main)/settings/websites/WebsitesDataTable.tsx b/src/app/(main)/settings/websites/WebsitesDataTable.tsx
deleted file mode 100644
index 023df8573..000000000
--- a/src/app/(main)/settings/websites/WebsitesDataTable.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { ReactNode } from 'react';
-import WebsitesTable from '@/app/(main)/settings/websites/WebsitesTable';
-import DataTable from '@/components/common/DataTable';
-import { useWebsites } from '@/components/hooks';
-
-export function WebsitesDataTable({
- teamId,
- allowEdit = true,
- allowView = true,
- showActions = true,
- children,
-}: {
- teamId?: string;
- allowEdit?: boolean;
- allowView?: boolean;
- showActions?: boolean;
- children?: ReactNode;
-}) {
- const queryResult = useWebsites({ teamId });
-
- return (
- children}>
- {({ data }) => (
-
- )}
-
- );
-}
-
-export default WebsitesDataTable;
diff --git a/src/app/(main)/settings/websites/WebsitesHeader.tsx b/src/app/(main)/settings/websites/WebsitesHeader.tsx
deleted file mode 100644
index 34e87a13e..000000000
--- a/src/app/(main)/settings/websites/WebsitesHeader.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import PageHeader from '@/components/layout/PageHeader';
-import WebsiteAddButton from './WebsiteAddButton';
-
-export interface WebsitesHeaderProps {
- teamId?: string;
- allowCreate?: boolean;
-}
-
-export function WebsitesHeader({ teamId, allowCreate = true }: WebsitesHeaderProps) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
- {allowCreate && }
-
- );
-}
-
-export default WebsitesHeader;
diff --git a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx
index 61909a9e5..d83dfbf02 100644
--- a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx
+++ b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx
@@ -1,17 +1,16 @@
'use client';
-import { useLogin } from '@/components/hooks';
-import WebsitesDataTable from './WebsitesDataTable';
-import WebsitesHeader from './WebsitesHeader';
-import { ROLES } from '@/lib/constants';
+import { Column } from '@umami/react-zen';
+import { WebsitesDataTable } from '@/app/(main)/websites/WebsitesDataTable';
+import { SectionHeader } from '@/components/common/SectionHeader';
+import { useMessages } from '@/components/hooks';
-export default function WebsitesSettingsPage({ teamId }: { teamId: string }) {
- const { user } = useLogin();
- const canCreate = user.role !== ROLES.viewOnly;
+export function WebsitesSettingsPage({ teamId }: { teamId: string }) {
+ const { t, labels } = useMessages();
return (
- <>
-
+
+
- >
+
);
}
diff --git a/src/app/(main)/settings/websites/WebsitesTable.tsx b/src/app/(main)/settings/websites/WebsitesTable.tsx
deleted file mode 100644
index 79749b972..000000000
--- a/src/app/(main)/settings/websites/WebsitesTable.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import { ReactNode } from 'react';
-import { Text, Icon, Icons, GridTable, GridColumn } from 'react-basics';
-import { useMessages, useTeamUrl } from '@/components/hooks';
-import LinkButton from '@/components/common/LinkButton';
-
-export interface WebsitesTableProps {
- data: any[];
- showActions?: boolean;
- allowEdit?: boolean;
- allowView?: boolean;
- teamId?: string;
- children?: ReactNode;
-}
-
-export function WebsitesTable({
- data = [],
- showActions,
- allowEdit,
- allowView,
- children,
-}: WebsitesTableProps) {
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
-
- if (!data?.length) {
- return children;
- }
-
- return (
-
-
-
- {showActions && (
-
- {row => {
- const { id: websiteId } = row;
-
- return (
- <>
- {allowEdit && (
-
-
-
-
- {formatMessage(labels.edit)}
-
- )}
- {allowView && (
-
-
-
-
- {formatMessage(labels.view)}
-
- )}
- >
- );
- }}
-
- )}
-
- );
-}
-
-export default WebsitesTable;
diff --git a/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx b/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx
deleted file mode 100644
index 318e4e95b..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-import {
- Form,
- FormRow,
- FormButtons,
- Flexbox,
- TextField,
- Button,
- Toggle,
- LoadingButton,
-} from 'react-basics';
-import { useContext, useState } from 'react';
-import { getRandomChars } from '@/lib/crypto';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import { WebsiteContext } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-
-const generateId = () => getRandomChars(16);
-
-export function ShareUrl({ hostUrl, onSave }: { hostUrl?: string; onSave?: () => void }) {
- const website = useContext(WebsiteContext);
- const { domain, shareId } = website;
- const { formatMessage, labels, messages } = useMessages();
- const [id, setId] = useState(shareId);
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post(`/websites/${website.id}`, data),
- });
- const { touch } = useModified();
-
- const url = `${hostUrl || window?.location.origin || ''}${
- process.env.basePath || ''
- }/share/${id}/${domain}`;
-
- const handleGenerate = () => {
- setId(generateId());
- };
-
- const handleCheck = (checked: boolean) => {
- const data = {
- name: website.name,
- domain: website.domain,
- shareId: checked ? generateId() : null,
- };
- mutate(data, {
- onSuccess: async () => {
- touch(`website:${website.id}`);
- onSave?.();
- },
- });
- setId(data.shareId);
- };
-
- const handleSave = () => {
- mutate(
- { name: website.name, domain: website.domain, shareId: id },
- {
- onSuccess: async () => {
- touch(`website:${website.id}`);
- onSave?.();
- },
- },
- );
- };
-
- return (
- <>
-
- {formatMessage(labels.enableShareUrl)}
-
- {id && (
-
- )}
- >
- );
-}
-
-export default ShareUrl;
diff --git a/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx b/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx
deleted file mode 100644
index cacdf689b..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { TextArea } from 'react-basics';
-import { useMessages, useConfig } from '@/components/hooks';
-
-const SCRIPT_NAME = 'script.js';
-
-export function TrackingCode({ websiteId, hostUrl }: { websiteId: string; hostUrl?: string }) {
- const { formatMessage, messages } = useMessages();
- const config = useConfig();
-
- const trackerScriptName =
- config?.trackerScriptName?.split(',')?.map((n: string) => n.trim())?.[0] || SCRIPT_NAME;
-
- const url = trackerScriptName?.startsWith('http')
- ? trackerScriptName
- : `${hostUrl || window?.location.origin || ''}${
- process.env.basePath || ''
- }/${trackerScriptName}`;
-
- const code = ``;
-
- return (
- <>
- {formatMessage(messages.trackingCode)}
-
- >
- );
-}
-
-export default TrackingCode;
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx
deleted file mode 100644
index d11f24df7..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import { Button, Modal, ModalTrigger, ActionForm } from 'react-basics';
-import { useRouter } from 'next/navigation';
-import { useLogin, useMessages, useModified, useTeams, useTeamUrl } from '@/components/hooks';
-import WebsiteDeleteForm from './WebsiteDeleteForm';
-import WebsiteResetForm from './WebsiteResetForm';
-import WebsiteTransferForm from './WebsiteTransferForm';
-import { ROLES } from '@/lib/constants';
-
-export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
- const { formatMessage, labels, messages } = useMessages();
- const { user } = useLogin();
- const { touch } = useModified();
- const { teamId, renderTeamUrl } = useTeamUrl();
- const router = useRouter();
- const { result } = useTeams(user.id);
- const canTransferWebsite =
- (
- !teamId &&
- result.data.filter(({ teamUser }) =>
- teamUser.find(
- ({ role, userId }) =>
- [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id,
- ),
- )
- ).length > 0 ||
- (teamId &&
- !!result?.data
- ?.find(({ id }) => id === teamId)
- ?.teamUser.find(({ role, userId }) => role === ROLES.teamOwner && userId === user.id));
-
- const handleSave = () => {
- touch('websites');
- onSave?.();
- router.push(renderTeamUrl(`/settings/websites`));
- };
-
- const handleReset = async () => {
- onSave?.();
- };
-
- return (
- <>
-
-
-
- {formatMessage(labels.transfer)}
-
-
- {(close: () => void) => (
-
- )}
-
-
-
-
-
- {formatMessage(labels.reset)}
-
- {(close: () => void) => (
-
- )}
-
-
-
-
-
-
- {formatMessage(labels.delete)}
-
-
- {(close: () => void) => (
-
- )}
-
-
-
- >
- );
-}
-
-export default WebsiteData;
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteEditForm.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteEditForm.tsx
deleted file mode 100644
index aeef7f343..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteEditForm.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import { useContext, useRef } from 'react';
-import { SubmitButton, Form, FormInput, FormRow, FormButtons, TextField } from 'react-basics';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import { DOMAIN_REGEX } from '@/lib/constants';
-import { WebsiteContext } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-
-export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
- const website = useContext(WebsiteContext);
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error } = useMutation({
- mutationFn: (data: any) => post(`/websites/${websiteId}`, data),
- });
- const ref = useRef(null);
- const { touch } = useModified();
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- ref.current.reset(data);
- touch(`website:${website.id}`);
- onSave?.();
- },
- });
- };
-
- return (
-
- );
-}
-
-export default WebsiteEditForm;
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx
deleted file mode 100644
index 5bea27049..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { WebsiteContext } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-import Breadcrumb from '@/components/common/Breadcrumb';
-import { useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import PageHeader from '@/components/layout/PageHeader';
-import Link from 'next/link';
-import { Key, useContext, useState } from 'react';
-import { Button, Icon, Item, Tabs, Text, useToasts } from 'react-basics';
-import ShareUrl from './ShareUrl';
-import TrackingCode from './TrackingCode';
-import WebsiteData from './WebsiteData';
-import WebsiteEditForm from './WebsiteEditForm';
-
-export function WebsiteSettings({
- websiteId,
- openExternal = false,
-}: {
- websiteId: string;
- openExternal?: boolean;
-}) {
- const website = useContext(WebsiteContext);
- const { formatMessage, labels, messages } = useMessages();
- const [tab, setTab] = useState('details');
- const { showToast } = useToasts();
-
- const handleSave = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- };
-
- const breadcrumb = (
-
- );
-
- return (
- <>
- } breadcrumb={breadcrumb}>
-
-
-
-
-
- {formatMessage(labels.view)}
-
-
-
-
- - {formatMessage(labels.details)}
- - {formatMessage(labels.trackingCode)}
- - {formatMessage(labels.shareUrl)}
- - {formatMessage(labels.data)}
-
- {tab === 'details' && }
- {tab === 'tracking' && }
- {tab === 'share' && }
- {tab === 'data' && }
- >
- );
-}
-
-export default WebsiteSettings;
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx
index 8d7badb83..d3d5f4f0f 100644
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx
+++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx
@@ -1,11 +1,16 @@
'use client';
-import WebsiteProvider from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-import WebsiteSettings from './WebsiteSettings';
+import { Column } from '@umami/react-zen';
+import { WebsiteSettings } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettings';
+import { WebsiteSettingsHeader } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader';
+import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider';
-export default function WebsiteSettingsPage({ websiteId }: { websiteId: string }) {
+export function WebsiteSettingsPage({ websiteId }: { websiteId: string }) {
return (
-
+
+
+
+
);
}
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx
deleted file mode 100644
index 8214fb163..000000000
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import { Key, useContext, useState } from 'react';
-import {
- Button,
- Form,
- FormButtons,
- FormRow,
- LoadingButton,
- Loading,
- Dropdown,
- Item,
- Flexbox,
-} from 'react-basics';
-import { useApi, useLogin, useMessages, useTeams } from '@/components/hooks';
-import { WebsiteContext } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-import { ROLES } from '@/lib/constants';
-
-export function WebsiteTransferForm({
- websiteId,
- onSave,
- onClose,
-}: {
- websiteId: string;
- onSave?: () => void;
- onClose?: () => void;
-}) {
- const { user } = useLogin();
- const website = useContext(WebsiteContext);
- const [teamId, setTeamId] = useState(null);
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, isPending, error } = useMutation({
- mutationFn: (data: any) => post(`/websites/${websiteId}/transfer`, data),
- });
- const { result, query } = useTeams(user.id);
- const isTeamWebsite = !!website?.teamId;
-
- const handleSubmit = async () => {
- mutate(
- {
- userId: website.teamId ? user.id : undefined,
- teamId: website.userId ? teamId : undefined,
- },
- {
- onSuccess: async () => {
- onSave?.();
- onClose?.();
- },
- },
- );
- };
-
- const handleChange = (key: Key) => {
- setTeamId(key as string);
- };
-
- const renderValue = (teamId: string) => result?.data?.find(({ id }) => id === teamId)?.name;
-
- if (query.isLoading) {
- return ;
- }
-
- return (
-
- );
-}
-
-export default WebsiteTransferForm;
diff --git a/src/app/(main)/settings/websites/[websiteId]/page.tsx b/src/app/(main)/settings/websites/[websiteId]/page.tsx
index 7e2feaf26..9adfc915e 100644
--- a/src/app/(main)/settings/websites/[websiteId]/page.tsx
+++ b/src/app/(main)/settings/websites/[websiteId]/page.tsx
@@ -1,7 +1,7 @@
-import WebsiteSettingsPage from './WebsiteSettingsPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { WebsiteSettingsPage } from './WebsiteSettingsPage';
-export default async function ({ params }: { params: { websiteId: string } }) {
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
return ;
diff --git a/src/app/(main)/settings/websites/page.tsx b/src/app/(main)/settings/websites/page.tsx
index d05be0a5c..19c14fd66 100644
--- a/src/app/(main)/settings/websites/page.tsx
+++ b/src/app/(main)/settings/websites/page.tsx
@@ -1,7 +1,7 @@
-import { Metadata } from 'next';
-import WebsitesSettingsPage from './WebsitesSettingsPage';
+import type { Metadata } from 'next';
+import { WebsitesSettingsPage } from './WebsitesSettingsPage';
-export default async function ({ params }: { params: { teamId: string } }) {
+export default async function ({ params }: { params: Promise<{ teamId: string }> }) {
const { teamId } = await params;
return ;
diff --git a/src/app/(main)/teams/TeamAddForm.tsx b/src/app/(main)/teams/TeamAddForm.tsx
new file mode 100644
index 000000000..2599baa40
--- /dev/null
+++ b/src/app/(main)/teams/TeamAddForm.tsx
@@ -0,0 +1,53 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ TextField,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { UserSelect } from '@/components/input/UserSelect';
+
+export function TeamAddForm({
+ onSave,
+ onClose,
+ isAdmin,
+}: {
+ onSave: () => void;
+ onClose: () => void;
+ isAdmin: boolean;
+}) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery('/teams');
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamJoinForm.tsx b/src/app/(main)/teams/TeamJoinForm.tsx
new file mode 100644
index 000000000..3aa865319
--- /dev/null
+++ b/src/app/(main)/teams/TeamJoinForm.tsx
@@ -0,0 +1,40 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ TextField,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+
+export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const { mutateAsync, error, touch } = useUpdateQuery('/teams/join');
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ touch('teams:members');
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamLeaveButton.tsx b/src/app/(main)/teams/TeamLeaveButton.tsx
new file mode 100644
index 000000000..b4902fa01
--- /dev/null
+++ b/src/app/(main)/teams/TeamLeaveButton.tsx
@@ -0,0 +1,41 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen';
+import { useRouter } from 'next/navigation';
+import { useLoginQuery, useMessages, useModified } from '@/components/hooks';
+import { LogOut } from '@/components/icons';
+import { TeamLeaveForm } from './TeamLeaveForm';
+
+export function TeamLeaveButton({ teamId, teamName }: { teamId: string; teamName: string }) {
+ const { t, labels } = useMessages();
+ const router = useRouter();
+ const { user } = useLoginQuery();
+ const { touch } = useModified();
+
+ const handleLeave = async () => {
+ touch('teams');
+ router.push('/settings/teams');
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.leave)}
+
+
+
+ {({ close }) => (
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamLeaveForm.tsx b/src/app/(main)/teams/TeamLeaveForm.tsx
new file mode 100644
index 000000000..09415239d
--- /dev/null
+++ b/src/app/(main)/teams/TeamLeaveForm.tsx
@@ -0,0 +1,44 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+
+export function TeamLeaveForm({
+ teamId,
+ userId,
+ teamName,
+ onSave,
+ onClose,
+}: {
+ teamId: string;
+ userId: string;
+ teamName: string;
+ onSave: () => void;
+ onClose: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useDeleteQuery(`/teams/${teamId}/users/${userId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async () => {
+ await mutateAsync(null, {
+ onSuccess: async () => {
+ touch('teams:members');
+ onSave();
+ onClose();
+ },
+ });
+ };
+
+ return (
+ {chunks} ,
+ })}
+ onConfirm={handleConfirm}
+ onClose={onClose}
+ isLoading={isPending}
+ error={getErrorMessage(error)}
+ />
+ );
+}
diff --git a/src/app/(main)/teams/TeamMemberAddForm.tsx b/src/app/(main)/teams/TeamMemberAddForm.tsx
new file mode 100644
index 000000000..4ab314752
--- /dev/null
+++ b/src/app/(main)/teams/TeamMemberAddForm.tsx
@@ -0,0 +1,72 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ Select,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { UserSelect } from '@/components/input/UserSelect';
+import { ROLES } from '@/lib/constants';
+
+const roles = [ROLES.teamManager, ROLES.teamMember, ROLES.teamViewOnly];
+
+export function TeamMemberAddForm({
+ teamId,
+ onSave,
+ onClose,
+}: {
+ teamId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery(`/teams/${teamId}/users`);
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ const renderRole = role => {
+ switch (role) {
+ case ROLES.teamManager:
+ return t(labels.manager);
+ case ROLES.teamMember:
+ return t(labels.member);
+ case ROLES.teamViewOnly:
+ return t(labels.viewOnly);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamProvider.tsx b/src/app/(main)/teams/TeamProvider.tsx
new file mode 100644
index 000000000..cea416142
--- /dev/null
+++ b/src/app/(main)/teams/TeamProvider.tsx
@@ -0,0 +1,21 @@
+'use client';
+import { Loading } from '@umami/react-zen';
+import { createContext, type ReactNode } from 'react';
+import { useTeamQuery } from '@/components/hooks/queries/useTeamQuery';
+import type { Team } from '@/generated/prisma/client';
+
+export const TeamContext = createContext(null);
+
+export function TeamProvider({ teamId, children }: { teamId?: string; children: ReactNode }) {
+ const { data: team, isLoading, isFetching } = useTeamQuery(teamId);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!team) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/teams/TeamsAddButton.tsx b/src/app/(main)/teams/TeamsAddButton.tsx
new file mode 100644
index 000000000..c993296ff
--- /dev/null
+++ b/src/app/(main)/teams/TeamsAddButton.tsx
@@ -0,0 +1,38 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { TeamAddForm } from './TeamAddForm';
+
+export function TeamsAddButton({
+ onSave,
+ isAdmin = false,
+}: {
+ onSave?: () => void;
+ isAdmin?: boolean;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleSave = async () => {
+ toast(t(messages.saved));
+ touch('teams');
+ onSave?.();
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.createTeam)}
+
+
+
+ {({ close }) => }
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsDataTable.tsx b/src/app/(main)/teams/TeamsDataTable.tsx
new file mode 100644
index 000000000..cdce7b936
--- /dev/null
+++ b/src/app/(main)/teams/TeamsDataTable.tsx
@@ -0,0 +1,27 @@
+import Link from 'next/link';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useLoginQuery, useNavigation, useUserTeamsQuery } from '@/components/hooks';
+import { TeamsTable } from './TeamsTable';
+
+export function TeamsDataTable() {
+ const { user } = useLoginQuery();
+ const query = useUserTeamsQuery(user.id);
+ const { pathname } = useNavigation();
+ const isSettings = pathname.includes('/settings');
+
+ const renderLink = (row: any) => {
+ return (
+
+ {row.name}
+
+ );
+ };
+
+ return (
+
+ {({ data }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsHeader.tsx b/src/app/(main)/teams/TeamsHeader.tsx
new file mode 100644
index 000000000..7d77229a3
--- /dev/null
+++ b/src/app/(main)/teams/TeamsHeader.tsx
@@ -0,0 +1,26 @@
+import { Row } from '@umami/react-zen';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useLoginQuery, useMessages } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { TeamsAddButton } from './TeamsAddButton';
+import { TeamsJoinButton } from './TeamsJoinButton';
+
+export function TeamsHeader({
+ allowCreate = true,
+ allowJoin = true,
+}: {
+ allowCreate?: boolean;
+ allowJoin?: boolean;
+}) {
+ const { t, labels } = useMessages();
+ const { user } = useLoginQuery();
+
+ return (
+
+
+ {allowJoin && }
+ {allowCreate && user.role !== ROLES.viewOnly && }
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsJoinButton.tsx b/src/app/(main)/teams/TeamsJoinButton.tsx
new file mode 100644
index 000000000..eb7062966
--- /dev/null
+++ b/src/app/(main)/teams/TeamsJoinButton.tsx
@@ -0,0 +1,31 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { UserPlus } from '@/components/icons';
+import { TeamJoinForm } from './TeamJoinForm';
+
+export function TeamsJoinButton() {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleJoin = () => {
+ toast(t(messages.saved));
+ touch('teams');
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.joinTeam)}
+
+
+
+ {({ close }) => }
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsMemberAddButton.tsx b/src/app/(main)/teams/TeamsMemberAddButton.tsx
new file mode 100644
index 000000000..ac33e98cb
--- /dev/null
+++ b/src/app/(main)/teams/TeamsMemberAddButton.tsx
@@ -0,0 +1,39 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { TeamMemberAddForm } from './TeamMemberAddForm';
+
+export function TeamsMemberAddButton({
+ teamId,
+ onSave,
+}: {
+ teamId: string;
+ onSave?: () => void;
+ isAdmin?: boolean;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleSave = async () => {
+ toast(t(messages.saved));
+ touch('teams:members');
+ onSave?.();
+ };
+
+ return (
+
+
+
+
+
+ {t(labels.addMember)}
+
+
+
+ {({ close }) => }
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsPage.tsx b/src/app/(main)/teams/TeamsPage.tsx
new file mode 100644
index 000000000..5b11bcf83
--- /dev/null
+++ b/src/app/(main)/teams/TeamsPage.tsx
@@ -0,0 +1,19 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { TeamsDataTable } from '@/app/(main)/teams/TeamsDataTable';
+import { TeamsHeader } from '@/app/(main)/teams/TeamsHeader';
+import { PageBody } from '@/components/common/PageBody';
+import { Panel } from '@/components/common/Panel';
+
+export function TeamsPage() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/TeamsTable.tsx b/src/app/(main)/teams/TeamsTable.tsx
new file mode 100644
index 000000000..66c7355ac
--- /dev/null
+++ b/src/app/(main)/teams/TeamsTable.tsx
@@ -0,0 +1,29 @@
+import { DataColumn, DataTable, type DataTableProps } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { useMessages } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export interface TeamsTableProps extends DataTableProps {
+ renderLink?: (row: any) => ReactNode;
+}
+
+export function TeamsTable({ renderLink, ...props }: TeamsTableProps) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+ {renderLink}
+
+
+ {(row: any) => row?.members?.find(({ role }) => role === ROLES.teamOwner)?.user?.username}
+
+
+ {(row: any) => row?._count?.members}
+
+
+ {(row: any) => row?._count?.websites}
+
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm.tsx b/src/app/(main)/teams/[teamId]/TeamDeleteForm.tsx
similarity index 53%
rename from src/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm.tsx
rename to src/app/(main)/teams/[teamId]/TeamDeleteForm.tsx
index 5e7f5cf8b..d593e0dc2 100644
--- a/src/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm.tsx
+++ b/src/app/(main)/teams/[teamId]/TeamDeleteForm.tsx
@@ -1,5 +1,5 @@
-import TypeConfirmationForm from '@/components/common/TypeConfirmationForm';
-import { useApi, useMessages } from '@/components/hooks';
+import { TypeConfirmationForm } from '@/components/common/TypeConfirmationForm';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
const CONFIRM_VALUE = 'DELETE';
@@ -12,15 +12,14 @@ export function TeamDeleteForm({
onSave?: () => void;
onClose?: () => void;
}) {
- const { labels, formatMessage } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: () => del(`/teams/${teamId}`),
- });
+ const { labels, t, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending, touch } = useDeleteQuery(`/teams/${teamId}`);
const handleConfirm = async () => {
- mutate(null, {
+ await mutateAsync(null, {
onSuccess: async () => {
+ touch('teams');
+ touch(`teams:${teamId}`);
onSave?.();
onClose?.();
},
@@ -33,11 +32,9 @@ export function TeamDeleteForm({
onConfirm={handleConfirm}
onClose={onClose}
isLoading={isPending}
- error={error}
- buttonLabel={formatMessage(labels.delete)}
+ error={getErrorMessage(error)}
+ buttonLabel={t(labels.delete)}
buttonVariant="danger"
/>
);
}
-
-export default TeamDeleteForm;
diff --git a/src/app/(main)/teams/[teamId]/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx
new file mode 100644
index 000000000..04904c116
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx
@@ -0,0 +1,81 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ Row,
+ TextField,
+} from '@umami/react-zen';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, useTeam, useUpdateQuery } from '@/components/hooks';
+import { RefreshCw } from '@/components/icons';
+import { getRandomChars } from '@/lib/generate';
+
+const generateId = () => `team_${getRandomChars(16)}`;
+
+export function TeamEditForm({
+ teamId,
+ allowEdit,
+ showAccessCode,
+ onSave,
+}: {
+ teamId: string;
+ allowEdit?: boolean;
+ showAccessCode?: boolean;
+ onSave?: () => void;
+}) {
+ const team = useTeam();
+ const { t, labels, messages, getErrorMessage } = useMessages();
+
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(`/teams/${teamId}`);
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('teams');
+ touch(`teams:${teamId}`);
+ onSave?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamManage.tsx b/src/app/(main)/teams/[teamId]/TeamManage.tsx
new file mode 100644
index 000000000..52e76a25b
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamManage.tsx
@@ -0,0 +1,29 @@
+import { Button, Dialog, DialogTrigger, Modal } from '@umami/react-zen';
+import { useRouter } from 'next/navigation';
+import { ActionForm } from '@/components/common/ActionForm';
+import { useMessages, useModified } from '@/components/hooks';
+import { TeamDeleteForm } from './TeamDeleteForm';
+
+export function TeamManage({ teamId }: { teamId: string }) {
+ const { t, labels, messages } = useMessages();
+ const router = useRouter();
+ const { touch } = useModified();
+
+ const handleLeave = async () => {
+ touch('teams');
+ router.push('/settings/teams');
+ };
+
+ return (
+
+
+ {t(labels.delete)}
+
+
+ {({ close }) => }
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx b/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx
new file mode 100644
index 000000000..f5d958713
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx
@@ -0,0 +1,41 @@
+import { useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { TeamMemberEditForm } from './TeamMemberEditForm';
+
+export function TeamMemberEditButton({
+ teamId,
+ userId,
+ role,
+ onSave,
+}: {
+ teamId: string;
+ userId: string;
+ role: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleSave = () => {
+ touch('teams:members');
+ toast(t(messages.saved));
+ onSave?.();
+ };
+
+ return (
+ } title={t(labels.editMember)} variant="quiet" width="400px">
+ {({ close }) => (
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx b/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx
new file mode 100644
index 000000000..baf519ca1
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx
@@ -0,0 +1,58 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ Select,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export function TeamMemberEditForm({
+ teamId,
+ userId,
+ role,
+ onSave,
+ onClose,
+}: {
+ teamId: string;
+ userId: string;
+ role: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { mutateAsync, error, isPending } = useUpdateQuery(`/teams/${teamId}/users/${userId}`);
+ const { t, labels, getErrorMessage } = useMessages();
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave();
+ onClose();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx
new file mode 100644
index 000000000..ff55a7aab
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx
@@ -0,0 +1,50 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function TeamMemberRemoveButton({
+ teamId,
+ userId,
+ userName,
+ onSave,
+}: {
+ teamId: string;
+ userId: string;
+ userName: string;
+ disabled?: boolean;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { mutateAsync, isPending, error } = useDeleteQuery(`/teams/${teamId}/users/${userId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('teams:members');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } title={t(labels.confirm)} variant="quiet" width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={error}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.remove)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx b/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx
new file mode 100644
index 000000000..52c0fe38f
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx
@@ -0,0 +1,19 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useTeamMembersQuery } from '@/components/hooks';
+import { TeamMembersTable } from './TeamMembersTable';
+
+export function TeamMembersDataTable({
+ teamId,
+ allowEdit = false,
+}: {
+ teamId: string;
+ allowEdit?: boolean;
+}) {
+ const queryResult = useTeamMembersQuery(teamId);
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx
new file mode 100644
index 000000000..6c77c89b1
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx
@@ -0,0 +1,55 @@
+import { DataColumn, DataTable, Row } from '@umami/react-zen';
+import { useMessages } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { TeamMemberEditButton } from './TeamMemberEditButton';
+import { TeamMemberRemoveButton } from './TeamMemberRemoveButton';
+
+export function TeamMembersTable({
+ data = [],
+ teamId,
+ allowEdit = false,
+}: {
+ data: any[];
+ teamId: string;
+ allowEdit: boolean;
+}) {
+ const { t, labels } = useMessages();
+
+ const roles = {
+ [ROLES.teamOwner]: t(labels.teamOwner),
+ [ROLES.teamManager]: t(labels.teamManager),
+ [ROLES.teamMember]: t(labels.teamMember),
+ [ROLES.teamViewOnly]: t(labels.viewOnly),
+ };
+
+ return (
+
+
+ {(row: any) => row?.user?.username}
+
+
+ {(row: any) => roles[row?.role]}
+
+ {allowEdit && (
+
+ {(row: any) => {
+ if (row?.role === ROLES.teamOwner) {
+ return null;
+ }
+
+ return (
+
+
+
+
+ );
+ }}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamProvider.tsx b/src/app/(main)/teams/[teamId]/TeamProvider.tsx
deleted file mode 100644
index ed2d5467e..000000000
--- a/src/app/(main)/teams/[teamId]/TeamProvider.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-'use client';
-import { createContext, ReactNode, useEffect } from 'react';
-import { useTeam, useModified } from '@/components/hooks';
-import { Loading } from 'react-basics';
-
-export const TeamContext = createContext(null);
-
-export function TeamProvider({ teamId, children }: { teamId?: string; children: ReactNode }) {
- const { modified } = useModified(`teams`);
- const { data: team, isLoading, isFetching, refetch } = useTeam(teamId);
-
- useEffect(() => {
- if (teamId && modified) {
- refetch();
- }
- }, [teamId, modified]);
-
- if (isFetching && isLoading) {
- return ;
- }
-
- if (teamId && !team) {
- return null;
- }
-
- return {children} ;
-}
-
-export default TeamProvider;
diff --git a/src/app/(main)/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/teams/[teamId]/TeamSettings.tsx
new file mode 100644
index 000000000..e854c127e
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamSettings.tsx
@@ -0,0 +1,55 @@
+import { Column, Heading, Row } from '@umami/react-zen';
+import { TeamLeaveButton } from '@/app/(main)/teams/TeamLeaveButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useLoginQuery, useMessages, useNavigation, useTeam } from '@/components/hooks';
+import { Users } from '@/components/icons';
+import { ROLES } from '@/lib/constants';
+import { TeamsMemberAddButton } from '../TeamsMemberAddButton';
+import { TeamEditForm } from './TeamEditForm';
+import { TeamManage } from './TeamManage';
+import { TeamMembersDataTable } from './TeamMembersDataTable';
+
+export function TeamSettings({ teamId }: { teamId: string }) {
+ const team: any = useTeam();
+ const { user } = useLoginQuery();
+ const { pathname } = useNavigation();
+ const { t, labels } = useMessages();
+
+ const isAdmin = pathname.includes('/admin');
+
+ const isTeamOwner =
+ !!team?.members?.find(({ userId, role }) => role === ROLES.teamOwner && userId === user.id) &&
+ user.role !== ROLES.viewOnly;
+
+ const canEdit =
+ user.isAdmin ||
+ (!!team?.members?.find(
+ ({ userId, role }) =>
+ (role === ROLES.teamOwner || role === ROLES.teamManager) && userId === user.id,
+ ) &&
+ user.role !== ROLES.viewOnly);
+
+ return (
+
+ }>
+ {!isTeamOwner && !isAdmin && }
+
+
+
+
+
+
+ {t(labels.members)}
+ {isAdmin && }
+
+
+
+ {isTeamOwner && (
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx
new file mode 100644
index 000000000..7ba5ba11a
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx
@@ -0,0 +1,25 @@
+import { Icon, LoadingButton, Text } from '@umami/react-zen';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
+import { X } from '@/components/icons';
+
+export function TeamWebsiteRemoveButton({ teamId, websiteId, onSave }) {
+ const { t, labels } = useMessages();
+ const { mutateAsync } = useDeleteQuery(`/teams/${teamId}/websites/${websiteId}`);
+
+ const handleRemoveTeamMember = async () => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ onSave();
+ },
+ });
+ };
+
+ return (
+ handleRemoveTeamMember()}>
+
+
+
+ {t(labels.remove)}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamWebsitesDataTable.tsx b/src/app/(main)/teams/[teamId]/TeamWebsitesDataTable.tsx
new file mode 100644
index 000000000..6a2e4f45d
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamWebsitesDataTable.tsx
@@ -0,0 +1,19 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useTeamWebsitesQuery } from '@/components/hooks';
+import { TeamWebsitesTable } from './TeamWebsitesTable';
+
+export function TeamWebsitesDataTable({
+ teamId,
+ allowEdit = false,
+}: {
+ teamId: string;
+ allowEdit?: boolean;
+}) {
+ const queryResult = useTeamWebsitesQuery(teamId);
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx
new file mode 100644
index 000000000..f4ed2df7e
--- /dev/null
+++ b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx
@@ -0,0 +1,50 @@
+import { DataColumn, DataTable, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { TeamMemberEditButton } from '@/app/(main)/teams/[teamId]/TeamMemberEditButton';
+import { TeamMemberRemoveButton } from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton';
+import { useMessages } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export function TeamWebsitesTable({
+ teamId,
+ data = [],
+ allowEdit,
+}: {
+ teamId: string;
+ data: any[];
+ allowEdit: boolean;
+}) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+ {(row: any) => {row.name}}
+
+
+
+ {(row: any) => row?.createUser?.username}
+
+ {allowEdit && (
+
+ {(row: any) => {
+ if (row?.role === ROLES.teamOwner) {
+ return null;
+ }
+
+ return (
+
+
+
+
+ );
+ }}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/teams/[teamId]/layout.tsx b/src/app/(main)/teams/[teamId]/layout.tsx
deleted file mode 100644
index 0452ae976..000000000
--- a/src/app/(main)/teams/[teamId]/layout.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import TeamProvider from './TeamProvider';
-import { Metadata } from 'next';
-import TeamSettingsLayout from './settings/TeamSettingsLayout';
-
-export default async function ({
- children,
- params,
-}: {
- children: any;
- params: { teamId: string };
-}) {
- const { teamId } = await params;
-
- return (
-
- {children}
-
- );
-}
-
-export const metadata: Metadata = {
- title: 'Teams',
-};
diff --git a/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx b/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx
deleted file mode 100644
index 8c638d294..000000000
--- a/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-'use client';
-import { ReactNode } from 'react';
-import { useMessages, useTeamUrl } from '@/components/hooks';
-import MenuLayout from '@/components/layout/MenuLayout';
-
-export default function TeamSettingsLayout({ children }: { children: ReactNode }) {
- const { formatMessage, labels } = useMessages();
- const { teamId } = useTeamUrl();
-
- const items = [
- {
- key: 'team',
- label: formatMessage(labels.team),
- url: `/teams/${teamId}/settings/team`,
- },
- {
- key: 'websites',
- label: formatMessage(labels.websites),
- url: `/teams/${teamId}/settings/websites`,
- },
- {
- key: 'members',
- label: formatMessage(labels.members),
- url: `/teams/${teamId}/settings/members`,
- },
- ].filter(n => n);
-
- return {children} ;
-}
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton.tsx
deleted file mode 100644
index 85292f60d..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { useMessages, useModified } from '@/components/hooks';
-import { Button, Icon, Icons, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
-import TeamMemberEditForm from './TeamMemberEditForm';
-
-export function TeamMemberEditButton({
- teamId,
- userId,
- role,
- onSave,
-}: {
- teamId: string;
- userId: string;
- role: string;
- onSave?: () => void;
-}) {
- const { formatMessage, labels, messages } = useMessages();
- const { showToast } = useToasts();
- const { touch } = useModified();
-
- const handleSave = () => {
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- touch('teams:members');
- onSave?.();
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.edit)}
-
-
- {(close: () => void) => (
-
- )}
-
-
- );
-}
-
-export default TeamMemberEditButton;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm.tsx
deleted file mode 100644
index 4ce605dff..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import { useApi, useMessages } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-import {
- Button,
- Dropdown,
- Form,
- FormButtons,
- FormInput,
- FormRow,
- Item,
- SubmitButton,
-} from 'react-basics';
-
-export function TeamMemberEditForm({
- teamId,
- userId,
- role,
- onSave,
- onClose,
-}: {
- teamId: string;
- userId: string;
- role: string;
- onSave?: () => void;
- onClose?: () => void;
-}) {
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post(`/teams/${teamId}/users/${userId}`, data),
- });
- const { formatMessage, labels } = useMessages();
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- onSave();
- onClose();
- },
- });
- };
-
- const renderValue = (value: string) => {
- if (value === ROLES.teamManager) {
- return formatMessage(labels.manager);
- }
- if (value === ROLES.teamMember) {
- return formatMessage(labels.member);
- }
- if (value === ROLES.teamViewOnly) {
- return formatMessage(labels.viewOnly);
- }
- };
-
- return (
-
- );
-}
-
-export default TeamMemberEditForm;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton.tsx
deleted file mode 100644
index 0dfe758b2..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import ConfirmationForm from '@/components/common/ConfirmationForm';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import { messages } from '@/components/messages';
-import { Button, Icon, Icons, Modal, ModalTrigger, Text } from 'react-basics';
-
-export function TeamMemberRemoveButton({
- teamId,
- userId,
- userName,
- onSave,
-}: {
- teamId: string;
- userId: string;
- userName: string;
- disabled?: boolean;
- onSave?: () => void;
-}) {
- const { formatMessage, labels } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, isPending, error } = useMutation({
- mutationFn: () => del(`/teams/${teamId}/users/${userId}`),
- });
- const { touch } = useModified();
-
- const handleConfirm = (close: () => void) => {
- mutate(null, {
- onSuccess: () => {
- touch('teams:members');
- onSave?.();
- close();
- },
- });
- };
-
- return (
-
-
-
-
-
- {formatMessage(labels.remove)}
-
-
- {(close: () => void) => (
- {userName},
- })}
- isLoading={isPending}
- error={error}
- onConfirm={handleConfirm.bind(null, close)}
- onClose={close}
- buttonLabel={formatMessage(labels.remove)}
- />
- )}
-
-
- );
-}
-
-export default TeamMemberRemoveButton;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable.tsx
deleted file mode 100644
index 9de26415c..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import DataTable from '@/components/common/DataTable';
-import TeamMembersTable from './TeamMembersTable';
-import { useTeamMembers } from '@/components/hooks';
-
-export function TeamMembersDataTable({
- teamId,
- allowEdit = false,
-}: {
- teamId: string;
- allowEdit?: boolean;
-}) {
- const queryResult = useTeamMembers(teamId);
-
- return (
-
- {({ data }) => }
-
- );
-}
-
-export default TeamMembersDataTable;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersPage.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersPage.tsx
deleted file mode 100644
index 557a40bad..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersPage.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-'use client';
-import { TeamContext } from '@/app/(main)/teams/[teamId]/TeamProvider';
-import TeamMembersDataTable from './TeamMembersDataTable';
-import PageHeader from '@/components/layout/PageHeader';
-import { useLogin, useMessages } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-import { useContext } from 'react';
-
-export function TeamMembersPage({ teamId }: { teamId: string }) {
- const team = useContext(TeamContext);
- const { user } = useLogin();
- const { formatMessage, labels } = useMessages();
-
- const canEdit =
- team?.teamUser?.find(
- ({ userId, role }) =>
- (role === ROLES.teamOwner || role === ROLES.teamManager) && userId === user.id,
- ) && user.role !== ROLES.viewOnly;
-
- return (
- <>
-
-
- >
- );
-}
-
-export default TeamMembersPage;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersTable.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersTable.tsx
deleted file mode 100644
index 0054437a2..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/TeamMembersTable.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { GridColumn, GridTable } from 'react-basics';
-import { useMessages, useLogin } from '@/components/hooks';
-import { ROLES } from '@/lib/constants';
-import TeamMemberRemoveButton from './TeamMemberRemoveButton';
-import TeamMemberEditButton from './TeamMemberEditButton';
-
-export function TeamMembersTable({
- data = [],
- teamId,
- allowEdit = false,
-}: {
- data: any[];
- teamId: string;
- allowEdit: boolean;
-}) {
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
-
- const roles = {
- [ROLES.teamOwner]: formatMessage(labels.teamOwner),
- [ROLES.teamManager]: formatMessage(labels.teamManager),
- [ROLES.teamMember]: formatMessage(labels.teamMember),
- [ROLES.teamViewOnly]: formatMessage(labels.viewOnly),
- };
-
- return (
-
-
- {row => row?.user?.username}
-
-
- {row => roles[row?.role]}
-
-
- {row => {
- return (
- allowEdit &&
- row?.role !== ROLES.teamOwner &&
- user?.id !== row?.user?.id && (
- <>
-
-
- >
- )
- );
- }}
-
-
- );
-}
-
-export default TeamMembersTable;
diff --git a/src/app/(main)/teams/[teamId]/settings/members/page.tsx b/src/app/(main)/teams/[teamId]/settings/members/page.tsx
deleted file mode 100644
index 9810f7a20..000000000
--- a/src/app/(main)/teams/[teamId]/settings/members/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Metadata } from 'next';
-import TeamMembersPage from './TeamMembersPage';
-
-export default async function ({ params }: { params: { teamId: string } }) {
- const { teamId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Team Members',
-};
diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx
deleted file mode 100644
index f3f258bde..000000000
--- a/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { TeamContext } from '@/app/(main)/teams/[teamId]/TeamProvider';
-import { useLogin, useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import PageHeader from '@/components/layout/PageHeader';
-import { ROLES } from '@/lib/constants';
-import { useContext, useState } from 'react';
-import { Flexbox, Item, Tabs } from 'react-basics';
-import TeamLeaveButton from '@/app/(main)/settings/teams/TeamLeaveButton';
-import TeamManage from './TeamManage';
-import TeamEditForm from './TeamEditForm';
-
-export function TeamDetails({ teamId }: { teamId: string }) {
- const team = useContext(TeamContext);
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
- const [tab, setTab] = useState('details');
-
- const isTeamOwner =
- !!team?.teamUser?.find(({ userId, role }) => role === ROLES.teamOwner && userId === user.id) &&
- user.role !== ROLES.viewOnly;
-
- const canEdit =
- !!team?.teamUser?.find(
- ({ userId, role }) =>
- (role === ROLES.teamOwner || role === ROLES.teamManager) && userId === user.id,
- ) && user.role !== ROLES.viewOnly;
-
- return (
-
- }>
- {!isTeamOwner && }
-
- setTab(value)} style={{ marginBottom: 30 }}>
- - {formatMessage(labels.details)}
- {isTeamOwner && - {formatMessage(labels.manage)}
}
-
- {tab === 'details' && }
- {tab === 'manage' && }
-
- );
-}
-
-export default TeamDetails;
diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx
deleted file mode 100644
index ac158fa70..000000000
--- a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import {
- SubmitButton,
- Form,
- FormInput,
- FormRow,
- FormButtons,
- TextField,
- Button,
- Flexbox,
- useToasts,
-} from 'react-basics';
-import { getRandomChars } from '@/lib/crypto';
-import { useContext, useRef, useState } from 'react';
-import { useApi, useMessages, useModified } from '@/components/hooks';
-import { TeamContext } from '@/app/(main)/teams/[teamId]/TeamProvider';
-
-const generateId = () => getRandomChars(16);
-
-export function TeamEditForm({ teamId, allowEdit }: { teamId: string; allowEdit?: boolean }) {
- const team = useContext(TeamContext);
- const { formatMessage, labels, messages } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, error } = useMutation({
- mutationFn: (data: any) => post(`/teams/${teamId}`, data),
- });
- const ref = useRef(null);
- const [accessCode, setAccessCode] = useState(team.accessCode);
- const { showToast } = useToasts();
- const { touch } = useModified();
- const cloudMode = !!process.env.cloudMode;
-
- const handleSubmit = async (data: any) => {
- mutate(data, {
- onSuccess: async () => {
- ref.current.reset(data);
- touch('teams');
- showToast({ message: formatMessage(messages.saved), variant: 'success' });
- },
- });
- };
-
- const handleRegenerate = () => {
- const code = generateId();
- ref.current.setValue('accessCode', code, {
- shouldValidate: true,
- shouldDirty: true,
- });
- setAccessCode(code);
- };
-
- return (
-
- );
-}
-
-export default TeamEditForm;
diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamManage.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamManage.tsx
deleted file mode 100644
index 24ca93d37..000000000
--- a/src/app/(main)/teams/[teamId]/settings/team/TeamManage.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useMessages, useModified } from '@/components/hooks';
-import { useRouter } from 'next/navigation';
-import { ActionForm, Button, Modal, ModalTrigger } from 'react-basics';
-import TeamDeleteForm from './TeamDeleteForm';
-
-export function TeamManage({ teamId }: { teamId: string }) {
- const { formatMessage, labels, messages } = useMessages();
- const router = useRouter();
- const { touch } = useModified();
-
- const handleLeave = async () => {
- touch('teams');
- router.push('/settings/teams');
- };
-
- return (
-
-
- {formatMessage(labels.delete)}
-
- {(close: () => void) => (
-
- )}
-
-
-
- );
-}
-
-export default TeamManage;
diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamPage.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamPage.tsx
deleted file mode 100644
index e6fbd10a1..000000000
--- a/src/app/(main)/teams/[teamId]/settings/team/TeamPage.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-'use client';
-import TeamDetails from './TeamDetails';
-
-export function TeamPage({ teamId }: { teamId: string }) {
- return ;
-}
-
-export default TeamPage;
diff --git a/src/app/(main)/teams/[teamId]/settings/team/page.tsx b/src/app/(main)/teams/[teamId]/settings/team/page.tsx
deleted file mode 100644
index f15d5fb61..000000000
--- a/src/app/(main)/teams/[teamId]/settings/team/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Metadata } from 'next';
-import TeamPage from './TeamPage';
-
-export default async function ({ params }: { params: { teamId: string } }) {
- const { teamId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Teams Details',
-};
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton.tsx
deleted file mode 100644
index fdd76cd20..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { useApi, useMessages } from '@/components/hooks';
-import { Icon, Icons, LoadingButton, Text } from 'react-basics';
-
-export function TeamWebsiteRemoveButton({ teamId, websiteId, onSave }) {
- const { formatMessage, labels } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, isPending } = useMutation({
- mutationFn: () => del(`/teams/${teamId}/websites/${websiteId}`),
- });
-
- const handleRemoveTeamMember = async () => {
- mutate(null, {
- onSuccess: () => {
- onSave();
- },
- });
- };
-
- return (
- handleRemoveTeamMember()} isLoading={isPending}>
-
-
-
- {formatMessage(labels.remove)}
-
- );
-}
-
-export default TeamWebsiteRemoveButton;
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable.tsx
deleted file mode 100644
index 63aa47f5d..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import DataTable from '@/components/common/DataTable';
-import { useTeamWebsites } from '@/components/hooks';
-import TeamWebsitesTable from './TeamWebsitesTable';
-
-export function TeamWebsitesDataTable({
- teamId,
- allowEdit = false,
-}: {
- teamId: string;
- allowEdit?: boolean;
-}) {
- const queryResult = useTeamWebsites(teamId);
-
- return (
-
- {({ data }) => }
-
- );
-}
-
-export default TeamWebsitesDataTable;
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesPage.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesPage.tsx
deleted file mode 100644
index d46d928ad..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesPage.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-'use client';
-import { TeamContext } from '@/app/(main)/teams/[teamId]/TeamProvider';
-import WebsiteAddButton from '@/app/(main)/settings/websites/WebsiteAddButton';
-import { useLogin, useMessages } from '@/components/hooks';
-import PageHeader from '@/components/layout/PageHeader';
-import TeamWebsitesDataTable from './TeamWebsitesDataTable';
-import { ROLES } from '@/lib/constants';
-import { useContext } from 'react';
-
-export function TeamWebsitesPage({ teamId }: { teamId: string }) {
- const team = useContext(TeamContext);
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
-
- const canEdit =
- !!team?.teamUser?.find(
- ({ userId, role }) => userId === user.id && role !== ROLES.teamViewOnly,
- ) && user.role !== ROLES.viewOnly;
-
- return (
- <>
-
- {canEdit && }
-
-
- >
- );
-}
-
-export default TeamWebsitesPage;
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable.tsx
deleted file mode 100644
index 76c343b17..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { GridColumn, GridTable, Icon, Text } from 'react-basics';
-import { useLogin, useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import LinkButton from '@/components/common/LinkButton';
-
-export function TeamWebsitesTable({
- teamId,
- data = [],
- allowEdit = false,
-}: {
- teamId: string;
- data: any[];
- allowEdit?: boolean;
-}) {
- const { user } = useLogin();
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
-
-
- {row => row?.createUser?.username}
-
-
- {row => {
- const { id: websiteId } = row;
- return (
- <>
- {allowEdit && (teamId || user?.isAdmin) && (
-
-
-
-
- {formatMessage(labels.edit)}
-
- )}
-
-
-
-
- {formatMessage(labels.view)}
-
- >
- );
- }}
-
-
- );
-}
-
-export default TeamWebsitesTable;
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx
deleted file mode 100644
index a18f8a2eb..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import Page from '@/app/(main)/settings/websites/[websiteId]/page';
-
-export default function ({ params }) {
- return ;
-}
diff --git a/src/app/(main)/teams/[teamId]/settings/websites/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/page.tsx
deleted file mode 100644
index 6709eb671..000000000
--- a/src/app/(main)/teams/[teamId]/settings/websites/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import TeamWebsitesPage from './TeamWebsitesPage';
-import { Metadata } from 'next';
-
-export default async function ({ params }: { params: { teamId: string } }) {
- const { teamId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Teams Websites',
-};
diff --git a/src/app/(main)/teams/page.tsx b/src/app/(main)/teams/page.tsx
new file mode 100644
index 000000000..7344f1509
--- /dev/null
+++ b/src/app/(main)/teams/page.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from 'next';
+import { TeamsPage } from './TeamsPage';
+
+export default function () {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Teams',
+};
diff --git a/src/app/(main)/websites/WebsiteAddButton.tsx b/src/app/(main)/websites/WebsiteAddButton.tsx
new file mode 100644
index 000000000..340c6fdc0
--- /dev/null
+++ b/src/app/(main)/websites/WebsiteAddButton.tsx
@@ -0,0 +1,23 @@
+import { useToast } from '@umami/react-zen';
+import { useMessages, useModified } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { WebsiteAddForm } from './WebsiteAddForm';
+
+export function WebsiteAddButton({ teamId, onSave }: { teamId: string; onSave?: () => void }) {
+ const { t, labels, messages } = useMessages();
+ const { toast } = useToast();
+ const { touch } = useModified();
+
+ const handleSave = async () => {
+ toast(t(messages.saved));
+ touch('websites');
+ onSave?.();
+ };
+
+ return (
+ } label={t(labels.addWebsite)} variant="primary" width="400px">
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/WebsiteAddForm.tsx b/src/app/(main)/websites/WebsiteAddForm.tsx
new file mode 100644
index 000000000..7f28651fc
--- /dev/null
+++ b/src/app/(main)/websites/WebsiteAddForm.tsx
@@ -0,0 +1,60 @@
+import { Button, Form, FormField, FormSubmitButton, Row, TextField } from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { DOMAIN_REGEX } from '@/lib/constants';
+
+export function WebsiteAddForm({
+ teamId,
+ onSave,
+ onClose,
+}: {
+ teamId?: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery('/websites', { teamId });
+
+ const handleSubmit = async (data: any) => {
+ await mutateAsync(data, {
+ onSuccess: async () => {
+ onSave?.();
+ onClose?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/WebsiteProvider.tsx b/src/app/(main)/websites/WebsiteProvider.tsx
new file mode 100644
index 000000000..75e8a3582
--- /dev/null
+++ b/src/app/(main)/websites/WebsiteProvider.tsx
@@ -0,0 +1,27 @@
+'use client';
+import { Loading } from '@umami/react-zen';
+import { createContext, type ReactNode } from 'react';
+import { useWebsiteQuery } from '@/components/hooks/queries/useWebsiteQuery';
+import type { Website } from '@/generated/prisma/client';
+
+export const WebsiteContext = createContext(null);
+
+export function WebsiteProvider({
+ websiteId,
+ children,
+}: {
+ websiteId: string;
+ children: ReactNode;
+}) {
+ const { data: website, isFetching, isLoading } = useWebsiteQuery(websiteId);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!website) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/(main)/websites/WebsitesDataTable.tsx b/src/app/(main)/websites/WebsitesDataTable.tsx
new file mode 100644
index 000000000..f1ef6fb18
--- /dev/null
+++ b/src/app/(main)/websites/WebsitesDataTable.tsx
@@ -0,0 +1,47 @@
+import { Icon, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useLoginQuery, useNavigation, useUserWebsitesQuery } from '@/components/hooks';
+import { Favicon } from '@/index';
+import { WebsitesTable } from './WebsitesTable';
+
+export function WebsitesDataTable({
+ userId,
+ teamId,
+ allowEdit = true,
+ allowView = true,
+ showActions = true,
+}: {
+ userId?: string;
+ teamId?: string;
+ allowEdit?: boolean;
+ allowView?: boolean;
+ showActions?: boolean;
+}) {
+ const { user } = useLoginQuery();
+ const queryResult = useUserWebsitesQuery({ userId: userId || user?.id, teamId });
+ const { renderUrl } = useNavigation();
+
+ const renderLink = (row: any) => (
+
+
+
+
+ {row.name}
+
+ );
+
+ return (
+
+ {({ data }) => (
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/WebsitesHeader.tsx b/src/app/(main)/websites/WebsitesHeader.tsx
new file mode 100644
index 000000000..da9fd7e87
--- /dev/null
+++ b/src/app/(main)/websites/WebsitesHeader.tsx
@@ -0,0 +1,18 @@
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { WebsiteAddButton } from './WebsiteAddButton';
+
+export interface WebsitesHeaderProps {
+ allowCreate?: boolean;
+}
+
+export function WebsitesHeader({ allowCreate = true }: WebsitesHeaderProps) {
+ const { t, labels } = useMessages();
+ const { teamId } = useNavigation();
+
+ return (
+
+ {allowCreate && }
+
+ );
+}
diff --git a/src/app/(main)/websites/WebsitesPage.tsx b/src/app/(main)/websites/WebsitesPage.tsx
index b5e40b303..4decd8f19 100644
--- a/src/app/(main)/websites/WebsitesPage.tsx
+++ b/src/app/(main)/websites/WebsitesPage.tsx
@@ -1,15 +1,35 @@
'use client';
-import WebsitesHeader from '@/app/(main)/settings/websites/WebsitesHeader';
-import WebsitesDataTable from '@/app/(main)/settings/websites/WebsitesDataTable';
-import { useTeamUrl } from '@/components/hooks';
+import { Column } from '@umami/react-zen';
+import { PageBody } from '@/components/common/PageBody';
+import { PageHeader } from '@/components/common/PageHeader';
+import { Panel } from '@/components/common/Panel';
+import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { WebsiteAddButton } from './WebsiteAddButton';
+import { WebsitesDataTable } from './WebsitesDataTable';
-export default function WebsitesPage() {
- const { teamId } = useTeamUrl();
+export function WebsitesPage() {
+ const { user } = useLoginQuery();
+ const { teamId } = useNavigation();
+ const { t, labels } = useMessages();
+ const { data } = useTeamMembersQuery(teamId);
+
+ const showActions =
+ (teamId &&
+ data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
+ .length > 0) ||
+ (!teamId && user.role !== ROLES.viewOnly);
return (
- <>
-
-
- >
+
+
+
+ {showActions && }
+
+
+
+
+
+
);
}
diff --git a/src/app/(main)/websites/WebsitesTable.tsx b/src/app/(main)/websites/WebsitesTable.tsx
new file mode 100644
index 000000000..714e1c66c
--- /dev/null
+++ b/src/app/(main)/websites/WebsitesTable.tsx
@@ -0,0 +1,41 @@
+import { DataColumn, DataTable, type DataTableProps, Icon } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { SquarePen } from '@/components/icons';
+
+export interface WebsitesTableProps extends DataTableProps {
+ showActions?: boolean;
+ allowEdit?: boolean;
+ allowView?: boolean;
+ renderLink?: (row: any) => ReactNode;
+}
+
+export function WebsitesTable({ showActions, renderLink, ...props }: WebsitesTableProps) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+
+
+ {renderLink}
+
+
+ {showActions && (
+
+ {(row: any) => {
+ const websiteId = row.id;
+
+ return (
+
+
+
+
+
+ );
+ }}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx
new file mode 100644
index 000000000..8baaae5a1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx
@@ -0,0 +1,125 @@
+import { Column, Grid } from '@umami/react-zen';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { SectionHeader } from '@/components/common/SectionHeader';
+import { useMessages, useResultQuery } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { percentFilter } from '@/lib/filters';
+import { formatLongNumber } from '@/lib/format';
+
+export interface AttributionProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ model: string;
+ type: string;
+ step: string;
+}
+
+export function Attribution({
+ websiteId,
+ startDate,
+ endDate,
+ model,
+ type,
+ step,
+}: AttributionProps) {
+ const { data, error, isLoading } = useResultQuery('attribution', {
+ websiteId,
+ startDate,
+ endDate,
+ model,
+ type,
+ step,
+ });
+
+ const { t, labels } = useMessages();
+
+ const { pageviews, visitors, visits } = data?.total || {};
+
+ const metrics = data
+ ? [
+ {
+ value: visitors,
+ label: t(labels.visitors),
+ formatValue: formatLongNumber,
+ },
+ {
+ value: visits,
+ label: t(labels.visits),
+ formatValue: formatLongNumber,
+ },
+ {
+ value: pageviews,
+ label: t(labels.views),
+ formatValue: formatLongNumber,
+ },
+ ]
+ : [];
+
+ function AttributionTable({ data = [], title }: { data: any; title: string }) {
+ const attributionData = percentFilter(
+ data.map(({ name, value }) => ({
+ x: name,
+ y: Number(value),
+ })),
+ );
+
+ return (
+ ({
+ label: x,
+ count: y,
+ percent: z,
+ }))}
+ />
+ );
+ }
+
+ return (
+
+ {data && (
+
+
+ {metrics?.map(({ label, value, formatValue }) => {
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx
new file mode 100644
index 000000000..f0786332a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx
@@ -0,0 +1,53 @@
+'use client';
+import { Column, Grid, ListItem, SearchField, Select } from '@umami/react-zen';
+import { useState } from 'react';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { Attribution } from './Attribution';
+
+export function AttributionPage({ websiteId }: { websiteId: string }) {
+ const [model, setModel] = useState('first-click');
+ const [type, setType] = useState('path');
+ const [step, setStep] = useState('/');
+ const { t, labels } = useMessages();
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+
+ return (
+
+
+
+
+
+ {t(labels.firstClick)}
+ {t(labels.lastClick)}
+
+
+
+
+ {t(labels.viewedPage)}
+ {t(labels.triggeredEvent)}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx
new file mode 100644
index 000000000..1368d4bcc
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { AttributionPage } from './AttributionPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Attribution',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx
new file mode 100644
index 000000000..0092a506e
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx
@@ -0,0 +1,76 @@
+import { Column, DataColumn, DataTable, Text } from '@umami/react-zen';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useFields, useFormat, useMessages, useResultQuery } from '@/components/hooks';
+import { formatShortTime } from '@/lib/format';
+
+export interface BreakdownProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ selectedFields: string[];
+}
+
+export function Breakdown({ websiteId, selectedFields = [], startDate, endDate }: BreakdownProps) {
+ const { t, labels } = useMessages();
+ const { formatValue } = useFormat();
+ const { fields } = useFields();
+ const { data, error, isLoading } = useResultQuery(
+ 'breakdown',
+ {
+ websiteId,
+ startDate,
+ endDate,
+ fields: selectedFields,
+ },
+ { enabled: !!selectedFields.length },
+ );
+
+ return (
+
+
+
+ {selectedFields.map(field => {
+ return (
+ f.name === field)?.label}
+ width="minmax(120px, 1fr)"
+ >
+ {row => {
+ const value = formatValue(row[field], field);
+ return (
+
+ {value}
+
+ );
+ }}
+
+ );
+ })}
+
+ {row => row?.visitors?.toLocaleString()}
+
+
+ {row => row?.visits?.toLocaleString()}
+
+
+ {row => row?.views?.toLocaleString()}
+
+
+ {row => {
+ const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100;
+ return `${Math.round(+n)}%`;
+ }}
+
+
+ {row => {
+ const n = row?.totaltime / row?.visits;
+ return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`;
+ }}
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx
new file mode 100644
index 000000000..1c3ad7c6d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx
@@ -0,0 +1,62 @@
+'use client';
+import { Column, Row } from '@umami/react-zen';
+import { useState } from 'react';
+import { FieldSelectForm } from '@/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { Panel } from '@/components/common/Panel';
+import { useDateRange, useMessages, useResultQuery } from '@/components/hooks';
+import { ListCheck } from '@/components/icons';
+import { DownloadButton } from '@/components/input/DownloadButton';
+import { DialogButton } from '@/components/input/DialogButton';
+import { Breakdown } from './Breakdown';
+
+export function BreakdownPage({ websiteId }: { websiteId: string }) {
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+ const [fields, setFields] = useState(['path']);
+ const { data } = useResultQuery(
+ 'breakdown',
+ { websiteId, startDate, endDate, fields },
+ { enabled: !!fields.length },
+ );
+ return (
+
+
+
+
+
+ }
+ >
+
+
+
+ );
+}
+
+const FieldsButton = ({ value, onChange }) => {
+ const { t, labels } = useMessages();
+
+ return (
+ }
+ label={t(labels.fields)}
+ width="400px"
+ minHeight="300px"
+ variant="outline"
+ >
+ {({ close }) => {
+ return ;
+ }}
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx
new file mode 100644
index 000000000..b7537c7fa
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx
@@ -0,0 +1,67 @@
+import { Button, Column, Grid, List, ListItem, ListSection } from '@umami/react-zen';
+import { useState } from 'react';
+import { type FieldGroup, useFields, useMessages } from '@/components/hooks';
+
+export function FieldSelectForm({
+ selectedFields = [],
+ onChange,
+ onClose,
+}: {
+ selectedFields?: string[];
+ onChange: (values: string[]) => void;
+ onClose?: () => void;
+}) {
+ const [selected, setSelected] = useState(selectedFields);
+ const { t, labels } = useMessages();
+ const { fields, groupLabels } = useFields();
+
+ const handleChange = (value: string[]) => {
+ setSelected(value);
+ };
+
+ const handleApply = () => {
+ onChange?.(selected);
+ onClose();
+ };
+
+ const groupedFields = fields
+ .filter(field => field.name !== 'event')
+ .reduce(
+ (acc, field) => {
+ const group = field.group;
+ if (!acc[group]) {
+ acc[group] = [];
+ }
+ acc[group].push(field);
+ return acc;
+ },
+ {} as Record,
+ );
+
+ return (
+
+
+
+ {groupLabels.map(({ key: groupKey, label }) => {
+ const groupFields = groupedFields[groupKey];
+ return (
+
+ {groupFields.map(field => (
+
+ {field.filterLabel}
+
+ ))}
+
+ );
+ })}
+
+
+
+ {t(labels.cancel)}
+
+ {t(labels.apply)}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx
new file mode 100644
index 000000000..841d86350
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { BreakdownPage } from './BreakdownPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Insights',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/EventDataFilterRow.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/EventDataFilterRow.tsx
new file mode 100644
index 000000000..f970c62ff
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/EventDataFilterRow.tsx
@@ -0,0 +1,252 @@
+import {
+ Button,
+ Column,
+ ComboBox,
+ FormField,
+ Grid,
+ Icon,
+ ListItem,
+ Loading,
+ Select,
+ useDebounce,
+} from '@umami/react-zen';
+import { endOfDay, subMonths } from 'date-fns';
+import { useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { useApi, useMessages, useMobile } from '@/components/hooks';
+import { X } from '@/components/icons';
+
+export function getEventDataDateRange() {
+ return {
+ startAt: +subMonths(endOfDay(new Date()), 6),
+ endAt: +endOfDay(new Date()),
+ };
+}
+
+function PropertySelect({
+ websiteId,
+ eventName,
+ value,
+ onChange,
+ onPropertyChange,
+}: {
+ websiteId: string;
+ eventName?: string;
+ value?: string;
+ onChange?: (value: string) => void;
+ onPropertyChange?: (value: string) => void;
+}) {
+ const { get, useQuery } = useApi();
+ const { t, messages } = useMessages();
+ const [search, setSearch] = useState(value ?? '');
+ const searchValue = useDebounce(search, 300);
+ const { startAt, endAt } = getEventDataDateRange();
+
+ const { data, isLoading } = useQuery<
+ Array<{ eventName: string; propertyName: string; total: number }>
+ >({
+ queryKey: ['event-data:properties', { websiteId, eventName, searchValue, startAt, endAt }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/properties`, {
+ startAt,
+ endAt,
+ ...(eventName ? { event: eventName } : {}),
+ ...(searchValue ? { propertyName: searchValue } : {}),
+ }),
+ enabled: !!websiteId,
+ });
+
+ const properties = [...new Set(data?.map(d => d.propertyName) ?? [])];
+
+ return (
+ {
+ setSearch(v);
+ onChange?.(v);
+ onPropertyChange?.(v);
+ }}
+ formValue="text"
+ allowsEmptyCollection
+ allowsCustomValue
+ renderEmptyState={() =>
+ isLoading ? (
+
+ ) : (
+
+ )
+ }
+ >
+ {properties.map(p => (
+
+ {p}
+
+ ))}
+
+ );
+}
+
+function ValueSelect({
+ websiteId,
+ eventName,
+ propertyName,
+ value,
+ onChange,
+}: {
+ websiteId: string;
+ eventName?: string;
+ propertyName?: string;
+ value?: string;
+ onChange?: (value: string) => void;
+}) {
+ const { get, useQuery } = useApi();
+ const { t, messages } = useMessages();
+ const { startAt, endAt } = getEventDataDateRange();
+
+ const { data, isLoading } = useQuery>({
+ queryKey: ['event-data:values', { websiteId, eventName, propertyName, startAt, endAt }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/values`, {
+ startAt,
+ endAt,
+ event: eventName,
+ propertyName,
+ }),
+ enabled: !!(websiteId && eventName && propertyName),
+ });
+
+ const values = data?.map(d => d.value) ?? [];
+
+ return (
+ {
+ onChange?.(v);
+ }}
+ formValue="text"
+ allowsEmptyCollection
+ allowsCustomValue
+ renderEmptyState={() =>
+ isLoading ? (
+
+ ) : (
+
+ )
+ }
+ >
+ {values.map(v => (
+
+ {v}
+
+ ))}
+
+ );
+}
+
+function OperatorSelect({
+ value = 'eq',
+ onChange,
+}: {
+ value?: string;
+ onChange?: (value: string) => void;
+}) {
+ const { t, labels } = useMessages();
+ return (
+
+ {t(labels.is)}
+ {t(labels.isNot)}
+ {t(labels.contains)}
+ {t(labels.doesNotContain)}
+
+ );
+}
+
+export interface EventDataFilterRowProps {
+ stepIndex: number;
+ filterIndex: number;
+ websiteId: string;
+ eventName: string;
+ initialProperty?: string;
+ onRemove: () => void;
+}
+
+export function EventDataFilterRow({
+ stepIndex,
+ filterIndex,
+ websiteId,
+ eventName,
+ initialProperty,
+ onRemove,
+}: EventDataFilterRowProps) {
+ const { t, labels } = useMessages();
+ const { isMobile } = useMobile();
+ const [propertyName, setPropertyName] = useState(initialProperty ?? '');
+
+ if (isMobile) {
+ return (
+
+
+
+ setPropertyName(v)}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ setPropertyName(v)}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx
new file mode 100644
index 000000000..4d599f70d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx
@@ -0,0 +1,147 @@
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useNavigation, useOperatorLabels, useResultQuery } from '@/components/hooks';
+import { File, User } from '@/components/icons';
+import { ReportEditButton } from '@/components/input/ReportEditButton';
+import { ChangeLabel } from '@/components/metrics/ChangeLabel';
+import { Lightning } from '@/components/svg';
+import { formatLongNumber } from '@/lib/format';
+import type { FunnelResult } from '@/queries/sql/reports/getFunnel';
+import { Box, Column, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen';
+import { FunnelEditForm } from './FunnelEditForm';
+
+interface FunnelProps {
+ id: string;
+ name: string;
+ type: string;
+ parameters: Record;
+ websiteId: string;
+}
+
+export function Funnel({ id, name, type, parameters, websiteId }: FunnelProps) {
+ const { t, labels } = useMessages();
+ const { pathname } = useNavigation();
+ const isSharePage = pathname.includes('/share/');
+ const { data, error, isLoading } = useResultQuery>(type, {
+ websiteId,
+ ...parameters,
+ });
+
+ const operatorLabels = useOperatorLabels();
+
+ return (
+
+
+
+
+
+
+ {name}
+
+
+
+ {!isSharePage && (
+
+
+ {({ close }) => }
+
+
+ )}
+
+ {data?.map(
+ (
+ { type, value, filters, visitors, previous, dropped, dropoff, remaining }: FunnelResult,
+ index: number,
+ ) => {
+ const isPage = type === 'path';
+ return (
+
+
+
+
+ {index + 1}
+
+
+ {index > 0 && (
+
+ )}
+
+
+
+
+ {t(isPage ? labels.viewedPage : labels.triggeredEvent)}
+
+ {t(labels.conversionRate)}
+
+
+
+
+ {type === 'path' ? : }
+ {value}
+
+ {filters?.map((f, i) => (
+
+ {f.property}
+
+ {operatorLabels[f.operator] ?? f.operator}
+
+ {f.value}
+
+ ))}
+
+
+ {index > 0 && (
+
+ {formatLongNumber(dropped)}
+
+ )}
+
+
+
+
+ {`${formatLongNumber(visitors)} ${t(labels.visitors)}`}
+
+
+
+
+
+
+
+ {Math.round(remaining * 100)}%
+
+
+
+
+
+ );
+ },
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx
new file mode 100644
index 000000000..89cdb789a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx
@@ -0,0 +1,21 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { FunnelEditForm } from './FunnelEditForm';
+
+export function FunnelAddButton({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ }
+ label={t(labels.funnel)}
+ title={t(labels.funnel)}
+ width="700px"
+ height="600px"
+ >
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx
new file mode 100644
index 000000000..f8baa5c9e
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx
@@ -0,0 +1,255 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormButtons,
+ FormField,
+ FormFieldArray,
+ FormSubmitButton,
+ Grid,
+ Icon,
+ ListSeparator,
+ Loading,
+ Row,
+ Text,
+ TextField,
+} from '@umami/react-zen';
+import { Fragment, useState } from 'react';
+import { useApi, useMessages, useMobile, useReportQuery, useUpdateQuery } from '@/components/hooks';
+import { Plus, X } from '@/components/icons';
+import { ActionSelect } from '@/components/input/ActionSelect';
+import { LookupField } from '@/components/input/LookupField';
+import { EventDataFilterRow, getEventDataDateRange } from './EventDataFilterRow';
+
+const FUNNEL_STEPS_MAX = 8;
+
+function StepRow({
+ index,
+ websiteId,
+ initialEventName,
+ onRemove,
+}: {
+ index: number;
+ websiteId: string;
+ initialEventName?: string;
+ onRemove: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { isMobile } = useMobile();
+ const { get, useQuery } = useApi();
+ const [eventName, setEventName] = useState(initialEventName ?? '');
+ const { startAt, endAt } = getEventDataDateRange();
+
+ const { data: eventProperties } = useQuery>({
+ queryKey: ['event-data:properties', { websiteId, eventName, searchValue: '', startAt, endAt }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/properties`, {
+ startAt,
+ endAt,
+ ...(eventName ? { event: eventName } : {}),
+ }),
+ enabled: !!websiteId && !!eventName,
+ });
+
+ const hasEventData = (eventProperties?.length ?? 0) > 0;
+
+ const valueField = (
+
+ {({ field, context }) => {
+ const type = context.watch(`steps.${index}.type`);
+ return (
+ {
+ setEventName(v);
+ }}
+ />
+ );
+ }}
+
+ );
+
+ return (
+
+ {isMobile ? (
+
+
+
+
+
+ {valueField}
+
+
+
+
+
+
+
+ ) : (
+
+
+
+
+
+
+
+ {valueField}
+
+
+
+
+
+
+
+ )}
+
+ {({ fields: filterFields, append: appendFilter, remove: removeFilter, watch }) => {
+ const stepType = watch(`steps.${index}.type`);
+
+ if (stepType !== 'event') return null;
+
+ return (
+
+ {filterFields.map(
+ (
+ { id: filterId, property: initialProperty }: { id: string; property?: string },
+ filterIndex: number,
+ ) => (
+ removeFilter(filterIndex)}
+ />
+ ),
+ )}
+ {hasEventData && (
+
+ appendFilter({ property: '', operator: 'eq', value: '' })}
+ >
+
+
+
+ {t(labels.filter)}
+
+
+ )}
+
+ );
+ }}
+
+
+ );
+}
+
+export function FunnelEditForm({
+ id,
+ websiteId,
+ onSave,
+ onClose,
+}: {
+ id?: string;
+ websiteId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { data, isLoading } = useReportQuery(id);
+ const { mutateAsync, error, isPending, touch } = useUpdateQuery(`/reports${id ? `/${id}` : ''}`);
+
+ const handleSubmit = async ({
+ name,
+ ...parameters
+ }: {
+ name: string;
+ [key: string]: unknown;
+ }) => {
+ await mutateAsync(
+ { ...data, id, name, type: 'funnel', websiteId, parameters },
+ {
+ onSuccess: async () => {
+ touch('reports:funnel');
+ touch(`report:${id}`);
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ if (id && isLoading) {
+ return ;
+ }
+
+ const defaultValues = {
+ name: data?.name || '',
+ window: data?.parameters?.window || 60,
+ steps: (data?.parameters?.steps || [{ type: 'path', value: '' }]).map(step => ({
+ ...step,
+ filters: step.filters || [],
+ })),
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx
new file mode 100644
index 000000000..a56917b76
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx
@@ -0,0 +1,40 @@
+'use client';
+import { Column, Grid } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { SectionHeader } from '@/components/common/SectionHeader';
+import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks';
+import { Funnel } from './Funnel';
+import { FunnelAddButton } from './FunnelAddButton';
+
+export function FunnelsPage({ websiteId }: { websiteId: string }) {
+ const { data, isLoading, error } = useReportsQuery({ websiteId, type: 'funnel' });
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+ const { pathname } = useNavigation();
+ const isSharePage = pathname.includes('/share/');
+
+ return (
+
+
+ {!isSharePage && (
+
+
+
+ )}
+
+ {data && (
+
+ {data.data?.map((report: any) => (
+
+
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx
new file mode 100644
index 000000000..2fdcf3b7b
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { FunnelsPage } from './FunnelsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Funnels',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx
new file mode 100644
index 000000000..cebefb555
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx
@@ -0,0 +1,91 @@
+import { Column, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useNavigation, useResultQuery } from '@/components/hooks';
+import { File, User } from '@/components/icons';
+import { ReportEditButton } from '@/components/input/ReportEditButton';
+import { Lightning } from '@/components/svg';
+import { formatLongNumber } from '@/lib/format';
+import { GoalEditForm } from './GoalEditForm';
+
+export interface GoalProps {
+ id: string;
+ name: string;
+ type: string;
+ parameters: {
+ name: string;
+ type: string;
+ value: string;
+ };
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+}
+
+export type GoalData = { num: number; total: number };
+
+export function Goal({ id, name, type, parameters, websiteId, startDate, endDate }: GoalProps) {
+ const { t, labels } = useMessages();
+ const { pathname } = useNavigation();
+ const isSharePage = pathname.includes('/share/');
+ const { data, error, isLoading, isFetching } = useResultQuery(type, {
+ websiteId,
+ startDate,
+ endDate,
+ ...parameters,
+ });
+ const isPage = parameters?.type === 'path';
+
+ return (
+
+ {data && (
+
+
+
+
+
+ {name}
+
+
+
+ {!isSharePage && (
+
+
+ {({ close }) => }
+
+
+ )}
+
+
+ {t(isPage ? labels.viewedPage : labels.triggeredEvent)}
+ {t(labels.conversionRate)}
+
+
+
+ {parameters.type === 'path' ? : }
+ {parameters.value}
+
+
+
+
+
+ {`${formatLongNumber(
+ data?.num,
+ )} / ${formatLongNumber(data?.total)}`}
+
+
+
+
+
+ {data?.total ? Math.round((+data?.num / +data?.total) * 100) : '0'}%
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx
new file mode 100644
index 000000000..3e1a42750
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx
@@ -0,0 +1,21 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { GoalEditForm } from './GoalEditForm';
+
+export function GoalAddButton({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ }
+ label={t(labels.goal)}
+ title={t(labels.goal)}
+ minWidth="400px"
+ minHeight="300px"
+ >
+ {({ close }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx
new file mode 100644
index 000000000..3c3b22e52
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx
@@ -0,0 +1,108 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ Grid,
+ Label,
+ Loading,
+ TextField,
+} from '@umami/react-zen';
+import { useMessages, useMobile, useReportQuery, useUpdateQuery } from '@/components/hooks';
+import { ActionSelect } from '@/components/input/ActionSelect';
+import { LookupField } from '@/components/input/LookupField';
+
+export function GoalEditForm({
+ id,
+ websiteId,
+ onSave,
+ onClose,
+}: {
+ id?: string;
+ websiteId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { isMobile } = useMobile();
+ const { data } = useReportQuery(id);
+ const { mutateAsync, error, isPending, touch } = useUpdateQuery(`/reports${id ? `/${id}` : ''}`);
+
+ const handleSubmit = async (formData: Record) => {
+ await mutateAsync(
+ { ...formData, type: 'goal', websiteId },
+ {
+ onSuccess: async () => {
+ if (id) touch(`report:${id}`);
+ touch('reports:goal');
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ if (id && !data) {
+ return ;
+ }
+
+ const defaultValues = {
+ name: '',
+ parameters: { type: 'path', value: '' },
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx
new file mode 100644
index 000000000..aa399b92b
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx
@@ -0,0 +1,40 @@
+'use client';
+import { Column, Grid } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { SectionHeader } from '@/components/common/SectionHeader';
+import { useDateRange, useNavigation, useReportsQuery } from '@/components/hooks';
+import { Goal } from './Goal';
+import { GoalAddButton } from './GoalAddButton';
+
+export function GoalsPage({ websiteId }: { websiteId: string }) {
+ const { data, isLoading, error } = useReportsQuery({ websiteId, type: 'goal' });
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+ const { pathname } = useNavigation();
+ const isSharePage = pathname.includes('/share/');
+
+ return (
+
+
+ {!isSharePage && (
+
+
+
+ )}
+
+ {data && (
+
+ {data.data.map((report: any) => (
+
+
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx
new file mode 100644
index 000000000..b1ab691a0
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { GoalsPage } from './GoalsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Goals',
+};
diff --git a/src/app/(main)/reports/journey/JourneyView.module.css b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css
similarity index 82%
rename from src/app/(main)/reports/journey/JourneyView.module.css
rename to src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css
index 908f02cb0..ec6a2bd55 100644
--- a/src/app/(main)/reports/journey/JourneyView.module.css
+++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css
@@ -3,9 +3,9 @@
height: 100%;
position: relative;
- --journey-line-color: var(--base600);
- --journey-active-color: var(--primary400);
- --journey-faded-color: var(--base300);
+ --journey-line-color: var(--border-strong);
+ --journey-active-color: var(--primary);
+ --journey-faded-color: var(--interactive-bg);
}
.view {
@@ -28,11 +28,11 @@
.stats {
display: flex;
+ flex-direction: column;
align-items: center;
- justify-content: center;
- gap: 20px;
+ justify-content: flex-start;
+ gap: 10px;
width: 100%;
- height: 40px;
}
.visitors {
@@ -43,8 +43,8 @@
.dropoff {
font-weight: 600;
- color: var(--blue800);
- background: var(--blue100);
+ color: var(--text-muted);
+ background: var(--surface-sunken);
padding: 4px 8px;
border-radius: 5px;
}
@@ -58,8 +58,8 @@
height: 50px;
font-size: 16px;
font-weight: 700;
- color: var(--base100);
- background: var(--base800);
+ color: var(--surface-base);
+ background: var(--surface-inverted);
z-index: 1;
margin: 0 auto 20px;
}
@@ -84,7 +84,7 @@
position: relative;
cursor: pointer;
padding: 10px 20px;
- background: var(--base75);
+ background: var(--interactive-bg);
border-radius: 5px;
display: flex;
align-items: center;
@@ -96,40 +96,33 @@
}
.node:hover:not(.selected) {
- color: var(--base900);
- background: var(--base100);
+ background: var(--interactive-bg-hover);
}
.node.selected {
- color: var(--base75);
- background: var(--base900);
- font-weight: 400;
+ color: var(--surface-base);
+ background: var(--surface-inverted);
}
.node.active {
- color: var(--light50);
- background: var(--primary400);
+ color: var(--primary-foreground);
+ background: var(--primary);
}
.node.selected .count {
- color: var(--base50);
- background: var(--base800);
+ color: var(--surface-base);
+ background: var(--surface-inverted);
}
.node.selected.active .count {
- background: var(--primary600);
+ color: var(--primary-foreground);
+ background: var(--primary);
}
.name {
max-width: 200px;
}
-.count {
- border-radius: 4px;
- padding: 5px 10px;
- background: var(--base200);
-}
-
.line {
position: absolute;
bottom: 0;
@@ -215,11 +208,11 @@
.start:before,
.end:before {
- content: '';
+ content: "";
position: absolute;
border-radius: 100%;
border: 3px solid var(--journey-line-color);
- background: var(--light50);
+ background: var(--surface-base);
width: 14px;
height: 14px;
}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx
new file mode 100644
index 000000000..8b3c47499
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx
@@ -0,0 +1,302 @@
+import { Column, Focusable, Icon, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import classNames from 'classnames';
+import { useMemo, useState } from 'react';
+import { firstBy } from 'thenby';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useEscapeKey, useMessages, useResultQuery } from '@/components/hooks';
+import { File } from '@/components/icons';
+import { Lightning } from '@/components/svg';
+import { objectToArray } from '@/lib/data';
+import { formatLongNumber } from '@/lib/format';
+import styles from './Journey.module.css';
+
+const NODE_HEIGHT = 60;
+const NODE_GAP = 10;
+const LINE_WIDTH = 3;
+
+export interface JourneyProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ steps: number;
+ startStep?: string;
+ endStep?: string;
+ view: string;
+}
+
+const EVENT_TYPES = {
+ views: 1,
+ events: 2,
+};
+
+export function Journey({ websiteId, steps, startStep, endStep, view }: JourneyProps) {
+ const [selectedNode, setSelectedNode] = useState(null);
+ const [activeNode, setActiveNode] = useState(null);
+ const { t, labels } = useMessages();
+ const { data, error, isLoading } = useResultQuery('journey', {
+ websiteId,
+ steps,
+ startStep,
+ endStep,
+ view,
+ eventType: EVENT_TYPES[view],
+ });
+
+ useEscapeKey(() => setSelectedNode(null));
+
+ const columns = useMemo(() => {
+ if (!data) {
+ return [];
+ }
+
+ const selectedPaths = selectedNode?.paths ?? [];
+ const activePaths = activeNode?.paths ?? [];
+ const columns = [];
+
+ for (let columnIndex = 0; columnIndex < +steps; columnIndex++) {
+ const nodes = {};
+
+ data.forEach(({ items, count }: any, nodeIndex: any) => {
+ const name = items[columnIndex];
+
+ if (name) {
+ const selected = !!selectedPaths.find(({ items }) => items[columnIndex] === name);
+ const active = selected && !!activePaths.find(({ items }) => items[columnIndex] === name);
+
+ if (!nodes[name]) {
+ const paths = data.filter(({ items }) => items[columnIndex] === name);
+
+ nodes[name] = {
+ name,
+ count,
+ totalCount: count,
+ nodeIndex,
+ columnIndex,
+ selected,
+ active,
+ paths,
+ pathMap: paths.map(({ items, count }) => ({
+ [`${columnIndex}:${items.join(':')}`]: count,
+ })),
+ };
+ } else {
+ nodes[name].totalCount += count;
+ }
+ }
+ });
+
+ columns.push({
+ nodes: objectToArray(nodes).sort(firstBy('total', -1)),
+ });
+ }
+
+ columns.forEach((column, columnIndex) => {
+ const nodes = column.nodes.map(
+ (
+ currentNode: { totalCount: number; name: string; selected: boolean },
+ currentNodeIndex: any,
+ ) => {
+ const previousNodes = columns[columnIndex - 1]?.nodes;
+ let selectedCount = previousNodes ? 0 : currentNode.totalCount;
+ let activeCount = selectedCount;
+
+ const lines =
+ previousNodes?.reduce((arr: any[][], previousNode: any, previousNodeIndex: number) => {
+ const fromCount = selectedNode?.paths.reduce((sum, path) => {
+ if (
+ previousNode.name === path.items[columnIndex - 1] &&
+ currentNode.name === path.items[columnIndex]
+ ) {
+ sum += path.count;
+ }
+ return sum;
+ }, 0);
+
+ if (currentNode.selected && previousNode.selected && fromCount) {
+ arr.push([previousNodeIndex, currentNodeIndex]);
+ selectedCount += fromCount;
+
+ if (previousNode.active) {
+ activeCount += fromCount;
+ }
+ }
+
+ return arr;
+ }, []) || [];
+
+ return { ...currentNode, selectedCount, activeCount, lines };
+ },
+ );
+
+ const visitorCount = nodes.reduce(
+ (sum: number, { selected, selectedCount, active, activeCount, totalCount }) => {
+ if (!selectedNode) {
+ sum += totalCount;
+ } else if (!activeNode && selectedNode && selected) {
+ sum += selectedCount;
+ } else if (activeNode && active) {
+ sum += activeCount;
+ }
+ return sum;
+ },
+ 0,
+ );
+
+ const previousTotal = columns[columnIndex - 1]?.visitorCount ?? 0;
+ const dropOff =
+ previousTotal > 0 ? ((visitorCount - previousTotal) / previousTotal) * 100 : 0;
+
+ Object.assign(column, { nodes, visitorCount, dropOff });
+ });
+
+ return columns;
+ }, [data, selectedNode, activeNode]);
+
+ const handleClick = (name: string, columnIndex: number, paths: any[]) => {
+ if (name !== selectedNode?.name || columnIndex !== selectedNode?.columnIndex) {
+ setSelectedNode({ name, columnIndex, paths });
+ } else {
+ setSelectedNode(null);
+ }
+ setActiveNode(null);
+ };
+
+ return (
+
+
+
+ {columns.map(({ visitorCount, nodes }, columnIndex) => {
+ return (
+
+
+
{columnIndex + 1}
+
+
+ {formatLongNumber(visitorCount)} {t(labels.visitors)}
+
+
+
+
+ {nodes.map(
+ ({
+ name,
+ totalCount,
+ selected,
+ active,
+ paths,
+ activeCount,
+ selectedCount,
+ lines,
+ }) => {
+ const nodeCount = selected
+ ? active
+ ? activeCount
+ : selectedCount
+ : totalCount;
+
+ const remaining =
+ columnIndex > 0
+ ? Math.round((nodeCount / columns[columnIndex - 1]?.visitorCount) * 100)
+ : 0;
+
+ const dropped = 100 - remaining;
+
+ return (
+
+ selected && setActiveNode({ name, columnIndex, paths })
+ }
+ onMouseLeave={() => selected && setActiveNode(null)}
+ >
+
handleClick(name, columnIndex, paths)}
+ >
+
+ {name.startsWith('/') ? : }
+ {name}
+
+
+
+
+ {formatLongNumber(nodeCount)}
+
+
+
+ {`${dropped}% ${t(labels.dropoff)}`}
+
+
+
+ {`${remaining}% ${t(labels.conversion)}`}
+
+
+
+
+
+ {columnIndex < columns.length &&
+ lines.map(([fromIndex, nodeIndex], i) => {
+ const height =
+ (Math.abs(nodeIndex - fromIndex) + 1) * (NODE_HEIGHT + NODE_GAP) -
+ NODE_GAP;
+ const midHeight =
+ (Math.abs(nodeIndex - fromIndex) - 1) * (NODE_HEIGHT + NODE_GAP) +
+ NODE_GAP +
+ LINE_WIDTH;
+ const nodeName = columns[columnIndex - 1]?.nodes[fromIndex].name;
+
+ return (
+
+ path.items[columnIndex] === name &&
+ path.items[columnIndex - 1] === nodeName,
+ ),
+ [styles.up]: fromIndex < nodeIndex,
+ [styles.down]: fromIndex > nodeIndex,
+ [styles.flat]: fromIndex === nodeIndex,
+ })}
+ style={{ height }}
+ >
+
+
+
+
+ );
+ })}
+
+
+ );
+ },
+ )}
+
+
+ );
+ })}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx
new file mode 100644
index 000000000..f7cc4a88d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx
@@ -0,0 +1,82 @@
+'use client';
+import { Column, Grid, ListItem, Row, SearchField, Select } from '@umami/react-zen';
+import { useState } from 'react';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { Panel } from '@/components/common/Panel';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { FilterButtons } from '@/components/input/FilterButtons';
+import { Journey } from './Journey';
+
+const JOURNEY_STEPS = [2, 3, 4, 5, 6, 7];
+const DEFAULT_STEP = 3;
+
+export function JourneysPage({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+ const [view, setView] = useState('all');
+ const [steps, setSteps] = useState(DEFAULT_STEP);
+ const [startStep, setStartStep] = useState('');
+ const [endStep, setEndStep] = useState('');
+
+ const buttons = [
+ {
+ id: 'all',
+ label: t(labels.all),
+ },
+ {
+ id: 'views',
+ label: t(labels.views),
+ },
+ {
+ id: 'events',
+ label: t(labels.events),
+ },
+ ];
+
+ return (
+
+
+
+
+ {JOURNEY_STEPS.map(step => (
+
+ {step}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx
new file mode 100644
index 000000000..f6062a61d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { JourneysPage } from './JourneysPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Journeys',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.module.css b/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.module.css
new file mode 100644
index 000000000..ddb5dc10a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.module.css
@@ -0,0 +1,3 @@
+.sampleCount {
+ color: var(--base-color-text-secondary);
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.tsx b/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.tsx
new file mode 100644
index 000000000..ff7bbb516
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/performance/Performance.tsx
@@ -0,0 +1,304 @@
+'use client';
+import {
+ Column,
+ Grid,
+ Heading,
+ ListItem,
+ Row,
+ Select,
+ Tab,
+ TabList,
+ TabPanel,
+ Tabs,
+ Text,
+} from '@umami/react-zen';
+import { colord } from 'colord';
+import { useCallback, useMemo, useState } from 'react';
+import { BarChart } from '@/components/charts/BarChart';
+import { GridRow } from '@/components/common/GridRow';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { useLocale, useMessages, useResultQuery } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
+import { MetricLabel } from '@/components/metrics/MetricLabel';
+import { PerformanceCard } from '@/components/metrics/PerformanceCard';
+import { renderDateLabels } from '@/lib/charts';
+import { CHART_COLORS, WEB_VITALS_THRESHOLDS } from '@/lib/constants';
+import { generateTimeSeries } from '@/lib/date';
+import { formatLongNumber } from '@/lib/format';
+import styles from './Performance.module.css';
+
+export interface PerformanceProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ unit: string;
+}
+
+const METRICS = ['lcp', 'inp', 'cls', 'fcp', 'ttfb'] as const;
+
+const METRIC_LABELS: Record = {
+ lcp: 'Largest Contentful Paint',
+ inp: 'Interaction to Next Paint',
+ cls: 'Cumulative Layout Shift',
+ fcp: 'First Contentful Paint',
+ ttfb: 'Time to First Byte',
+};
+
+function formatMetricValue(metric: string, value: number): string {
+ if (metric === 'cls') return value.toFixed(3);
+ if (value >= 1000) return `${(value / 1000).toFixed(2)} s`;
+ return `${Math.round(value)} ms`;
+}
+
+const PERCENTILES = [
+ { id: 'p50', label: 'p50 — Median' },
+ { id: 'p75', label: 'p75 — 75th Percentile' },
+ { id: 'p95', label: 'p95 — 95th Percentile' },
+] as const;
+
+export function Performance({ websiteId, startDate, endDate, unit }: PerformanceProps) {
+ const [selectedMetric, setSelectedMetric] = useState('lcp');
+ const [selectedPercentile, setSelectedPercentile] = useState<'p50' | 'p75' | 'p95'>('p75');
+ const { t, labels } = useMessages();
+ const { locale, dateLocale } = useLocale();
+
+ const { data, error, isLoading } = useResultQuery('performance', {
+ websiteId,
+ startDate,
+ endDate,
+ metric: selectedMetric,
+ });
+
+ const chartData: any = useMemo(() => {
+ if (!data?.chart) return { datasets: [] };
+
+ const p50Color = colord(CHART_COLORS[0]);
+ const p75Color = colord(CHART_COLORS[1]);
+ const p95Color = colord(CHART_COLORS[2]);
+
+ return {
+ datasets: [
+ {
+ label: 'p50',
+ data: generateTimeSeries(
+ data.chart.map((d: any) => ({ x: d.t, y: Number(d.p50) })),
+ startDate,
+ endDate,
+ unit,
+ dateLocale,
+ ),
+ type: 'line',
+ borderColor: p50Color.alpha(0.8).toRgbString(),
+ backgroundColor: p50Color.alpha(0.1).toRgbString(),
+ borderWidth: 2,
+ fill: false,
+ tension: 0.3,
+ pointRadius: 2,
+ },
+ {
+ label: 'p75',
+ data: generateTimeSeries(
+ data.chart.map((d: any) => ({ x: d.t, y: Number(d.p75) })),
+ startDate,
+ endDate,
+ unit,
+ dateLocale,
+ ),
+ type: 'line',
+ borderColor: p75Color.alpha(0.8).toRgbString(),
+ backgroundColor: p75Color.alpha(0.1).toRgbString(),
+ borderWidth: 2,
+ fill: false,
+ tension: 0.3,
+ pointRadius: 2,
+ },
+ {
+ label: 'p95',
+ data: generateTimeSeries(
+ data.chart.map((d: any) => ({ x: d.t, y: Number(d.p95) })),
+ startDate,
+ endDate,
+ unit,
+ dateLocale,
+ ),
+ type: 'line',
+ borderColor: p95Color.alpha(0.8).toRgbString(),
+ backgroundColor: p95Color.alpha(0.1).toRgbString(),
+ borderWidth: 2,
+ fill: false,
+ tension: 0.3,
+ pointRadius: 2,
+ },
+ ],
+ };
+ }, [data, startDate, endDate, unit]);
+
+ const renderXLabel = useCallback(renderDateLabels(unit, locale), [unit, locale]);
+
+ const threshold = WEB_VITALS_THRESHOLDS[selectedMetric as keyof typeof WEB_VITALS_THRESHOLDS];
+ const isCls = selectedMetric === 'cls';
+ const metricLabel = t(labels[selectedMetric]) || selectedMetric.toUpperCase();
+ const formatListCount = isCls
+ ? (n: number) => n.toFixed(3)
+ : (n: number) => `${(n / 1000).toFixed(2)} s`;
+
+ return (
+
+
+ setSelectedPercentile(value as 'p50' | 'p75' | 'p95')}
+ >
+ {PERCENTILES.map(({ id, label }) => (
+
+ {label}
+
+ ))}
+
+
+
+ {data && (
+
+
+ {METRICS.map(metric => (
+ formatMetricValue(metric, n)}
+ onClick={() => setSelectedMetric(metric)}
+ selected={selectedMetric === metric}
+ />
+ ))}
+
+
+
+
+ {METRIC_LABELS[selectedMetric]}
+
+
+ {t(labels.sampleSize)}: {formatLongNumber(data.summary?.count || 0)}
+
+
+
+ {
+ const val = Number(label);
+ if (selectedMetric === 'cls') return val.toFixed(2);
+ if (val >= 1000) return `${(val / 1000).toFixed(2)} s`;
+ return `${Math.round(val)} ms`;
+ }}
+ height="400px"
+ />
+
+
+
+
+
+ {t(labels.pages)}
+
+ {t(labels.path)}
+ {t(labels.pageTitle)}
+
+
+
+ Number({ p50, p75, p95 }[selectedPercentile]) > 0,
+ )
+ .slice(0, 20)
+ .map(({ name, p50, p75, p95 }: any) => ({
+ label: name,
+ count: Number({ p50, p75, p95 }[selectedPercentile]),
+ percent: 0,
+ }))}
+ renderLabel={({ label }: { label: string }) => {label} }
+ />
+
+
+
+ Number({ p50, p75, p95 }[selectedPercentile]) > 0,
+ )
+ .slice(0, 20)
+ .map(({ name, p50, p75, p95 }: any) => ({
+ label: name,
+ count: Number({ p50, p75, p95 }[selectedPercentile]),
+ percent: 0,
+ }))}
+ renderLabel={(row: any) => }
+ />
+
+
+
+
+
+ {t(labels.environment)}
+
+ {t(labels.device)}
+ {t(labels.browser)}
+
+
+
+ Number({ p50, p75, p95 }[selectedPercentile]) > 0,
+ )
+ .slice(0, 20)
+ .map(({ name, p50, p75, p95 }: any) => ({
+ label: name,
+ count: Number({ p50, p75, p95 }[selectedPercentile]),
+ percent: 0,
+ }))}
+ renderLabel={(row: any) => }
+ />
+
+
+
+ Number({ p50, p75, p95 }[selectedPercentile]) > 0,
+ )
+ .slice(0, 20)
+ .map(({ name, p50, p75, p95 }: any) => ({
+ label: name,
+ count: Number({ p50, p75, p95 }[selectedPercentile]),
+ percent: 0,
+ }))}
+ renderLabel={(row: any) => }
+ />
+
+
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/performance/PerformancePage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/performance/PerformancePage.tsx
new file mode 100644
index 000000000..3cd8d0d0a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/performance/PerformancePage.tsx
@@ -0,0 +1,18 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useDateRange } from '@/components/hooks';
+import { Performance } from './Performance';
+
+export function PerformancePage({ websiteId }: { websiteId: string }) {
+ const {
+ dateRange: { startDate, endDate, unit },
+ } = useDateRange();
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/performance/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/performance/page.tsx
new file mode 100644
index 000000000..dad23a2c5
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/performance/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { PerformancePage } from './PerformancePage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Performance',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx
new file mode 100644
index 000000000..4b9053d51
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx
@@ -0,0 +1,140 @@
+import { Column, Grid, Icon, Row, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { useLocale, useMessages, useResultQuery } from '@/components/hooks';
+import { Users } from '@/components/icons';
+import { formatDate } from '@/lib/date';
+import { formatLongNumber } from '@/lib/format';
+
+const DAYS = [1, 2, 3, 4, 5, 6, 7, 14, 21, 28];
+
+export interface RetentionProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ days?: number[];
+}
+
+export function Retention({ websiteId, days = DAYS, startDate, endDate }: RetentionProps) {
+ const { t, labels } = useMessages();
+ const { locale } = useLocale();
+ const { data, error, isLoading } = useResultQuery('retention', {
+ websiteId,
+ startDate,
+ endDate,
+ });
+
+ const rows =
+ data?.reduce((arr: any[], row: { date: any; visitors: any; day: any }) => {
+ const { date, visitors, day } = row;
+ if (day === 0) {
+ return arr.concat({
+ date,
+ visitors,
+ records: days
+ .reduce((arr, day) => {
+ arr[day] = data.find(
+ (x: { date: any; day: number }) => x.date === date && x.day === day,
+ );
+ return arr;
+ }, [])
+ .filter(n => n),
+ });
+ }
+ return arr;
+ }, []) || [];
+
+ const totalDays = rows.length;
+
+ return (
+
+ {data && (
+
+
+
+
+
+
+ {t(labels.cohort)}
+
+
+ {days.map(n => (
+
+
+ {t(labels.day)} {n}
+
+
+ ))}
+
+ {rows.map(({ date, visitors, records }: any, rowIndex: number) => {
+ return (
+
+
+ {formatDate(date, 'PP', locale)}
+
+
+
+
+ {formatLongNumber(visitors)}
+
+
+ {days.map(day => {
+ if (totalDays - rowIndex < day) {
+ return null;
+ }
+ const percentage = records.filter(a => a.day === day)[0]?.percentage;
+ return (
+
+ {percentage ? `${Number(percentage).toFixed(2)}%` : ''}
+ |
+ );
+ })}
+
+ );
+ })}
+
+
+
+ )}
+
+ );
+}
+
+const Cell = ({ children }: { children: ReactNode }) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx
new file mode 100644
index 000000000..0ec6e95ed
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx
@@ -0,0 +1,22 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { endOfMonth, startOfMonth } from 'date-fns';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useDateRange } from '@/components/hooks';
+import { Retention } from './Retention';
+
+export function RetentionPage({ websiteId }: { websiteId: string }) {
+ const {
+ dateRange: { startDate },
+ } = useDateRange();
+
+ const monthStartDate = startOfMonth(startDate);
+ const monthEndDate = endOfMonth(startDate);
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx
new file mode 100644
index 000000000..2fbbc0ac3
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { RetentionPage } from './RetentionPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Retention',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx
new file mode 100644
index 000000000..6dce11d8c
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx
@@ -0,0 +1,262 @@
+import { Column, Grid, Heading, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { useMemo, useState } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { GridRow } from '@/components/common/GridRow';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import {
+ useDateRange,
+ useMessages,
+ useNavigation,
+ useResultQuery,
+ useRevenueSessionsQuery,
+} from '@/components/hooks';
+import { CurrencySelect } from '@/components/input/CurrencySelect';
+import { ListTable } from '@/components/metrics/ListTable';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricLabel } from '@/components/metrics/MetricLabel';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { RevenueChart } from '@/components/metrics/RevenueChart';
+import { CURRENCY_CONFIG, DEFAULT_CURRENCY } from '@/lib/constants';
+import { formatLongCurrency, formatLongNumber } from '@/lib/format';
+import { getItem, setItem } from '@/lib/storage';
+import { SessionModal } from '../../sessions/SessionModal';
+import { SessionsTable } from '../../sessions/SessionsTable';
+
+function RevenueSessionsDataTable({
+ websiteId,
+ currency,
+}: {
+ websiteId: string;
+ currency: string;
+}) {
+ const { updateParams } = useNavigation();
+ const queryResult = useRevenueSessionsQuery(websiteId, currency);
+
+ return (
+
+ {({ data }) => (
+ updateParams({ session: row.id })}
+ />
+ )}
+
+ );
+}
+
+export interface RevenueProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+ unit: string;
+}
+
+export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) {
+ const [currency, setCurrency] = useState(
+ getItem(CURRENCY_CONFIG) || process.env.defaultCurrency || DEFAULT_CURRENCY,
+ );
+
+ const handleCurrencyChange = (value: string) => {
+ setCurrency(value);
+ setItem(CURRENCY_CONFIG, value);
+ };
+
+ const { t, labels } = useMessages();
+ const { compare, isAllTime } = useDateRange();
+ const { data, error, isLoading } = useResultQuery('revenue', {
+ websiteId,
+ startDate,
+ endDate,
+ currency,
+ compare,
+ });
+
+ const metrics = useMemo(() => {
+ if (!data) return [];
+
+ const { sum, count, average, unique_count, arpu, comparison } = data.total;
+
+ return [
+ {
+ value: sum,
+ label: t(labels.total),
+ change: comparison ? sum - comparison.sum : 0,
+ formatValue: (n: number) => formatLongCurrency(n, currency),
+ },
+ {
+ value: average,
+ label: t(labels.aov),
+ tooltip: (
+ <>
+ Average Order Value
+ (Total Revenue / Orders)
+ >
+ ),
+ change: comparison ? average - comparison.average : 0,
+ formatValue: (n: number) => formatLongCurrency(n, currency),
+ },
+ {
+ value: arpu,
+ label: t(labels.arpu),
+ tooltip: (
+ <>
+ Average Revenue Per User
+ (Total Revenue / All Sessions)
+ >
+ ),
+ change: comparison ? arpu - (comparison.arpu ?? 0) : 0,
+ formatValue: (n: number) => formatLongCurrency(n, currency),
+ },
+ {
+ value: count,
+ label: t(labels.orders),
+ change: comparison ? count - comparison.count : 0,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: unique_count,
+ label: t(labels.uniqueCustomers),
+ change: comparison ? unique_count - comparison.unique_count : 0,
+ formatValue: formatLongNumber,
+ },
+ ] as any;
+ }, [data]);
+
+ const renderLabel = (type: string) => (data: any) => ;
+
+ return (
+
+
+
+
+
+ {data && (
+
+
+ {metrics?.map(({ label, value, change, formatValue, tooltip }) => {
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+
+ {t(labels.sources)}
+
+
+ {t(labels.referrers)}
+ {t(labels.channels)}
+
+
+ ({
+ label: name,
+ count: Number(value),
+ percent: (value / data?.total.sum) * 100,
+ }),
+ )}
+ formatCount={(n: number) => formatLongCurrency(n, currency)}
+ renderLabel={renderLabel('referrer')}
+ />
+
+
+ ({
+ label: name,
+ count: Number(value),
+ percent: (value / data?.total.sum) * 100,
+ }),
+ )}
+ formatCount={(n: number) => formatLongCurrency(n, currency)}
+ renderLabel={renderLabel('channel')}
+ />
+
+
+
+
+ {t(labels.location)}
+
+
+ {t(labels.countries)}
+ {t(labels.regions)}
+
+
+ ({
+ label: name,
+ count: Number(value),
+ percent: (value / data?.total.sum) * 100,
+ }),
+ )}
+ formatCount={(n: number) => formatLongCurrency(n, currency)}
+ renderLabel={renderLabel('country')}
+ />
+
+
+ ({
+ label: name,
+ country,
+ count: Number(value),
+ percent: (value / data?.total.sum) * 100,
+ }),
+ )}
+ formatCount={(n: number) => formatLongCurrency(n, currency)}
+ renderLabel={renderLabel('region')}
+ />
+
+
+
+
+
+
+ {t(labels.customers)}
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx
new file mode 100644
index 000000000..4dc19e012
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx
@@ -0,0 +1,19 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useDateRange, useTimezone } from '@/components/hooks';
+import { Revenue } from './Revenue';
+
+export function RevenuePage({ websiteId }: { websiteId: string }) {
+ const { timezone } = useTimezone();
+ const {
+ dateRange: { startDate, endDate, unit },
+ } = useDateRange({ timezone });
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx
new file mode 100644
index 000000000..fba10f155
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { RevenuePage } from './RevenuePage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Revenue',
+};
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx
new file mode 100644
index 000000000..846546106
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx
@@ -0,0 +1,71 @@
+import { Column, Grid, Heading, Text } from '@umami/react-zen';
+import { PieChart } from '@/components/charts/PieChart';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { useMessages, useResultQuery } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
+import { CHART_COLORS, UTM_PARAMS } from '@/lib/constants';
+
+export interface UTMProps {
+ websiteId: string;
+ startDate: Date;
+ endDate: Date;
+}
+
+export function UTM({ websiteId, startDate, endDate }: UTMProps) {
+ const { t, labels } = useMessages();
+ const { data, error, isLoading } = useResultQuery('utm', {
+ websiteId,
+ startDate,
+ endDate,
+ });
+
+ return (
+
+ {data && (
+
+ {UTM_PARAMS.map(param => {
+ const items = data?.[param];
+
+ const chartData = {
+ labels: items.map(({ utm }) => utm),
+ datasets: [
+ {
+ data: items.map(({ views }) => views),
+ backgroundColor: CHART_COLORS,
+ borderWidth: 0,
+ },
+ ],
+ };
+ const total = items.reduce((sum, { views }) => {
+ return +sum + +views;
+ }, 0);
+
+ return (
+
+
+
+
+ {param.replace(/^utm_/, '')}
+
+ ({
+ label: utm,
+ count: views,
+ percent: (views / total) * 100,
+ }))}
+ />
+
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx
new file mode 100644
index 000000000..0d2a73292
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx
@@ -0,0 +1,18 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { useDateRange } from '@/components/hooks';
+import { UTM } from './UTM';
+
+export function UTMPage({ websiteId }: { websiteId: string }) {
+ const {
+ dateRange: { startDate, endDate },
+ } = useDateRange();
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx
new file mode 100644
index 000000000..8b8fd6af3
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { UTMPage } from './UTMPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'UTM Parameters',
+};
diff --git a/src/app/(main)/websites/[websiteId]/@modal/(.)replays/[sessionId]/page.tsx b/src/app/(main)/websites/[websiteId]/@modal/(.)replays/[sessionId]/page.tsx
new file mode 100644
index 000000000..2d498d84f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/@modal/(.)replays/[sessionId]/page.tsx
@@ -0,0 +1,11 @@
+import { ReplayModal } from '@/app/(main)/websites/[websiteId]/replays/ReplayModal';
+
+export default async function ({
+ params,
+}: {
+ params: Promise<{ websiteId: string; sessionId: string }>;
+}) {
+ const { websiteId, sessionId } = await params;
+
+ return ;
+}
diff --git a/src/app/(main)/websites/[websiteId]/@modal/(.)sessions/[sessionId]/page.tsx b/src/app/(main)/websites/[websiteId]/@modal/(.)sessions/[sessionId]/page.tsx
new file mode 100644
index 000000000..c2c349e28
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/@modal/(.)sessions/[sessionId]/page.tsx
@@ -0,0 +1,11 @@
+import { SessionProfileModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionProfileModal';
+
+export default async function ({
+ params,
+}: {
+ params: Promise<{ websiteId: string; sessionId: string }>;
+}) {
+ const { websiteId, sessionId } = await params;
+
+ return ;
+}
diff --git a/src/app/(main)/websites/[websiteId]/@modal/[...catchAll]/page.tsx b/src/app/(main)/websites/[websiteId]/@modal/[...catchAll]/page.tsx
new file mode 100644
index 000000000..1fd97c207
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/@modal/[...catchAll]/page.tsx
@@ -0,0 +1,3 @@
+export default function CatchAll() {
+ return null;
+}
diff --git a/src/app/(main)/websites/[websiteId]/@modal/default.tsx b/src/app/(main)/websites/[websiteId]/@modal/default.tsx
new file mode 100644
index 000000000..6ddf1b76f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/@modal/default.tsx
@@ -0,0 +1,3 @@
+export default function Default() {
+ return null;
+}
diff --git a/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx
new file mode 100644
index 000000000..36638121d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx
@@ -0,0 +1,52 @@
+import { Dialog, Modal } from '@umami/react-zen';
+import { WebsiteExpandedView } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedView';
+import { useMobile, useNavigation } from '@/components/hooks';
+
+export function ExpandedViewModal({
+ websiteId,
+ excludedIds,
+}: {
+ websiteId: string;
+ excludedIds?: string[];
+}) {
+ const {
+ router,
+ query: { view },
+ updateParams,
+ } = useNavigation();
+ const { isMobile } = useMobile();
+
+ const handleClose = (close: () => void) => {
+ router.push(updateParams({ view: undefined }));
+ close();
+ };
+
+ const handleOpenChange = (isOpen: boolean) => {
+ if (!isOpen) {
+ router.push(updateParams({ view: undefined }));
+ }
+ };
+
+ return (
+
+
+ {({ close }) => {
+ return (
+ handleClose(close)}
+ />
+ );
+ }}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChart.module.css b/src/app/(main)/websites/[websiteId]/WebsiteChart.module.css
deleted file mode 100644
index b795047a9..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteChart.module.css
+++ /dev/null
@@ -1,17 +0,0 @@
-.container {
- position: relative;
- display: flex;
- flex-direction: column;
- align-self: stretch;
-}
-
-.chart {
- position: relative;
- overflow: hidden;
-}
-
-.title {
- font-size: var(--font-size-lg);
- line-height: 60px;
- font-weight: 600;
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx
index 681923077..896c733a8 100644
--- a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx
+++ b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx
@@ -1,57 +1,59 @@
import { useMemo } from 'react';
-import PageviewsChart from '@/components/metrics/PageviewsChart';
-import useWebsitePageviews from '@/components/hooks/queries/useWebsitePageviews';
-import { useDateRange } from '@/components/hooks';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useDateRange, useTimezone } from '@/components/hooks';
+import { useWebsitePageviewsQuery } from '@/components/hooks/queries/useWebsitePageviewsQuery';
+import { PageviewsChart } from '@/components/metrics/PageviewsChart';
export function WebsiteChart({
websiteId,
- compareMode = false,
+ compareMode,
}: {
websiteId: string;
compareMode?: boolean;
}) {
- const { dateRange, dateCompare } = useDateRange(websiteId);
+ const { timezone } = useTimezone();
+ const { dateRange, dateCompare } = useDateRange({ timezone: timezone });
const { startDate, endDate, unit, value } = dateRange;
- const { data, isLoading } = useWebsitePageviews(websiteId, compareMode ? dateCompare : undefined);
+ const { data, isLoading, isFetching, error } = useWebsitePageviewsQuery({
+ websiteId,
+ compare: compareMode ? dateCompare?.compare : undefined,
+ });
const { pageviews, sessions, compare } = (data || {}) as any;
const chartData = useMemo(() => {
- if (data) {
- const result = {
- pageviews,
- sessions,
- };
+ if (!data) {
+ return { pageviews: [], sessions: [] };
+ }
- if (compare) {
- result['compare'] = {
- pageviews: result.pageviews.map(({ x }, i) => ({
+ return {
+ pageviews,
+ sessions,
+ ...(compare && {
+ compare: {
+ pageviews: pageviews.map(({ x }, i) => ({
x,
y: compare.pageviews[i]?.y,
d: compare.pageviews[i]?.x,
})),
- sessions: result.sessions.map(({ x }, i) => ({
+ sessions: sessions.map(({ x }, i) => ({
x,
y: compare.sessions[i]?.y,
d: compare.sessions[i]?.x,
})),
- };
- }
-
- return result;
- }
- return { pageviews: [], sessions: [] };
+ },
+ }),
+ };
}, [data, startDate, endDate, unit]);
return (
-
+
+
+
);
}
-
-export default WebsiteChart;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx
deleted file mode 100644
index b27f9870d..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Button, Text, Icon, Icons } from 'react-basics';
-import { useMemo } from 'react';
-import { firstBy } from 'thenby';
-import Link from 'next/link';
-import WebsiteChart from './WebsiteChart';
-import useDashboard from '@/store/dashboard';
-import WebsiteHeader from './WebsiteHeader';
-import { WebsiteMetricsBar } from './WebsiteMetricsBar';
-import { useMessages, useLocale, useTeamUrl } from '@/components/hooks';
-
-export default function WebsiteChartList({
- websites,
- showCharts,
- limit,
-}: {
- websites: any[];
- showCharts?: boolean;
- limit?: number;
-}) {
- const { formatMessage, labels } = useMessages();
- const { websiteOrder, websiteActive } = useDashboard();
- const { renderTeamUrl } = useTeamUrl();
- const { dir } = useLocale();
-
- const ordered = useMemo(() => {
- return websites
- .filter(website => (websiteActive.length ? websiteActive.includes(website.id) : true))
- .map(website => ({ ...website, order: websiteOrder.indexOf(website.id) || 0 }))
- .sort(firstBy('order'));
- }, [websites, websiteOrder, websiteActive]);
-
- return (
-
- {ordered.map(({ id }, index) => {
- return index < limit ? (
-
-
-
-
- {formatMessage(labels.viewDetails)}
-
-
-
-
-
-
-
-
-
- {showCharts && }
-
- ) : null;
- })}
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx
new file mode 100644
index 000000000..80b9024f8
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx
@@ -0,0 +1,41 @@
+import { Column, Grid, Row } from '@umami/react-zen';
+import { ExportButton } from '@/components/input/ExportButton';
+import { FilterBar } from '@/components/input/FilterBar';
+import { MonthFilter } from '@/components/input/MonthFilter';
+import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter';
+import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton';
+
+export function WebsiteControls({
+ websiteId,
+ allowFilter = true,
+ allowDateFilter = true,
+ allowMonthFilter,
+ allowDownload = false,
+ allowCompare = false,
+}: {
+ websiteId?: string;
+ allowFilter?: boolean;
+ allowBounceFilter?: boolean;
+ allowDateFilter?: boolean;
+ allowMonthFilter?: boolean;
+ allowDownload?: boolean;
+ allowCompare?: boolean;
+}) {
+ return (
+
+
+
+ {allowFilter && }
+
+
+ {allowDateFilter && (
+
+ )}
+ {allowDownload && }
+ {allowMonthFilter && }
+
+
+ {allowFilter && }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx
deleted file mode 100644
index c421bc490..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-'use client';
-import { usePathname } from 'next/navigation';
-import FilterTags from '@/components/metrics/FilterTags';
-import { useNavigation } from '@/components/hooks';
-import WebsiteChart from './WebsiteChart';
-import WebsiteExpandedView from './WebsiteExpandedView';
-import WebsiteHeader from './WebsiteHeader';
-import WebsiteMetricsBar from './WebsiteMetricsBar';
-import WebsiteTableView from './WebsiteTableView';
-import { FILTER_COLUMNS, FILTER_GROUPS } from '@/lib/constants';
-
-export default function WebsiteDetailsPage({ websiteId }: { websiteId: string }) {
- const pathname = usePathname();
- const { query } = useNavigation();
-
- const showLinks = !pathname.includes('/share/');
- const { view } = query;
-
- const params = Object.keys(query).reduce((obj, key) => {
- if (FILTER_COLUMNS[key] || FILTER_GROUPS[key]) {
- obj[key] = query[key];
- }
- return obj;
- }, {});
-
- return (
- <>
-
-
-
-
- {!view && }
- {view && }
- >
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx
new file mode 100644
index 000000000..c49eaa02f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx
@@ -0,0 +1,230 @@
+import { NavMenu } from '@/components/common/NavMenu';
+import { useMessages, useNavigation } from '@/components/hooks';
+import {
+ AppWindow,
+ Cpu,
+ Earth,
+ Fingerprint,
+ Globe,
+ KeyRound,
+ Landmark,
+ Languages,
+ Laptop,
+ Layers,
+ Link2,
+ LogIn,
+ LogOut,
+ MapPin,
+ Megaphone,
+ Monitor,
+ Network,
+ Search,
+ Send,
+ Share2,
+ SquareSlash,
+ Tag,
+ Target,
+ Type,
+} from '@/components/icons';
+import { Lightning } from '@/components/svg';
+
+export function WebsiteExpandedMenu({
+ excludedIds = [],
+ onItemClick,
+}: {
+ excludedIds?: string[];
+ onItemClick?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const {
+ updateParams,
+ query: { view },
+ } = useNavigation();
+
+ const filterExcluded = (item: { id: string }) => !excludedIds.includes(item.id);
+
+ const items = [
+ {
+ label: 'URL',
+ items: [
+ {
+ id: 'path',
+ label: t(labels.path),
+ path: updateParams({ view: 'path' }),
+ icon: ,
+ },
+ {
+ id: 'entry',
+ label: t(labels.entry),
+ path: updateParams({ view: 'entry' }),
+ icon: ,
+ },
+ {
+ id: 'exit',
+ label: t(labels.exit),
+ path: updateParams({ view: 'exit' }),
+ icon: ,
+ },
+ {
+ id: 'title',
+ label: t(labels.title),
+ path: updateParams({ view: 'title' }),
+ icon: ,
+ },
+ {
+ id: 'query',
+ label: t(labels.query),
+ path: updateParams({ view: 'query' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ {
+ label: t(labels.sources),
+ items: [
+ {
+ id: 'referrer',
+ label: t(labels.referrer),
+ path: updateParams({ view: 'referrer' }),
+ icon: ,
+ },
+ {
+ id: 'channel',
+ label: t(labels.channel),
+ path: updateParams({ view: 'channel' }),
+ icon: ,
+ },
+ {
+ id: 'domain',
+ label: t(labels.domain),
+ path: updateParams({ view: 'domain' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ {
+ label: t(labels.location),
+ items: [
+ {
+ id: 'country',
+ label: t(labels.country),
+ path: updateParams({ view: 'country' }),
+ icon: ,
+ },
+ {
+ id: 'region',
+ label: t(labels.region),
+ path: updateParams({ view: 'region' }),
+ icon: ,
+ },
+ {
+ id: 'city',
+ label: t(labels.city),
+ path: updateParams({ view: 'city' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ {
+ label: t(labels.environment),
+ items: [
+ {
+ id: 'browser',
+ label: t(labels.browser),
+ path: updateParams({ view: 'browser' }),
+ icon: ,
+ },
+ {
+ id: 'os',
+ label: t(labels.os),
+ path: updateParams({ view: 'os' }),
+ icon: ,
+ },
+ {
+ id: 'device',
+ label: t(labels.device),
+ path: updateParams({ view: 'device' }),
+ icon: ,
+ },
+ {
+ id: 'language',
+ label: t(labels.language),
+ path: updateParams({ view: 'language' }),
+ icon: ,
+ },
+ {
+ id: 'screen',
+ label: t(labels.screen),
+ path: updateParams({ view: 'screen' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ {
+ label: t(labels.utm),
+ items: [
+ {
+ id: 'utmSource',
+ label: t(labels.source),
+ path: updateParams({ view: 'utmSource' }),
+ icon: ,
+ },
+ {
+ id: 'utmMedium',
+ label: t(labels.medium),
+ path: updateParams({ view: 'utmMedium' }),
+ icon: ,
+ },
+ {
+ id: 'utmCampaign',
+ label: t(labels.campaign),
+ path: updateParams({ view: 'utmCampaign' }),
+ icon: ,
+ },
+ {
+ id: 'utmContent',
+ label: t(labels.content),
+ path: updateParams({ view: 'utmContent' }),
+ icon: ,
+ },
+ {
+ id: 'utmTerm',
+ label: t(labels.term),
+ path: updateParams({ view: 'utmTerm' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ {
+ label: t(labels.other),
+ items: [
+ {
+ id: 'event',
+ label: t(labels.event),
+ path: updateParams({ view: 'event' }),
+ icon: ,
+ },
+ {
+ id: 'hostname',
+ label: t(labels.hostname),
+ path: updateParams({ view: 'hostname' }),
+ icon: ,
+ },
+ {
+ id: 'distinctId',
+ label: t(labels.distinctId),
+ path: updateParams({ view: 'distinctId' }),
+ icon: ,
+ },
+ {
+ id: 'tag',
+ label: t(labels.tag),
+ path: updateParams({ view: 'tag' }),
+ icon: ,
+ },
+ ].filter(filterExcluded),
+ },
+ ];
+
+ return ;
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.module.css b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.module.css
deleted file mode 100644
index afe2028ae..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.module.css
+++ /dev/null
@@ -1,64 +0,0 @@
-.layout {
- display: grid;
- grid-template-columns: 300px 1fr;
- border-top: 1px solid var(--base300);
-}
-
-.menu {
- display: flex;
- flex-direction: column;
- position: relative;
- padding: 20px 20px 20px 0;
-}
-
-.back {
- display: inline-flex;
- align-items: center;
- align-self: center;
- margin-bottom: 20px;
-}
-
-.content {
- min-height: 800px;
- padding: 20px 0 20px 20px;
- border-left: 1px solid var(--base300);
-}
-
-.dropdown {
- display: none;
-}
-
-@media screen and (max-width: 992px) {
- .layout {
- grid-template-columns: 1fr;
- }
-
- .content {
- border: 0;
- }
-
- .back {
- align-self: flex-start;
- margin: 0;
- }
-
- .nav {
- display: none;
- }
-
- .dropdown {
- display: flex;
- width: 200px;
- align-self: flex-end;
- }
-
- .menu {
- display: flex;
- flex-direction: row;
- gap: 20px;
- align-items: center;
- justify-content: space-between;
- padding-inline-end: 0;
- z-index: 10;
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx
index 4858ec734..71fbdc703 100644
--- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx
+++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx
@@ -1,184 +1,57 @@
-import { Dropdown, Icon, Icons, Item, Text } from 'react-basics';
-import LinkButton from '@/components/common/LinkButton';
-import { useLocale, useMessages, useNavigation } from '@/components/hooks';
-import SideNav from '@/components/layout/SideNav';
-import BrowsersTable from '@/components/metrics/BrowsersTable';
-import CitiesTable from '@/components/metrics/CitiesTable';
-import CountriesTable from '@/components/metrics/CountriesTable';
-import DevicesTable from '@/components/metrics/DevicesTable';
-import EventsTable from '@/components/metrics/EventsTable';
-import HostsTable from '@/components/metrics/HostsTable';
-import LanguagesTable from '@/components/metrics/LanguagesTable';
-import OSTable from '@/components/metrics/OSTable';
-import PagesTable from '@/components/metrics/PagesTable';
-import QueryParametersTable from '@/components/metrics/QueryParametersTable';
-import ReferrersTable from '@/components/metrics/ReferrersTable';
-import RegionsTable from '@/components/metrics/RegionsTable';
-import ScreenTable from '@/components/metrics/ScreenTable';
-import TagsTable from '@/components/metrics/TagsTable';
-import ChannelsTable from '@/components/metrics/ChannelsTable';
-import styles from './WebsiteExpandedView.module.css';
+import { Column, Grid, Row } from '@umami/react-zen';
+import { WebsiteExpandedMenu } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedMenu';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { MobileMenuButton } from '@/components/input/MobileMenuButton';
+import { MetricsExpandedTable } from '@/components/metrics/MetricsExpandedTable';
-const views = {
- url: PagesTable,
- entry: PagesTable,
- exit: PagesTable,
- title: PagesTable,
- referrer: ReferrersTable,
- grouped: ReferrersTable,
- host: HostsTable,
- browser: BrowsersTable,
- os: OSTable,
- device: DevicesTable,
- screen: ScreenTable,
- country: CountriesTable,
- region: RegionsTable,
- city: CitiesTable,
- language: LanguagesTable,
- event: EventsTable,
- query: QueryParametersTable,
- tag: TagsTable,
- channel: ChannelsTable,
-};
-
-export default function WebsiteExpandedView({
+export function WebsiteExpandedView({
websiteId,
- domainName,
+ excludedIds = [],
+ onClose,
}: {
websiteId: string;
- domainName?: string;
+ excludedIds?: string[];
+ onClose?: () => void;
}) {
- const { dir } = useLocale();
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const {
- router,
- renderUrl,
query: { view },
} = useNavigation();
- const items = [
- {
- key: 'url',
- label: formatMessage(labels.pages),
- url: renderUrl({ view: 'url' }),
- },
- {
- key: 'referrer',
- label: formatMessage(labels.referrers),
- url: renderUrl({ view: 'referrer' }),
- },
- {
- key: 'channel',
- label: formatMessage(labels.channels),
- url: renderUrl({ view: 'channel' }),
- },
- {
- key: 'browser',
- label: formatMessage(labels.browsers),
- url: renderUrl({ view: 'browser' }),
- },
- {
- key: 'os',
- label: formatMessage(labels.os),
- url: renderUrl({ view: 'os' }),
- },
- {
- key: 'device',
- label: formatMessage(labels.devices),
- url: renderUrl({ view: 'device' }),
- },
- {
- key: 'country',
- label: formatMessage(labels.countries),
- url: renderUrl({ view: 'country' }),
- },
- {
- key: 'region',
- label: formatMessage(labels.regions),
- url: renderUrl({ view: 'region' }),
- },
- {
- key: 'city',
- label: formatMessage(labels.cities),
- url: renderUrl({ view: 'city' }),
- },
- {
- key: 'language',
- label: formatMessage(labels.languages),
- url: renderUrl({ view: 'language' }),
- },
- {
- key: 'screen',
- label: formatMessage(labels.screens),
- url: renderUrl({ view: 'screen' }),
- },
- {
- key: 'event',
- label: formatMessage(labels.events),
- url: renderUrl({ view: 'event' }),
- },
- {
- key: 'query',
- label: formatMessage(labels.queryParameters),
- url: renderUrl({ view: 'query' }),
- },
- {
- key: 'host',
- label: formatMessage(labels.hosts),
- url: renderUrl({ view: 'host' }),
- },
- {
- key: 'tag',
- label: formatMessage(labels.tags),
- url: renderUrl({ view: 'tag' }),
- },
- ];
-
- const DetailsComponent = views[view] || (() => null);
-
- const handleChange = (view: any) => {
- router.push(renderUrl({ view }));
- };
-
- const renderValue = (value: string) => items.find(({ key }) => key === value)?.label;
-
return (
-
-
-
+
+
+ {({ close }) => {
+ return (
+
+
+
+ );
+ }}
+
+
+
+
-
-
-
- {formatMessage(labels.back)}
-
-
-
- {({ key, label }) => - {label}
}
-
-
-
-
-
-
+
+
+
+
+
+
+
);
}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.module.css b/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.module.css
deleted file mode 100644
index 80f101e3a..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.button {
- font-weight: 700;
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.tsx b/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.tsx
deleted file mode 100644
index 02b744184..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteFilterButton.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Button, Icon, Icons, Popup, PopupTrigger, Text } from 'react-basics';
-import PopupForm from '@/app/(main)/reports/[reportId]/PopupForm';
-import FilterSelectForm from '@/app/(main)/reports/[reportId]/FilterSelectForm';
-import { useFields, useMessages, useNavigation, useDateRange } from '@/components/hooks';
-import { OPERATOR_PREFIXES } from '@/lib/constants';
-import styles from './WebsiteFilterButton.module.css';
-
-export function WebsiteFilterButton({
- websiteId,
- className,
- position = 'bottom',
- alignment = 'end',
- showText = true,
-}: {
- websiteId: string;
- className?: string;
- position?: 'bottom' | 'top' | 'left' | 'right';
- alignment?: 'end' | 'center' | 'start';
- showText?: boolean;
-}) {
- const { formatMessage, labels } = useMessages();
- const { renderUrl, router } = useNavigation();
- const { fields } = useFields();
- const {
- dateRange: { startDate, endDate },
- } = useDateRange(websiteId);
-
- const handleAddFilter = ({ name, operator, value }) => {
- const prefix = OPERATOR_PREFIXES[operator];
-
- router.push(renderUrl({ [name]: prefix + value }));
- };
-
- return (
-
-
-
-
-
- {showText && {formatMessage(labels.filter)} }
-
-
- {(close: () => void) => {
- return (
-
- {
- handleAddFilter(value);
- close();
- }}
- />
-
- );
- }}
-
-
- );
-}
-
-export default WebsiteFilterButton;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.module.css b/src/app/(main)/websites/[websiteId]/WebsiteHeader.module.css
deleted file mode 100644
index 90c3f5cb1..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.module.css
+++ /dev/null
@@ -1,62 +0,0 @@
-.header {
- display: flex;
- gap: 10px;
- align-items: center;
- flex-wrap: wrap;
- padding: 20px 0px;
-}
-
-.title {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 10px;
- font-size: 24px;
- font-weight: 700;
- overflow: hidden;
- height: 60px;
-}
-
-.actions {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: flex-end;
- gap: 30px;
- min-height: 0;
- margin-left: auto;
-}
-
-.selected {
- font-weight: bold;
-}
-
-.links {
- display: flex;
- flex-direction: row;
- align-items: center;
-}
-
-@media only screen and (max-width: 768px) {
- .header {
- grid-template-columns: 1fr;
- }
-
- .links {
- justify-content: space-evenly;
- flex: 1;
- border-bottom: 1px solid var(--base300);
- padding-bottom: 10px;
- margin-bottom: 10px;
- }
-
- .label {
- display: none;
- }
-
- .icon,
- .icon svg {
- width: 20px;
- height: 20px;
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
index b568dd3dc..1739cb4c1 100644
--- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
+++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
@@ -1,102 +1,44 @@
-import classNames from 'classnames';
-import Favicon from '@/components/common/Favicon';
-import { useMessages, useTeamUrl, useWebsite } from '@/components/hooks';
-import Icons from '@/components/icons';
-import ActiveUsers from '@/components/metrics/ActiveUsers';
-import Link from 'next/link';
-import { usePathname } from 'next/navigation';
-import { ReactNode } from 'react';
-import { Button, Icon, Text } from 'react-basics';
-import Lightning from '@/assets/lightning.svg';
-import styles from './WebsiteHeader.module.css';
+import { Icon, Row, Text } from '@umami/react-zen';
+import { Favicon } from '@/components/common/Favicon';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation, useWebsite } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { ActiveUsers } from '@/components/metrics/ActiveUsers';
export function WebsiteHeader({
- websiteId,
- showLinks = true,
- children,
+ showActions,
+ allowLink = true,
}: {
- websiteId: string;
- showLinks?: boolean;
- children?: ReactNode;
+ showActions?: boolean;
+ allowLink?: boolean;
}) {
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
- const pathname = usePathname();
- const { data: website } = useWebsite(websiteId);
- const { name, domain } = website || {};
+ const website = useWebsite();
+ const { renderUrl, pathname } = useNavigation();
+ const isSettings = pathname.endsWith('/settings');
- const links = [
- {
- label: formatMessage(labels.overview),
- icon: ,
- path: '',
- },
- {
- label: formatMessage(labels.events),
- icon: ,
- path: '/events',
- },
- {
- label: formatMessage(labels.sessions),
- icon: ,
- path: '/sessions',
- },
- {
- label: formatMessage(labels.realtime),
- icon: ,
- path: '/realtime',
- },
- {
- label: formatMessage(labels.compare),
- icon: ,
- path: '/compare',
- },
- {
- label: formatMessage(labels.reports),
- icon: ,
- path: '/reports',
- },
- ];
+ const { t, labels } = useMessages();
+
+ if (isSettings) {
+ return null;
+ }
return (
-
-
-
- {showLinks && (
-
- {links.map(({ label, icon, path }) => {
- const selected = path
- ? pathname.includes(path)
- : pathname.match(/^\/websites\/[\w-]+$/);
+
}
+ titleHref={allowLink ? renderUrl(`/websites/${website.id}`, false) : undefined}
+ >
+
+
- return (
-
-
- {icon}
- {label}
-
-
- );
- })}
-
+ {showActions && (
+
+ }>{t(labels.edit)}
+
)}
- {children}
-
-
+
+
);
}
-
-export default WebsiteHeader;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx
new file mode 100644
index 000000000..18c3e25d1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx
@@ -0,0 +1,17 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider';
+import { PageBody } from '@/components/common/PageBody';
+import { WebsiteHeader } from './WebsiteHeader';
+
+export function WebsiteLayout({ websiteId, children }: { websiteId: string; children: ReactNode }) {
+ return (
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx
new file mode 100644
index 000000000..3446440c1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx
@@ -0,0 +1,56 @@
+import {
+ Button,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+ Text,
+} from '@umami/react-zen';
+import { Fragment } from 'react';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { Edit, MoreHorizontal, Share } from '@/components/icons';
+
+export function WebsiteMenu({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+ const { router, updateParams, renderUrl } = useNavigation();
+
+ const menuItems = [
+ { id: 'share', label: t(labels.share), icon: },
+ { id: 'edit', label: t(labels.edit), icon: , seperator: true },
+ ];
+
+ const handleAction = (id: any) => {
+ if (id === 'compare') {
+ router.push(updateParams({ compare: 'prev' }));
+ } else if (id === 'edit') {
+ router.push(renderUrl(`/websites/${websiteId}`));
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ {menuItems.map(({ id, label, icon, seperator }, index) => {
+ return (
+
+ {seperator && }
+
+ {icon}
+ {label}
+
+
+ );
+ })}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.module.css b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.module.css
deleted file mode 100644
index 6c5a0e569..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.module.css
+++ /dev/null
@@ -1,52 +0,0 @@
-.container {
- display: grid;
- grid-template-columns: 2fr 1fr;
- justify-content: space-between;
- align-items: center;
- background: var(--base50);
- z-index: var(--z-index-above);
- min-height: 120px;
- padding-bottom: 20px;
-}
-
-.actions {
- display: flex;
- flex-direction: column;
- align-items: flex-end;
- gap: 10px;
- flex-wrap: wrap;
-}
-
-.vs {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- flex-basis: 100%;
- gap: 10px;
-}
-
-.dropdown {
- min-width: 200px;
-}
-
-@media screen and (max-width: 1200px) {
- .container {
- grid-template-columns: 1fr;
- }
-
- .actions {
- margin: 20px 0;
- }
-}
-
-@media screen and (min-width: 992px) {
- .sticky {
- position: sticky;
- top: -1px;
- }
-
- .isSticky {
- padding: 10px 0;
- border-bottom: 1px solid var(--base300);
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx
index 37e6861ea..e3c263373 100644
--- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx
+++ b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx
@@ -1,143 +1,92 @@
-import { Dropdown, Item } from 'react-basics';
-import classNames from 'classnames';
-import { useDateRange, useMessages, useNavigation, useSticky } from '@/components/hooks';
-import WebsiteDateFilter from '@/components/input/WebsiteDateFilter';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
-import { formatShortTime, formatLongNumber } from '@/lib/format';
-import useWebsiteStats from '@/components/hooks/queries/useWebsiteStats';
-import useStore, { setWebsiteDateCompare } from '@/store/websites';
-import WebsiteFilterButton from './WebsiteFilterButton';
-import { ExportButton } from '@/components/input/ExportButton';
-import styles from './WebsiteMetricsBar.module.css';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { formatLongNumber, formatShortTime } from '@/lib/format';
export function WebsiteMetricsBar({
websiteId,
- sticky,
- showChange = false,
- compareMode = false,
- showFilter = false,
+ compareMode,
}: {
websiteId: string;
- sticky?: boolean;
showChange?: boolean;
compareMode?: boolean;
- showFilter?: boolean;
}) {
- const { dateRange } = useDateRange(websiteId);
- const { formatMessage, labels } = useMessages();
- const dateCompare = useStore(state => state[websiteId]?.dateCompare);
- const { ref, isSticky } = useSticky({ enabled: sticky });
- const { data, isLoading, isFetched, error } = useWebsiteStats(
+ const { isAllTime, dateCompare } = useDateRange();
+ const { t, labels, getErrorMessage } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteStatsQuery({
websiteId,
- compareMode && dateCompare,
- );
- const {
- query: { view },
- } = useNavigation();
- const isAllTime = dateRange.value === 'all';
+ compare: compareMode ? dateCompare?.compare : undefined,
+ });
- const { pageviews, visitors, visits, bounces, totaltime } = data || {};
+ const { pageviews, visitors, visits, bounces, totaltime, comparison } = data || {};
const metrics = data
? [
{
- ...pageviews,
- label: formatMessage(labels.views),
- change: pageviews.value - pageviews.prev,
+ value: visitors,
+ label: t(labels.visitors),
+ change: visitors - comparison.visitors,
formatValue: formatLongNumber,
},
{
- ...visits,
- label: formatMessage(labels.visits),
- change: visits.value - visits.prev,
+ value: visits,
+ label: t(labels.visits),
+ change: visits - comparison.visits,
formatValue: formatLongNumber,
},
{
- ...visitors,
- label: formatMessage(labels.visitors),
- change: visitors.value - visitors.prev,
+ value: pageviews,
+ label: t(labels.views),
+ change: pageviews - comparison.pageviews,
formatValue: formatLongNumber,
},
{
- label: formatMessage(labels.bounceRate),
- value: (Math.min(visits.value, bounces.value) / visits.value) * 100,
- prev: (Math.min(visits.prev, bounces.prev) / visits.prev) * 100,
+ label: t(labels.bounceRate),
+ value: (Math.min(visits, bounces) / visits) * 100,
+ prev: (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100,
change:
- (Math.min(visits.value, bounces.value) / visits.value) * 100 -
- (Math.min(visits.prev, bounces.prev) / visits.prev) * 100,
- formatValue: n => Math.round(+n) + '%',
+ (Math.min(visits, bounces) / visits) * 100 -
+ (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100,
+ formatValue: n => `${Math.round(+n)}%`,
reverseColors: true,
},
{
- label: formatMessage(labels.visitDuration),
- value: totaltime.value / visits.value,
- prev: totaltime.prev / visits.prev,
- change: totaltime.value / visits.value - totaltime.prev / visits.prev,
+ label: t(labels.visitDuration),
+ value: totaltime / visits,
+ prev: comparison.totaltime / comparison.visits,
+ change: totaltime / visits - comparison.totaltime / comparison.visits,
formatValue: n =>
`${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`,
},
]
- : [];
-
- const items = [
- { label: formatMessage(labels.previousPeriod), value: 'prev' },
- { label: formatMessage(labels.previousYear), value: 'yoy' },
- ];
+ : null;
return (
-
-
-
- {metrics.map(({ label, value, prev, change, formatValue, reverseColors }) => {
- return (
-
- );
- })}
-
-
-
-
- {showFilter && }
- {!view && }
-
-
- {compareMode && (
-
- VS
- items.find(i => i.value === value)?.label}
- alignment="end"
- onChange={(value: any) => setWebsiteDateCompare(websiteId, value)}
- >
- {items.map(({ label, value }) => (
- - {label}
- ))}
-
-
- )}
-
-
+
+ {metrics?.map(({ label, value, prev, change, formatValue, reverseColors }) => {
+ return (
+
+ );
+ })}
+
+
);
}
-
-export default WebsiteMetricsBar;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx
new file mode 100644
index 000000000..1b99bac1e
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx
@@ -0,0 +1,74 @@
+import { Column, Focusable, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import Link from 'next/link';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, useNavigation, useWebsiteNavItems } from '@/components/hooks';
+import { ArrowLeft } from '@/components/icons';
+
+export function WebsiteNav({
+ websiteId,
+ isCollapsed,
+ onItemClick,
+}: {
+ websiteId: string;
+ isCollapsed?: boolean;
+ onItemClick?: () => void;
+}) {
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+ const { items, selectedKey } = useWebsiteNavItems(websiteId);
+
+ return (
+
+
+
+
+
+ } label={isCollapsed ? '' : t(labels.back)} padding />
+
+
+ {t(labels.back)}
+
+
+ {items.map(({ label: sectionLabel, items: sectionItems }, index) => (
+
+ {!isCollapsed && (
+
+ {sectionLabel}
+
+ )}
+ {sectionItems.map(({ id, path, label, icon }) => {
+ const isSelected = selectedKey === id;
+ return (
+
+
+
+
+
+
+
+ {label}
+
+
+ );
+ })}
+
+ ))}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsitePage.tsx b/src/app/(main)/websites/[websiteId]/WebsitePage.tsx
new file mode 100644
index 000000000..5412421e5
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsitePage.tsx
@@ -0,0 +1,26 @@
+'use client';
+import { Column, Row } from '@umami/react-zen';
+import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal';
+import { Panel } from '@/components/common/Panel';
+import { UnitFilter } from '@/components/input/UnitFilter';
+import { WebsiteChart } from './WebsiteChart';
+import { WebsiteControls } from './WebsiteControls';
+import { WebsiteMetricsBar } from './WebsiteMetricsBar';
+import { WebsitePanels } from './WebsitePanels';
+
+export function WebsitePage({ websiteId }: { websiteId: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx
new file mode 100644
index 000000000..7d5d08c8c
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx
@@ -0,0 +1,115 @@
+import { Grid, Heading, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { GridRow } from '@/components/common/GridRow';
+import { Panel } from '@/components/common/Panel';
+import { useMessages, useMobile } from '@/components/hooks';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { WeeklyTraffic } from '@/components/metrics/WeeklyTraffic';
+import { WorldMap } from '@/components/metrics/WorldMap';
+
+export function WebsitePanels({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+ const tableProps = {
+ websiteId,
+ limit: 10,
+ allowDownload: false,
+ showMore: true,
+ metric: t(labels.visitors),
+ };
+ const rowProps = { minHeight: '570px' };
+ const { isMobile } = useMobile();
+
+ return (
+
+
+
+ {t(labels.pages)}
+
+
+ {t(labels.path)}
+ {t(labels.entry)}
+ {t(labels.exit)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.sources)}
+
+
+ {t(labels.referrers)}
+ {t(labels.channels)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.environment)}
+
+
+ {t(labels.browsers)}
+ {t(labels.os)}
+ {t(labels.devices)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.location)}
+
+
+ {t(labels.countries)}
+ {t(labels.regions)}
+ {t(labels.cities)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.traffic)}
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx b/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx
deleted file mode 100644
index 198ad030f..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-'use client';
-import { createContext, ReactNode, useEffect } from 'react';
-import { useModified, useWebsite } from '@/components/hooks';
-import { Loading } from 'react-basics';
-
-export const WebsiteContext = createContext(null);
-
-export function WebsiteProvider({
- websiteId,
- children,
-}: {
- websiteId: string;
- children: ReactNode;
-}) {
- const { modified } = useModified(`website:${websiteId}`);
- const { data: website, isFetching, isLoading, refetch } = useWebsite(websiteId);
-
- useEffect(() => {
- if (modified) {
- refetch();
- }
- }, [modified]);
-
- if (isFetching && isLoading) {
- return ;
- }
-
- return {children} ;
-}
-
-export default WebsiteProvider;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteTableView.tsx b/src/app/(main)/websites/[websiteId]/WebsiteTableView.tsx
deleted file mode 100644
index 9b505140f..000000000
--- a/src/app/(main)/websites/[websiteId]/WebsiteTableView.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Grid, GridRow } from '@/components/layout/Grid';
-import PagesTable from '@/components/metrics/PagesTable';
-import ReferrersTable from '@/components/metrics/ReferrersTable';
-import BrowsersTable from '@/components/metrics/BrowsersTable';
-import OSTable from '@/components/metrics/OSTable';
-import DevicesTable from '@/components/metrics/DevicesTable';
-import WorldMap from '@/components/metrics/WorldMap';
-import CountriesTable from '@/components/metrics/CountriesTable';
-import EventsTable from '@/components/metrics/EventsTable';
-import EventsChart from '@/components/metrics/EventsChart';
-import { usePathname } from 'next/navigation';
-
-export default function WebsiteTableView({ websiteId }: { websiteId: string }) {
- const pathname = usePathname();
- const tableProps = {
- websiteId,
- allowDownload: false,
- limit: 10,
- };
- const isSharePage = pathname.includes('/share/');
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {isSharePage && (
-
-
-
-
- )}
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx
new file mode 100644
index 000000000..782d55ad8
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx
@@ -0,0 +1,64 @@
+import { Icon, Row, Tab, TabList, Tabs, Text } from '@umami/react-zen';
+import { useMessages, useNavigation, useWebsite } from '@/components/hooks';
+import { ChartPie, Clock, Eye, User } from '@/components/icons';
+import { Lightning } from '@/components/svg';
+
+export function WebsiteTabs() {
+ const website = useWebsite();
+ const { pathname, renderUrl } = useNavigation();
+ const { t, labels } = useMessages();
+
+ const links = [
+ {
+ id: 'overview',
+ label: t(labels.overview),
+ icon: ,
+ path: '',
+ },
+ {
+ id: 'events',
+ label: t(labels.events),
+ icon: ,
+ path: '/events',
+ },
+ {
+ id: 'sessions',
+ label: t(labels.sessions),
+ icon: ,
+ path: '/sessions',
+ },
+ {
+ id: 'realtime',
+ label: t(labels.realtime),
+ icon: ,
+ path: '/realtime',
+ },
+ {
+ id: 'reports',
+ label: t(labels.reports),
+ icon: ,
+ path: '/reports',
+ },
+ ];
+
+ const selectedKey = links.find(({ path }) => path && pathname.includes(path))?.id || 'overview';
+
+ return (
+
+
+
+ {links.map(({ id, label, icon, path }) => {
+ return (
+
+
+ {icon}
+ {label}
+
+
+ );
+ })}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx
new file mode 100644
index 000000000..80699ae99
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortAddButton.tsx
@@ -0,0 +1,16 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { CohortEditForm } from './CohortEditForm';
+
+export function CohortAddButton({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } label={t(labels.cohort)} variant="primary" width="800px">
+ {({ close }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx
new file mode 100644
index 000000000..1493ed297
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx
@@ -0,0 +1,50 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function CohortDeleteButton({
+ cohortId,
+ websiteId,
+ name,
+ onSave,
+}: {
+ cohortId: string;
+ websiteId: string;
+ name: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { mutateAsync, isPending, error, touch } = useDeleteQuery(
+ `/websites/${websiteId}/segments/${cohortId}`,
+ );
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('cohorts');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } variant="quiet" title={t(labels.confirm)} width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={error}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx
new file mode 100644
index 000000000..02f533dbf
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx
@@ -0,0 +1,32 @@
+import { CohortEditForm } from '@/app/(main)/websites/[websiteId]/cohorts/CohortEditForm';
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import type { Filter } from '@/lib/types';
+
+export function CohortEditButton({
+ cohortId,
+ websiteId,
+ filters,
+}: {
+ cohortId: string;
+ websiteId: string;
+ filters: Filter[];
+}) {
+ const { t, labels } = useMessages();
+
+ return (
+ } variant="quiet" title={t(labels.cohort)} width="800px">
+ {({ close }) => {
+ return (
+
+ );
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx
new file mode 100644
index 000000000..8ad13549d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx
@@ -0,0 +1,145 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ Grid,
+ Label,
+ Loading,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { useMessages, useUpdateQuery, useWebsiteCohortQuery } from '@/components/hooks';
+import { ActionSelect } from '@/components/input/ActionSelect';
+import { DateFilter } from '@/components/input/DateFilter';
+import { FieldFilters } from '@/components/input/FieldFilters';
+import { LookupField } from '@/components/input/LookupField';
+
+export function CohortEditForm({
+ cohortId,
+ websiteId,
+ filters = [],
+ onSave,
+ onClose,
+}: {
+ cohortId?: string;
+ websiteId: string;
+ filters?: any[];
+ showFilters?: boolean;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { data } = useWebsiteCohortQuery(websiteId, cohortId);
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const [currentMatch, setCurrentMatch] = useState('all');
+
+ useEffect(() => {
+ setCurrentMatch((data?.parameters as any)?.match || 'all');
+ }, [data]);
+
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(
+ `/websites/${websiteId}/segments${cohortId ? `/${cohortId}` : ''}`,
+ {
+ type: 'cohort',
+ },
+ );
+
+ const handleSubmit = async (formData: any) => {
+ await mutateAsync(
+ {
+ ...formData,
+ parameters: {
+ ...formData.parameters,
+ match: currentMatch !== 'all' ? currentMatch : undefined,
+ },
+ },
+ {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('cohorts');
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ if (cohortId && !data) {
+ return ;
+ }
+
+ const defaultValues = {
+ parameters: { filters, dateRange: '30day', action: { type: 'path', value: '' } },
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx
new file mode 100644
index 000000000..6734384e3
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx
@@ -0,0 +1,24 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useWebsiteCohortsQuery } from '@/components/hooks';
+import { CohortAddButton } from './CohortAddButton';
+import { CohortsTable } from './CohortsTable';
+
+export function CohortsDataTable({ websiteId }: { websiteId?: string }) {
+ const query = useWebsiteCohortsQuery(websiteId, { type: 'cohort' });
+
+ const renderActions = () => {
+ return ;
+ };
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx
new file mode 100644
index 000000000..14f366e59
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx
@@ -0,0 +1,16 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { Panel } from '@/components/common/Panel';
+import { CohortsDataTable } from './CohortsDataTable';
+
+export function CohortsPage({ websiteId }) {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx
new file mode 100644
index 000000000..fe9c95441
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx
@@ -0,0 +1,41 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { CohortDeleteButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton';
+import { CohortEditButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortEditButton';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { filtersObjectToArray } from '@/lib/params';
+
+export function CohortsTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { websiteId, renderUrl } = useNavigation();
+
+ return (
+
+
+ {(row: any) => (
+ {row.name}
+ )}
+
+
+ {(row: any) => }
+
+
+ {(row: any) => {
+ const { id, name, parameters } = row;
+
+ return (
+
+
+
+
+ );
+ }}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/cohorts/page.tsx b/src/app/(main)/websites/[websiteId]/cohorts/page.tsx
new file mode 100644
index 000000000..9946f6026
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/cohorts/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { CohortsPage } from './CohortsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Cohorts',
+};
diff --git a/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx b/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx
new file mode 100644
index 000000000..32d641b06
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx
@@ -0,0 +1,20 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { WebsiteMetricsBar } from '@/app/(main)/websites/[websiteId]/WebsiteMetricsBar';
+import { Panel } from '@/components/common/Panel';
+import { CompareTables } from './CompareTables';
+
+export function ComparePage({ websiteId }: { websiteId: string }) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx
new file mode 100644
index 000000000..3a07f9e66
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx
@@ -0,0 +1,202 @@
+import { Column, Grid, Heading, ListItem, Row, Select } from '@umami/react-zen';
+import { useState } from 'react';
+import { DateDisplay } from '@/components/common/DateDisplay';
+import { Panel } from '@/components/common/Panel';
+import { useDateRange, useMessages, useNavigation } from '@/components/hooks';
+import { ChangeLabel } from '@/components/metrics/ChangeLabel';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { formatNumber } from '@/lib/format';
+
+export function CompareTables({ websiteId }: { websiteId: string }) {
+ const [data, setData] = useState([]);
+ const { dateRange, dateCompare } = useDateRange();
+ const { t, labels } = useMessages();
+ const {
+ router,
+ updateParams,
+ query: { view = 'path' },
+ } = useNavigation();
+ const { startDate, endDate } = dateCompare;
+
+ const params = {
+ startAt: startDate.getTime(),
+ endAt: endDate.getTime(),
+ };
+
+ const renderPath = (view: string) => {
+ return updateParams({ view });
+ };
+
+ const items = [
+ {
+ id: 'path',
+ label: t(labels.path),
+ path: renderPath('path'),
+ },
+ {
+ id: 'channel',
+ label: t(labels.channels),
+ path: renderPath('channel'),
+ },
+ {
+ id: 'referrer',
+ label: t(labels.referrers),
+ path: renderPath('referrer'),
+ },
+ {
+ id: 'browser',
+ label: t(labels.browsers),
+ path: renderPath('browser'),
+ },
+ {
+ id: 'os',
+ label: t(labels.os),
+ path: renderPath('os'),
+ },
+ {
+ id: 'device',
+ label: t(labels.devices),
+ path: renderPath('device'),
+ },
+ {
+ id: 'country',
+ label: t(labels.countries),
+ path: renderPath('country'),
+ },
+ {
+ id: 'region',
+ label: t(labels.regions),
+ path: renderPath('region'),
+ },
+ {
+ id: 'city',
+ label: t(labels.cities),
+ path: renderPath('city'),
+ },
+ {
+ id: 'language',
+ label: t(labels.languages),
+ path: renderPath('language'),
+ },
+ {
+ id: 'screen',
+ label: t(labels.screens),
+ path: renderPath('screen'),
+ },
+ {
+ id: 'event',
+ label: t(labels.events),
+ path: renderPath('event'),
+ },
+ {
+ id: 'utmSource',
+ label: t(labels.utmSource),
+ path: renderPath('utmSource'),
+ },
+ {
+ id: 'utmMedium',
+ label: t(labels.utmMedium),
+ path: renderPath('utmMedium'),
+ },
+ {
+ id: 'utmCampaign',
+ label: t(labels.utmCampaign),
+ path: renderPath('utmCampaign'),
+ },
+ {
+ id: 'utmContent',
+ label: t(labels.utmContent),
+ path: renderPath('utmContent'),
+ },
+ {
+ id: 'utmTerm',
+ label: t(labels.utmTerm),
+ path: renderPath('utmTerm'),
+ },
+ {
+ id: 'hostname',
+ label: t(labels.hostname),
+ path: renderPath('hostname'),
+ },
+ {
+ id: 'distinctId',
+ label: t(labels.distinctId),
+ path: renderPath('distinctId'),
+ },
+ {
+ id: 'tag',
+ label: t(labels.tags),
+ path: renderPath('tag'),
+ },
+ ];
+
+ const renderChange = ({ label, count }) => {
+ const prev = data.find(d => d.x === label)?.y;
+ const value = count - prev;
+ const change = Math.abs(((count - prev) / prev) * 100);
+
+ return (
+ !Number.isNaN(change) && (
+
+ {formatNumber(change)}%
+
+ )
+ );
+ };
+
+ const handleChange = (id: any) => {
+ router.push(renderPath(id));
+ };
+
+ return (
+ <>
+
+
+ {items.map(({ id, label }) => (
+
+ {label}
+
+ ))}
+
+
+
+
+
+
+ {t(labels.previous)}
+
+
+
+
+
+
+ {t(labels.current)}
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx b/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx
deleted file mode 100644
index fa64df352..000000000
--- a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-'use client';
-import WebsiteHeader from '../WebsiteHeader';
-import WebsiteMetricsBar from '../WebsiteMetricsBar';
-import FilterTags from '@/components/metrics/FilterTags';
-import { useNavigation } from '@/components/hooks';
-import { FILTER_COLUMNS, FILTER_GROUPS } from '@/lib/constants';
-import WebsiteChart from '../WebsiteChart';
-import WebsiteCompareTables from './WebsiteCompareTables';
-
-export function WebsiteComparePage({ websiteId }) {
- const { query } = useNavigation();
-
- const params = Object.keys(query).reduce((obj, key) => {
- if (FILTER_COLUMNS[key] || FILTER_GROUPS[key]) {
- obj[key] = query[key];
- }
- return obj;
- }, {});
-
- return (
- <>
-
-
-
-
-
- >
- );
-}
-
-export default WebsiteComparePage;
diff --git a/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.module.css b/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.module.css
deleted file mode 100644
index c4821e886..000000000
--- a/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.module.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.container {
- margin-bottom: 60px;
-}
-
-.nav {
- width: 200px;
- margin-top: 40px;
-}
-
-.title {
- color: var(--base800);
- text-align: center;
- font-weight: 700;
-}
diff --git a/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.tsx b/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.tsx
deleted file mode 100644
index ce7f5b47b..000000000
--- a/src/app/(main)/websites/[websiteId]/compare/WebsiteCompareTables.tsx
+++ /dev/null
@@ -1,173 +0,0 @@
-import { useDateRange, useMessages, useNavigation } from '@/components/hooks';
-import { Grid, GridRow } from '@/components/layout/Grid';
-import SideNav from '@/components/layout/SideNav';
-import BrowsersTable from '@/components/metrics/BrowsersTable';
-import ChangeLabel from '@/components/metrics/ChangeLabel';
-import CitiesTable from '@/components/metrics/CitiesTable';
-import CountriesTable from '@/components/metrics/CountriesTable';
-import DevicesTable from '@/components/metrics/DevicesTable';
-import EventsTable from '@/components/metrics/EventsTable';
-import LanguagesTable from '@/components/metrics/LanguagesTable';
-import MetricsTable from '@/components/metrics/MetricsTable';
-import OSTable from '@/components/metrics/OSTable';
-import PagesTable from '@/components/metrics/PagesTable';
-import QueryParametersTable from '@/components/metrics/QueryParametersTable';
-import ReferrersTable from '@/components/metrics/ReferrersTable';
-import RegionsTable from '@/components/metrics/RegionsTable';
-import ScreenTable from '@/components/metrics/ScreenTable';
-import TagsTable from '@/components/metrics/TagsTable';
-import { getCompareDate } from '@/lib/date';
-import { formatNumber } from '@/lib/format';
-import { useState } from 'react';
-import useStore from '@/store/websites';
-import styles from './WebsiteCompareTables.module.css';
-
-const views = {
- url: PagesTable,
- title: PagesTable,
- referrer: ReferrersTable,
- browser: BrowsersTable,
- os: OSTable,
- device: DevicesTable,
- screen: ScreenTable,
- country: CountriesTable,
- region: RegionsTable,
- city: CitiesTable,
- language: LanguagesTable,
- event: EventsTable,
- query: QueryParametersTable,
- tag: TagsTable,
-};
-
-export function WebsiteCompareTables({ websiteId }: { websiteId: string }) {
- const [data, setData] = useState([]);
- const { dateRange } = useDateRange(websiteId);
- const dateCompare = useStore(state => state[websiteId]?.dateCompare);
- const { formatMessage, labels } = useMessages();
- const {
- renderUrl,
- query: { view },
- } = useNavigation();
- const Component: typeof MetricsTable = views[view || 'url'] || (() => null);
-
- const items = [
- {
- key: 'url',
- label: formatMessage(labels.pages),
- url: renderUrl({ view: 'url' }),
- },
- {
- key: 'referrer',
- label: formatMessage(labels.referrers),
- url: renderUrl({ view: 'referrer' }),
- },
- {
- key: 'browser',
- label: formatMessage(labels.browsers),
- url: renderUrl({ view: 'browser' }),
- },
- {
- key: 'os',
- label: formatMessage(labels.os),
- url: renderUrl({ view: 'os' }),
- },
- {
- key: 'device',
- label: formatMessage(labels.devices),
- url: renderUrl({ view: 'device' }),
- },
- {
- key: 'country',
- label: formatMessage(labels.countries),
- url: renderUrl({ view: 'country' }),
- },
- {
- key: 'region',
- label: formatMessage(labels.regions),
- url: renderUrl({ view: 'region' }),
- },
- {
- key: 'city',
- label: formatMessage(labels.cities),
- url: renderUrl({ view: 'city' }),
- },
- {
- key: 'language',
- label: formatMessage(labels.languages),
- url: renderUrl({ view: 'language' }),
- },
- {
- key: 'screen',
- label: formatMessage(labels.screens),
- url: renderUrl({ view: 'screen' }),
- },
- {
- key: 'event',
- label: formatMessage(labels.events),
- url: renderUrl({ view: 'event' }),
- },
- {
- key: 'query',
- label: formatMessage(labels.queryParameters),
- url: renderUrl({ view: 'query' }),
- },
- {
- key: 'host',
- label: formatMessage(labels.hosts),
- url: renderUrl({ view: 'host' }),
- },
- {
- key: 'tag',
- label: formatMessage(labels.tags),
- url: renderUrl({ view: 'tag' }),
- },
- ];
-
- const renderChange = ({ x, y }) => {
- const prev = data.find(d => d.x === x)?.y;
- const value = y - prev;
- const change = Math.abs(((y - prev) / prev) * 100);
-
- return !isNaN(change) && {formatNumber(change)}% ;
- };
-
- const { startDate, endDate } = getCompareDate(
- dateCompare,
- dateRange.startDate,
- dateRange.endDate,
- );
-
- const params = {
- startAt: startDate.getTime(),
- endAt: endDate.getTime(),
- };
-
- return (
-
-
-
-
-
{formatMessage(labels.previous)}
-
-
-
-
{formatMessage(labels.current)}
-
-
-
-
- );
-}
-
-export default WebsiteCompareTables;
diff --git a/src/app/(main)/websites/[websiteId]/compare/page.tsx b/src/app/(main)/websites/[websiteId]/compare/page.tsx
index bdd29bd54..1b2899b29 100644
--- a/src/app/(main)/websites/[websiteId]/compare/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/compare/page.tsx
@@ -1,12 +1,12 @@
-import WebsiteComparePage from './WebsiteComparePage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { ComparePage } from './ComparePage';
-export default async function ({ params }: { params: { websiteId: string } }) {
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
- return ;
+ return ;
}
export const metadata: Metadata = {
- title: 'Website Comparison',
+ title: 'Compare',
};
diff --git a/src/app/(main)/websites/[websiteId]/events/EventProperties.module.css b/src/app/(main)/websites/[websiteId]/events/EventProperties.module.css
deleted file mode 100644
index a56df28f6..000000000
--- a/src/app/(main)/websites/[websiteId]/events/EventProperties.module.css
+++ /dev/null
@@ -1,27 +0,0 @@
-.container {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
- gap: 60px;
- margin-bottom: 40px;
-}
-
-.table {
- align-self: flex-start;
-}
-
-.link:hover {
- cursor: pointer;
- color: var(--primary400);
-}
-
-.header {
- margin-bottom: 40px;
-}
-
-.title {
- font-weight: bold;
-}
-
-.data {
- min-height: 620px;
-}
diff --git a/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx b/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx
index e3e442ad3..0c03c0f52 100644
--- a/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx
@@ -1,21 +1,84 @@
-import { useMemo } from 'react';
-import { GridColumn, GridTable, Flexbox, Button, ButtonGroup, Loading } from 'react-basics';
-import { useEventDataProperties, useEventDataValues, useMessages } from '@/components/hooks';
+import { Column, Grid, ListItem, Select } from '@umami/react-zen';
+import { useMemo, useState } from 'react';
+import { PieChart } from '@/components/charts/PieChart';
import { LoadingPanel } from '@/components/common/LoadingPanel';
-import PieChart from '@/components/charts/PieChart';
-import ListTable from '@/components/metrics/ListTable';
-import { useState } from 'react';
+import {
+ useEventDataPropertiesQuery,
+ useEventDataValuesQuery,
+ useMessages,
+} from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
import { CHART_COLORS } from '@/lib/constants';
-import styles from './EventProperties.module.css';
export function EventProperties({ websiteId }: { websiteId: string }) {
const [propertyName, setPropertyName] = useState('');
const [eventName, setEventName] = useState('');
- const [propertyView, setPropertyView] = useState('table');
- const { formatMessage, labels } = useMessages();
- const { data, isLoading, isFetched, error } = useEventDataProperties(websiteId);
- const { data: values } = useEventDataValues(websiteId, eventName, propertyName);
+ 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)
+ : [];
+
+ return (
+
+
+ {data && (
+
+
+ {events?.map(p => (
+
+ {p}
+
+ ))}
+
+
+ {properties?.map(p => (
+
+ {p}
+
+ ))}
+
+
+ )}
+ {eventName && propertyName && (
+
+ )}
+
+
+ );
+}
+
+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;
@@ -38,62 +101,27 @@ export function EventProperties({ websiteId }: { websiteId: string }) {
const tableData = useMemo(() => {
if (!propertyName || !values || propertySum === 0) return [];
return values.map(({ value, total }) => ({
- x: value,
- y: total,
- z: 100 * (total / propertySum),
+ label: value,
+ count: total,
+ percent: 100 * (total / propertySum),
}));
}, [propertyName, values, propertySum]);
- const handleRowClick = row => {
- setEventName(row.eventName);
- setPropertyName(row.propertyName);
- };
-
return (
-
-
-
-
- {row => (
- handleRowClick(row)}>
- {row.eventName}
-
- )}
-
-
- {row => (
- handleRowClick(row)}>
- {row.propertyName}
-
- )}
-
-
-
- {propertyName && (
-
-
- {`${eventName}: ${propertyName}`}
- setPropertyView(key as string)}
- >
- {formatMessage(labels.table)}
- {formatMessage(labels.chart)}
-
-
-
- {!values ? (
-
- ) : propertyView === 'table' ? (
-
- ) : (
-
- )}
-
- )}
-
+
+ {values && (
+
+
+
+
+ )}
);
-}
-
-export default EventProperties;
+};
diff --git a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx
index ce9048d31..70de0fd93 100644
--- a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx
@@ -1,20 +1,48 @@
-import { useWebsiteEvents } from '@/components/hooks';
-import EventsTable from './EventsTable';
-import DataTable from '@/components/common/DataTable';
-import { ReactNode } from 'react';
+import { type ReactNode, useState } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useMessages, useWebsiteEventsQuery } from '@/components/hooks';
+import { FilterButtons } from '@/components/input/FilterButtons';
+import { EventsTable } from './EventsTable';
-export default function EventsDataTable({
+export function EventsDataTable({
websiteId,
}: {
websiteId?: string;
teamId?: string;
children?: ReactNode;
}) {
- const queryResult = useWebsiteEvents(websiteId);
+ const { t, labels } = useMessages();
+ const [view, setView] = useState('all');
+ const query = useWebsiteEventsQuery(websiteId, { view });
+
+ const buttons = [
+ {
+ id: 'all',
+ label: t(labels.all),
+ },
+ {
+ id: 'views',
+ label: t(labels.views),
+ },
+ {
+ id: 'events',
+ label: t(labels.events),
+ },
+ ];
+
+ const renderActions = () => {
+ return ;
+ };
return (
-
+
{({ data }) => }
-
+
);
}
diff --git a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx
index e90a7790a..ff5bd74f1 100644
--- a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx
@@ -1,42 +1,40 @@
+import { LoadingPanel } from '@/components/common/LoadingPanel';
import { useMessages } from '@/components/hooks';
-import useWebsiteSessionStats from '@/components/hooks/queries/useWebsiteSessionStats';
-import WebsiteDateFilter from '@/components/input/WebsiteDateFilter';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
+import { useWebsiteSessionStatsQuery } from '@/components/hooks/queries/useWebsiteSessionStatsQuery';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
import { formatLongNumber } from '@/lib/format';
-import { Flexbox } from 'react-basics';
export function EventsMetricsBar({ websiteId }: { websiteId: string }) {
- const { formatMessage, labels } = useMessages();
- const { data, isLoading, isFetched, error } = useWebsiteSessionStats(websiteId);
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteSessionStatsQuery(websiteId);
return (
-
-
-
-
-
-
-
-
-
+
+ {data && (
+
+
+
+
+
+
+ )}
+
);
}
-
-export default EventsMetricsBar;
diff --git a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx
index 46970b518..5f5ab82a8 100644
--- a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx
@@ -1,52 +1,122 @@
'use client';
-import WebsiteHeader from '../WebsiteHeader';
-import EventsDataTable from './EventsDataTable';
-import EventsMetricsBar from './EventsMetricsBar';
-import EventsChart from '@/components/metrics/EventsChart';
-import { GridRow } from '@/components/layout/Grid';
-import EventsTable from '@/components/metrics/EventsTable';
-import { useMessages } from '@/components/hooks';
-import { Item, Tabs } from 'react-basics';
-import { useState } from 'react';
-import EventProperties from './EventProperties';
+import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { type Key, useState } from 'react';
+import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Panel } from '@/components/common/Panel';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { useEventStatsQuery } from '@/components/hooks/queries/useEventStatsQuery';
+import { EventsChart } from '@/components/metrics/EventsChart';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { MetricsTable } from '@/components/metrics/MetricsTable';
+import { formatLongNumber } from '@/lib/format';
import { getItem, setItem } from '@/lib/storage';
+import { EventProperties } from './EventProperties';
+import { EventsDataTable } from './EventsDataTable';
-export default function EventsPage({ websiteId }) {
- const [label, setLabel] = useState(null);
- const [tab, setTab] = useState(getItem('eventTab') || 'activity');
- const { formatMessage, labels } = useMessages();
+const KEY_NAME = 'umami.events.tab';
- const handleLabelClick = (value: string) => {
- setLabel(value !== label ? value : '');
- };
+export function EventsPage({ websiteId }) {
+ const [tab, setTab] = useState(getItem(KEY_NAME) || 'chart');
+ const { isAllTime } = useDateRange();
+ const { t, labels, getErrorMessage } = useMessages();
+ const { data, isLoading, isFetching, error } = useEventStatsQuery({
+ websiteId,
+ });
- const onSelect = (value: 'activity' | 'properties') => {
- setItem('eventTab', value);
+ const handleSelect = (value: Key) => {
+ setItem(KEY_NAME, value);
setTab(value);
};
+ const { events, visitors, visits, uniqueEvents, comparison } = data || {};
+
+ const metrics = data
+ ? [
+ {
+ value: visitors,
+ label: t(labels.visitors),
+ change: visitors - comparison.visitors,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: visits,
+ label: t(labels.visits),
+ change: visits - comparison.visits,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: events,
+ label: t(labels.events),
+ change: events - comparison.events,
+ formatValue: formatLongNumber,
+ },
+ {
+ value: uniqueEvents,
+ label: t(labels.uniqueEvents),
+ change: uniqueEvents - comparison.uniqueEvents,
+ formatValue: formatLongNumber,
+ },
+ ]
+ : null;
+
return (
- <>
-
-
-
-
-
-
-
-
- - {formatMessage(labels.activity)}
- - {formatMessage(labels.properties)}
+
+
+
+
+ {metrics?.map(({ label, value, change, formatValue }) => {
+ return (
+
+ );
+ })}
+
+
+
+ handleSelect(key)}>
+
+ {t(labels.chart)}
+ {t(labels.activity)}
+ {t(labels.properties)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- {tab === 'activity' && }
- {tab === 'properties' && }
-
- >
+
+
+
);
}
diff --git a/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx
index 8e6cdf764..59310518e 100644
--- a/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx
@@ -1,44 +1,120 @@
-import { GridTable, GridColumn, Icon } from 'react-basics';
-import { useMessages, useTeamUrl, useTimezone } from '@/components/hooks';
-import Empty from '@/components/common/Empty';
-import Avatar from '@/components/common/Avatar';
+import {
+ Button,
+ DataColumn,
+ DataTable,
+ type DataTableProps,
+ Dialog,
+ DialogTrigger,
+ Icon,
+ Popover,
+ Row,
+ Text,
+} from '@umami/react-zen';
import Link from 'next/link';
-import Icons from '@/components/icons';
+import { Avatar } from '@/components/common/Avatar';
+import { DateDistance } from '@/components/common/DateDistance';
+import { IconLabel } from '@/components/common/IconLabel';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import { useFormat, useMessages, useNavigation } from '@/components/hooks';
+import { Eye, FileText } from '@/components/icons';
+import { EventData } from '@/components/metrics/EventData';
+import { Lightning } from '@/components/svg';
-export function EventsTable({ data = [] }) {
- const { formatTimezoneDate } = useTimezone();
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
+export function EventsTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { updateParams } = useNavigation();
+ const { formatValue } = useFormat();
- if (data.length === 0) {
- return ;
- }
+ const renderLink = (label: string, hostname: string) => {
+ return (
+
+ {label}
+
+ );
+ };
return (
-
-
- {row => (
-
-
-
- )}
-
-
- {row => {
+
+
+ {(row: any) => {
return (
- <>
- {row.eventName ? : }
- {formatMessage(row.eventName ? labels.triggeredEvent : labels.viewedPage)}
- {row.eventName || row.urlPath}
- >
+
+
+ : }
+ label={t(row.eventName ? labels.triggeredEvent : labels.viewedPage)}
+ />
+
+
+ {row.eventName || renderLink(row.urlPath, row.hostname)}
+
+ {row.hasData > 0 && }
+
);
}}
-
-
- {row => formatTimezoneDate(row.createdAt, 'PPPpp')}
-
-
+
+
+ {(row: any) => {
+ return (
+
+
+
+ );
+ }}
+
+
+ {(row: any) => (
+
+ {row.city ? `${row.city}, ` : ''} {formatValue(row.country, 'country')}
+
+ )}
+
+
+ {(row: any) => (
+
+ {formatValue(row.browser, 'browser')}
+
+ )}
+
+
+ {(row: any) => (
+
+ {formatValue(row.device, 'device')}
+
+ )}
+
+
+ {(row: any) => }
+
+
);
}
-export default EventsTable;
+const PropertiesButton = props => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/events/page.tsx b/src/app/(main)/websites/[websiteId]/events/page.tsx
index 1b8882445..d77ba3bdc 100644
--- a/src/app/(main)/websites/[websiteId]/events/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/events/page.tsx
@@ -1,12 +1,12 @@
-import { Metadata } from 'next';
-import EventsPage from './EventsPage';
+import type { Metadata } from 'next';
+import { EventsPage } from './EventsPage';
-export default async function ({ params }: { params: { websiteId: string } }) {
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
return ;
}
export const metadata: Metadata = {
- title: 'Event Data',
+ title: 'Events',
};
diff --git a/src/app/(main)/websites/[websiteId]/layout.tsx b/src/app/(main)/websites/[websiteId]/layout.tsx
index 2542f65af..733260f6e 100644
--- a/src/app/(main)/websites/[websiteId]/layout.tsx
+++ b/src/app/(main)/websites/[websiteId]/layout.tsx
@@ -1,16 +1,29 @@
-import { Metadata } from 'next';
-import WebsiteProvider from './WebsiteProvider';
+import type { Metadata } from 'next';
+import { WebsiteLayout } from '@/app/(main)/websites/[websiteId]/WebsiteLayout';
+import { getWebsite } from '@/queries/prisma';
export default async function ({
children,
+ modal,
params,
}: {
children: any;
+ modal: React.ReactNode;
params: Promise<{ websiteId: string }>;
}) {
const { websiteId } = await params;
+ const website = await getWebsite(websiteId);
- return {children} ;
+ if (!website || website?.deletedAt) {
+ return null;
+ }
+
+ return (
+
+ {children}
+ {modal}
+
+ );
}
export const metadata: Metadata = {
diff --git a/src/app/(main)/websites/[websiteId]/page.tsx b/src/app/(main)/websites/[websiteId]/page.tsx
index d3aa1633a..d4889c5dc 100644
--- a/src/app/(main)/websites/[websiteId]/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/page.tsx
@@ -1,10 +1,10 @@
-import WebsiteDetailsPage from './WebsiteDetailsPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { WebsitePage } from './WebsitePage';
-export default async function WebsitePage({ params }: { params: { websiteId: string } }) {
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
- return ;
+ return ;
}
export const metadata: Metadata = {
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.module.css b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.module.css
deleted file mode 100644
index e55063c3a..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.row {
- display: flex;
- align-items: center;
- gap: 10px;
-}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx
index c3a3b8f70..144eeeecd 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx
@@ -1,33 +1,31 @@
import { useCallback } from 'react';
-import ListTable from '@/components/metrics/ListTable';
-import { useLocale, useCountryNames, useMessages } from '@/components/hooks';
-import classNames from 'classnames';
-import styles from './RealtimeCountries.module.css';
-import TypeIcon from '@/components/common/TypeIcon';
+import { IconLabel } from '@/components/common/IconLabel';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import { useCountryNames, useLocale, useMessages } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
export function RealtimeCountries({ data }) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const { locale } = useLocale();
const { countryNames } = useCountryNames(locale);
const renderCountryName = useCallback(
- ({ x: code }) => (
-
-
- {countryNames[code]}
-
+ ({ label: code }) => (
+ } label={countryNames[code]} />
),
[countryNames, locale],
);
return (
({
+ label: x,
+ count: y,
+ percent: z,
+ }))}
renderLabel={renderCountryName}
/>
);
}
-
-export default RealtimeCountries;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.module.css b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.module.css
deleted file mode 100644
index f87d86e8f..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.module.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 20px;
-}
-
-.metrics {
- display: flex;
- flex-wrap: wrap;
-}
-
-.card {
- justify-self: flex-start;
-}
-
-@media only screen and (max-width: 992px) {
- .card {
- flex-basis: calc(50% - 20px);
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx
index 6db56b76e..a7af9205b 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx
@@ -1,38 +1,17 @@
-import MetricCard from '@/components/metrics/MetricCard';
import { useMessages } from '@/components/hooks';
-import { RealtimeData } from '@/lib/types';
-import styles from './RealtimeHeader.module.css';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
-export function RealtimeHeader({ data }: { data: RealtimeData }) {
- const { formatMessage, labels } = useMessages();
+export function RealtimeHeader({ data }: { data: any }) {
+ const { t, labels } = useMessages();
const { totals }: any = data || {};
return (
-
+
+
+
+
+
+
);
}
-
-export default RealtimeHeader;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHome.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHome.tsx
deleted file mode 100644
index 104cf3347..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHome.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useEffect } from 'react';
-import { useRouter } from 'next/navigation';
-import Page from '@/components/layout/Page';
-import PageHeader from '@/components/layout/PageHeader';
-import { useApi, useMessages } from '@/components/hooks';
-import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
-
-export function RealtimeHome() {
- const { formatMessage, labels, messages } = useMessages();
- const { get, useQuery } = useApi();
- const router = useRouter();
- const { data, isLoading, error } = useQuery({
- queryKey: ['websites:me'],
- queryFn: () => get('/me/websites'),
- });
-
- useEffect(() => {
- if (data?.length) {
- router.push(`realtime/${data[0].id}`);
- }
- }, [data, router]);
-
- return (
- 0} error={error}>
-
- {data?.length === 0 && (
-
- )}
-
- );
-}
-
-export default RealtimeHome;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.module.css b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.module.css
deleted file mode 100644
index 19d023849..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.module.css
+++ /dev/null
@@ -1,85 +0,0 @@
-.table {
- font-size: var(--font-size-sm);
- overflow: hidden;
- height: 100%;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: var(--font-size-md);
- line-height: 40px;
- font-weight: 700;
-}
-
-.row {
- display: flex;
- align-items: center;
- gap: 10px;
- height: 50px;
- border-bottom: 1px solid var(--base300);
-}
-
-.body {
- overflow: auto;
- height: 100%;
-}
-
-.icon {
- margin-inline-end: 10px;
-}
-
-.time {
- min-width: 60px;
- overflow: hidden;
-}
-
-.detail {
- display: flex;
- align-items: center;
- flex: 1;
- gap: 10px;
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.detail > span {
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
-}
-
-.row .link {
- color: var(--base900);
- text-decoration: none;
-}
-
-.row .link:hover {
- color: var(--primary400);
-}
-
-.search {
- max-width: 300px;
-}
-
-.actions {
- display: flex;
- gap: 20px;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-
-@media only screen and (max-width: 992px) {
- .actions {
- flex-direction: column;
- }
-
- .search {
- max-width: 100%;
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
index 6a2b3c25c..69760eb75 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
@@ -1,16 +1,25 @@
-import useFormat from '@/components//hooks/useFormat';
-import Empty from '@/components/common/Empty';
-import FilterButtons from '@/components/common/FilterButtons';
-import { useCountryNames, useLocale, useMessages, useTimezone } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { BROWSERS, OS_NAMES } from '@/lib/constants';
-import { stringToColor } from '@/lib/format';
-import { RealtimeData } from '@/lib/types';
-import { useContext, useMemo, useState } from 'react';
-import { Icon, SearchField, StatusLight, Text } from 'react-basics';
+import { Column, Heading, Row, SearchField, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { useMemo, useState } from 'react';
import { FixedSizeList } from 'react-window';
-import { WebsiteContext } from '../WebsiteProvider';
-import styles from './RealtimeLog.module.css';
+import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal';
+import { useFormat } from '@/components//hooks/useFormat';
+import { Avatar } from '@/components/common/Avatar';
+import { Empty } from '@/components/common/Empty';
+import { IconLabel } from '@/components/common/IconLabel';
+import {
+ useCountryNames,
+ useLocale,
+ useMessages,
+ useMobile,
+ useNavigation,
+ useTimezone,
+ useWebsite,
+} from '@/components/hooks';
+import { Eye, User } from '@/components/icons';
+import { FilterButtons } from '@/components/input/FilterButtons';
+import { Lightning } from '@/components/svg';
+import { BROWSERS, OS_NAMES } from '@/lib/constants';
const TYPE_ALL = 'all';
const TYPE_PAGEVIEW = 'pageview';
@@ -18,44 +27,44 @@ const TYPE_SESSION = 'session';
const TYPE_EVENT = 'event';
const icons = {
- [TYPE_PAGEVIEW]: ,
- [TYPE_SESSION]: ,
- [TYPE_EVENT]: ,
+ [TYPE_PAGEVIEW]: ,
+ [TYPE_SESSION]: ,
+ [TYPE_EVENT]: ,
};
-export function RealtimeLog({ data }: { data: RealtimeData }) {
- const website = useContext(WebsiteContext);
+export function RealtimeLog({ data }: { data: any }) {
+ const website = useWebsite();
const [search, setSearch] = useState('');
- const { formatMessage, labels, messages } = useMessages();
+ const { t, labels, messages } = useMessages();
const { formatValue } = useFormat();
const { locale } = useLocale();
const { formatTimezoneDate } = useTimezone();
const { countryNames } = useCountryNames(locale);
const [filter, setFilter] = useState(TYPE_ALL);
+ const { updateParams } = useNavigation();
+ const { isPhone } = useMobile();
const buttons = [
{
- label: formatMessage(labels.all),
- key: TYPE_ALL,
+ label: t(labels.all),
+ id: TYPE_ALL,
},
{
- label: formatMessage(labels.views),
- key: TYPE_PAGEVIEW,
+ label: t(labels.views),
+ id: TYPE_PAGEVIEW,
},
{
- label: formatMessage(labels.visitors),
- key: TYPE_SESSION,
+ label: t(labels.visitors),
+ id: TYPE_SESSION,
},
{
- label: formatMessage(labels.events),
- key: TYPE_EVENT,
+ label: t(labels.events),
+ id: TYPE_EVENT,
},
];
const getTime = ({ createdAt, firstAt }) => formatTimezoneDate(firstAt || createdAt, 'pp');
- const getColor = ({ id, sessionId }) => stringToColor(sessionId || id);
-
const getIcon = ({ __type }) => icons[__type];
const getDetail = (log: {
@@ -66,21 +75,23 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
os: string;
country: string;
device: string;
+ hostname: string;
}) => {
- const { __type, eventName, urlPath: url, browser, os, country, device } = log;
+ const { __type, eventName, urlPath, browser, os, country, device, hostname } = log;
if (__type === TYPE_EVENT) {
- return formatMessage(messages.eventLog, {
- event: {eventName || formatMessage(labels.unknown)} ,
- url: (
+ return t.rich(messages.eventLog, {
+ event: eventName || t(labels.unknown),
+ url: urlPath,
+ b: chunks => {chunks} ,
+ a: chunks => (
- {url}
+ {chunks}
),
});
@@ -89,39 +100,45 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
if (__type === TYPE_PAGEVIEW) {
return (
- {url}
+ {urlPath}
);
}
if (__type === TYPE_SESSION) {
- return formatMessage(messages.visitorLog, {
- country: {countryNames[country] || formatMessage(labels.unknown)} ,
- browser: {BROWSERS[browser]} ,
- os: {OS_NAMES[os] || os} ,
- device: {formatMessage(labels[device] || labels.unknown)} ,
+ return t.rich(messages.visitorLog, {
+ country: countryNames[country] || t(labels.unknown),
+ browser: BROWSERS[browser],
+ os: OS_NAMES[os] || os,
+ device: t(labels[device] || labels.unknown),
+ b: chunks => {chunks} ,
});
}
};
- const Row = ({ index, style }) => {
+ const TableRow = ({ index, style }) => {
const row = logs[index];
return (
-
-
-
-
-
{getTime(row)}
-
- {getIcon(row)}
- {getDetail(row)}
-
-
+
+
+
+
+
+
+
+ {getTime(row)}
+
+
+
+ {getDetail(row)}
+
+
+
);
};
@@ -157,22 +174,33 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
}, [data, filter, formatValue, search]);
return (
-
-
-
-
-
-
{formatMessage(labels.activity)}
-
+
+ {t(labels.activity)}
+ {isPhone ? (
+ <>
+
+
+
+
+
+
+ >
+ ) : (
+
+
+
+
+ )}
+
+
{logs?.length === 0 && }
{logs?.length > 0 && (
- {Row}
+ {TableRow}
)}
-
-
+
+
+
);
}
-
-export default RealtimeLog;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx
new file mode 100644
index 000000000..6220c6957
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx
@@ -0,0 +1,58 @@
+'use client';
+import { Grid } from '@umami/react-zen';
+import { firstBy } from 'thenby';
+import { GridRow } from '@/components/common/GridRow';
+import { PageBody } from '@/components/common/PageBody';
+import { Panel } from '@/components/common/Panel';
+import { useMobile, useRealtimeQuery } from '@/components/hooks';
+import { RealtimeChart } from '@/components/metrics/RealtimeChart';
+import { WorldMap } from '@/components/metrics/WorldMap';
+import { percentFilter } from '@/lib/filters';
+import { RealtimeCountries } from './RealtimeCountries';
+import { RealtimeHeader } from './RealtimeHeader';
+import { RealtimeLog } from './RealtimeLog';
+import { RealtimePaths } from './RealtimePaths';
+import { RealtimeReferrers } from './RealtimeReferrers';
+
+export function RealtimePage({ websiteId }: { websiteId: string }) {
+ const { data, isLoading, error } = useRealtimeQuery(websiteId);
+ const { isMobile } = useMobile();
+
+ if (isLoading || error) {
+ return ;
+ }
+
+ const countries = percentFilter(
+ Object.keys(data.countries)
+ .map(key => ({ x: key, y: data.countries[key] }))
+ .sort(firstBy('y', -1)),
+ );
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx
new file mode 100644
index 000000000..e69d9e645
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx
@@ -0,0 +1,45 @@
+import thenby from 'thenby';
+import { useMessages, useWebsite } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
+import { percentFilter } from '@/lib/filters';
+
+export function RealtimePaths({ data }: { data: any }) {
+ const website = useWebsite();
+ const { t, labels } = useMessages();
+ const { urls } = data || {};
+ const limit = 15;
+
+ const renderLink = ({ label: x }) => {
+ const domain = x.startsWith('/') ? website?.domain : '';
+ return (
+
+ {x}
+
+ );
+ };
+
+ const pages = percentFilter(
+ Object.keys(urls)
+ .map(key => {
+ return {
+ x: key,
+ y: urls[key],
+ };
+ })
+ .sort(thenby.firstBy('y', -1))
+ .slice(0, limit),
+ );
+
+ return (
+ ({
+ label: x,
+ count: y,
+ percent: z,
+ }))}
+ />
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx
new file mode 100644
index 000000000..fa2a56b9f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx
@@ -0,0 +1,45 @@
+import thenby from 'thenby';
+import { useMessages, useWebsite } from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
+import { percentFilter } from '@/lib/filters';
+
+export function RealtimeReferrers({ data }: { data: any }) {
+ const website = useWebsite();
+ const { t, labels } = useMessages();
+ const { referrers } = data || {};
+ const limit = 15;
+
+ const renderLink = ({ label: x }) => {
+ const domain = x.startsWith('/') ? website?.domain : '';
+ return (
+
+ {x}
+
+ );
+ };
+
+ const domains = percentFilter(
+ Object.keys(referrers)
+ .map(key => {
+ return {
+ x: key,
+ y: referrers[key],
+ };
+ })
+ .sort(thenby.firstBy('y', -1))
+ .slice(0, limit),
+ );
+
+ return (
+ ({
+ label: x,
+ count: y,
+ percent: z,
+ }))}
+ />
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx
deleted file mode 100644
index ce95bf41d..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeUrls.tsx
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Key, useContext, useState } from 'react';
-import { ButtonGroup, Button, Flexbox } from 'react-basics';
-import thenby from 'thenby';
-import { percentFilter } from '@/lib/filters';
-import ListTable from '@/components/metrics/ListTable';
-import { FILTER_PAGES, FILTER_REFERRERS } from '@/lib/constants';
-import { useMessages } from '@/components/hooks';
-import { RealtimeData } from '@/lib/types';
-import { WebsiteContext } from '../WebsiteProvider';
-
-export function RealtimeUrls({ data }: { data: RealtimeData }) {
- const website = useContext(WebsiteContext);
- const { formatMessage, labels } = useMessages();
- const { referrers, urls } = data || {};
- const [filter, setFilter] = useState(FILTER_REFERRERS);
- const limit = 15;
-
- const buttons = [
- {
- label: formatMessage(labels.referrers),
- key: FILTER_REFERRERS,
- },
- {
- label: formatMessage(labels.pages),
- key: FILTER_PAGES,
- },
- ];
-
- const renderLink = ({ x }) => {
- const domain = x.startsWith('/') ? website?.domain : '';
- return (
-
- {x}
-
- );
- };
-
- const domains = percentFilter(
- Object.keys(referrers)
- .map(key => {
- return {
- x: key,
- y: referrers[key],
- };
- })
- .sort(thenby.firstBy('y', -1))
- .slice(0, limit),
- );
-
- const pages = percentFilter(
- Object.keys(urls)
- .map(key => {
- return {
- x: key,
- y: urls[key],
- };
- })
- .sort(thenby.firstBy('y', -1))
- .slice(0, limit),
- );
-
- return (
- <>
-
-
- {({ key, label }) => {label} }
-
-
- {filter === FILTER_REFERRERS && (
-
- )}
- {filter === FILTER_PAGES && (
-
- )}
- >
- );
-}
-
-export default RealtimeUrls;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx b/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx
deleted file mode 100644
index e6d8d2ab8..000000000
--- a/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-'use client';
-import { firstBy } from 'thenby';
-import { Grid, GridRow } from '@/components/layout/Grid';
-import Page from '@/components/layout/Page';
-import RealtimeChart from '@/components/metrics/RealtimeChart';
-import WorldMap from '@/components/metrics/WorldMap';
-import { useRealtime } from '@/components/hooks';
-import RealtimeLog from './RealtimeLog';
-import RealtimeHeader from './RealtimeHeader';
-import RealtimeUrls from './RealtimeUrls';
-import RealtimeCountries from './RealtimeCountries';
-import WebsiteHeader from '../WebsiteHeader';
-import { percentFilter } from '@/lib/filters';
-
-export function WebsiteRealtimePage({ websiteId }: { websiteId: string }) {
- const { data, isLoading, error } = useRealtime(websiteId);
-
- if (isLoading || error) {
- return ;
- }
-
- const countries = percentFilter(
- Object.keys(data.countries)
- .map(key => ({ x: key, y: data.countries[key] }))
- .sort(firstBy('y', -1)),
- );
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- );
-}
-
-export default WebsiteRealtimePage;
diff --git a/src/app/(main)/websites/[websiteId]/realtime/page.tsx b/src/app/(main)/websites/[websiteId]/realtime/page.tsx
index b376062be..1552196c7 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/page.tsx
@@ -1,10 +1,10 @@
-import WebsiteRealtimePage from './WebsiteRealtimePage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { RealtimePage } from './RealtimePage';
export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
- return ;
+ return ;
}
export const metadata: Metadata = {
diff --git a/src/app/(main)/websites/[websiteId]/replays/ReplayModal.tsx b/src/app/(main)/websites/[websiteId]/replays/ReplayModal.tsx
new file mode 100644
index 000000000..7127a613d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/ReplayModal.tsx
@@ -0,0 +1,43 @@
+'use client';
+import { Column, Dialog, Modal, type ModalProps } from '@umami/react-zen';
+import { ReplayPlayback } from '@/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayback';
+import { useNavigation } from '@/components/hooks';
+
+export interface ReplayModalProps extends ModalProps {
+ websiteId: string;
+}
+
+export function ReplayModal({ websiteId, ...props }: ReplayModalProps) {
+ const {
+ router,
+ query: { replay },
+ updateParams,
+ } = useNavigation();
+
+ const handleOpenChange = (isOpen: boolean) => {
+ if (!isOpen) {
+ router.push(updateParams({ replay: undefined }));
+ }
+ };
+
+ return (
+
+
+
+ {({ close }) => (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/ReplaysDataTable.tsx b/src/app/(main)/websites/[websiteId]/replays/ReplaysDataTable.tsx
new file mode 100644
index 000000000..6d047081d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/ReplaysDataTable.tsx
@@ -0,0 +1,15 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useReplaysQuery } from '@/components/hooks';
+import { ReplaysTable } from './ReplaysTable';
+
+export function ReplaysDataTable({ websiteId }: { websiteId: string }) {
+ const queryResult = useReplaysQuery(websiteId);
+
+ return (
+
+ {({ data }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/ReplaysPage.tsx b/src/app/(main)/websites/[websiteId]/replays/ReplaysPage.tsx
new file mode 100644
index 000000000..f0a607c8b
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/ReplaysPage.tsx
@@ -0,0 +1,70 @@
+'use client';
+import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { EmptyPlaceholder } from '@/components/common/EmptyPlaceholder';
+import { Panel } from '@/components/common/Panel';
+import { useMessages, useSubscription, useWebsite } from '@/components/hooks';
+import { Video } from '@/components/icons';
+import { getItem, setItem } from '@/lib/storage';
+import { Button, Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { type Key, useState } from 'react';
+import { ReplayModal } from './ReplayModal';
+import { ReplaysDataTable } from './ReplaysDataTable';
+import { SavedReplaysDataTable } from './SavedReplaysDataTable';
+
+const KEY_NAME = 'umami.replays.tab';
+
+export function ReplaysPage({ websiteId }: { websiteId: string }) {
+ const [tab, setTab] = useState(getItem(KEY_NAME) || 'replays');
+ const website = useWebsite();
+ const { t, labels, messages } = useMessages();
+ const { hasFeature, cloudMode } = useSubscription(website?.teamId);
+
+ const handleSelect = (value: Key) => {
+ setItem(KEY_NAME, value);
+ setTab(value);
+ };
+
+ if (cloudMode && !hasFeature('replays')) {
+ return (
+
+
+ }
+ title={t(messages.upgradeRequired, { plan: 'Business' })}
+ description="Watch real user sessions to see exactly how visitors interact with your site."
+ >
+ window.open(`${process.env.cloudUrl}/settings/billing`, '_blank')}
+ >
+ {t(labels.upgrade)}
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ {t(labels.replays)}
+ {t(labels.saved)}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/ReplaysTable.tsx b/src/app/(main)/websites/[websiteId]/replays/ReplaysTable.tsx
new file mode 100644
index 000000000..64e460f04
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/ReplaysTable.tsx
@@ -0,0 +1,77 @@
+import { Button, DataColumn, DataTable, type DataTableProps, Icon } from '@umami/react-zen';
+import { Play } from 'lucide-react';
+import Link from 'next/link';
+import { Avatar } from '@/components/common/Avatar';
+import { DateDistance } from '@/components/common/DateDistance';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import { useFormat, useMessages, useNavigation } from '@/components/hooks';
+
+function formatDuration(ms: number) {
+ const seconds = Math.floor(ms / 1000);
+ const minutes = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+ return `${minutes}:${secs.toString().padStart(2, '0')}`;
+}
+
+export function ReplaysTable({ ...props }: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { formatValue } = useFormat();
+ const { router, updateParams } = useNavigation();
+
+ return (
+
+
+ {(row: any) => (
+ router.push(updateParams({ replay: row.id }))}>
+
+
+
+
+ )}
+
+
+ {(row: any) => (
+
+
+
+ )}
+
+
+ {(row: any) => formatDuration(row.duration || 0)}
+
+
+
+ {(row: any) => (
+
+ {row.city ? `${row.city}, ` : ''}
+ {formatValue(row.country, 'country')}
+
+ )}
+
+
+ {(row: any) => (
+
+ {formatValue(row.browser, 'browser')}
+
+ )}
+
+
+ {(row: any) => (
+
+ {formatValue(row.os, 'os')}
+
+ )}
+
+
+ {(row: any) => (
+
+ {formatValue(row.device, 'device')}
+
+ )}
+
+
+ {(row: any) => }
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/SavedReplaysDataTable.tsx b/src/app/(main)/websites/[websiteId]/replays/SavedReplaysDataTable.tsx
new file mode 100644
index 000000000..c682a2c38
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/SavedReplaysDataTable.tsx
@@ -0,0 +1,15 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useSavedReplaysQuery } from '@/components/hooks';
+import { SavedReplaysTable } from './SavedReplaysTable';
+
+export function SavedReplaysDataTable({ websiteId }: { websiteId: string }) {
+ const queryResult = useSavedReplaysQuery(websiteId);
+
+ return (
+
+ {({ data }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/SavedReplaysTable.tsx b/src/app/(main)/websites/[websiteId]/replays/SavedReplaysTable.tsx
new file mode 100644
index 000000000..cf3f55768
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/SavedReplaysTable.tsx
@@ -0,0 +1,31 @@
+import { Button, DataColumn, DataTable, type DataTableProps, Icon } from '@umami/react-zen';
+import { Play } from 'lucide-react';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages, useNavigation } from '@/components/hooks';
+
+export function SavedReplaysTable({ ...props }: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { router, updateParams } = useNavigation();
+
+ return (
+
+
+ {(row: any) => (
+ router.push(updateParams({ replay: row.visitId }))}
+ >
+
+
+
+
+ )}
+
+
+
+
+ {(row: any) => }
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayback.tsx b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayback.tsx
new file mode 100644
index 000000000..4ee20baac
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayback.tsx
@@ -0,0 +1,112 @@
+'use client';
+import { Button, Column, Dialog, DialogTrigger, Icon, Popover, Row, Text } from '@umami/react-zen';
+import { Bookmark, X } from 'lucide-react';
+import { useState } from 'react';
+import { SessionInfo } from '@/app/(main)/websites/[websiteId]/sessions/SessionInfo';
+import { Avatar } from '@/components/common/Avatar';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import {
+ useMessages,
+ useReplayQuery,
+ useReplaySavedQuery,
+ useUpdateQuery,
+ useWebsiteSessionQuery,
+} from '@/components/hooks';
+import { touch } from '@/components/hooks/useModified';
+import { ReplayPlayer } from './ReplayPlayer';
+import { ReplaySaveForm } from './ReplaySaveForm';
+
+export function ReplayPlayback({
+ websiteId,
+ replayId,
+ showSessionInfo = true,
+ onClose,
+}: {
+ websiteId: string;
+ replayId: string;
+ showSessionInfo?: boolean;
+ onClose?: () => void;
+}) {
+ const { data: replay, isLoading, error } = useReplayQuery(websiteId, replayId);
+ const { data: replaySaved } = useReplaySavedQuery(websiteId, replayId);
+ const { data: session } = useWebsiteSessionQuery(websiteId, replay?.sessionId);
+ const { t, labels } = useMessages();
+ const [isSaved, setIsSaved] = useState(null);
+ const { mutate } = useUpdateQuery(`/websites/${websiteId}/replays/saved/${replayId}`);
+
+ const saved = isSaved ?? replaySaved?.isSaved ?? false;
+
+ const handleUnsave = () => {
+ setIsSaved(false);
+ mutate({ isSaved: false }, { onSuccess: () => touch('replays') });
+ };
+
+ return (
+
+ {replay && (
+
+ {session && (
+
+
+
+
+ {t(labels.replay)}
+
+ {replay.eventCount} {t(labels.actions).toLowerCase()}
+
+
+
+
+ {saved ? (
+
+
+
+
+
+ ) : (
+
+
+
+
+
+
+
+
+ {({ close }) => (
+ {
+ setIsSaved(true);
+ touch('replays');
+ }}
+ onClose={close}
+ />
+ )}
+
+
+
+ )}
+ {onClose && (
+
+
+
+
+
+ )}
+
+
+ )}
+
+ {showSessionInfo && session && }
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayer.tsx b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayer.tsx
new file mode 100644
index 000000000..04bb2345a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayer.tsx
@@ -0,0 +1,65 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { useEffect, useRef, useState } from 'react';
+import { useMobile } from '@/components/hooks';
+import 'rrweb-player/dist/style.css';
+
+export function ReplayPlayer({ events }: { events: any[] }) {
+ const containerRef = useRef(null);
+ const playerRef = useRef(null);
+ const [loaded, setLoaded] = useState(false);
+ const { isMobile, isPhone } = useMobile();
+
+ const playerWidth = isPhone ? 360 : isMobile ? 640 : 1024;
+ const playerHeight = isPhone ? 202 : isMobile ? 360 : 576;
+
+ useEffect(() => {
+ if (!containerRef.current || !events?.length) return;
+
+ import('rrweb-player').then(mod => {
+ const RRWebPlayer = mod.default;
+
+ if (containerRef.current) {
+ containerRef.current.innerHTML = '';
+ }
+
+ playerRef.current = new RRWebPlayer({
+ target: containerRef.current,
+ props: {
+ events: events,
+ width: playerWidth,
+ height: playerHeight,
+ autoPlay: false,
+ showController: true,
+ speedOption: [1, 2, 4, 8],
+ },
+ });
+
+ setLoaded(true);
+ });
+
+ return () => {
+ if (playerRef.current) {
+ playerRef.current.$destroy?.();
+ playerRef.current = null;
+ }
+ };
+ }, [events, playerWidth, playerHeight]);
+
+ return (
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplaySaveForm.tsx b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplaySaveForm.tsx
new file mode 100644
index 000000000..8132679f6
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/[replayId]/ReplaySaveForm.tsx
@@ -0,0 +1,57 @@
+'use client';
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ TextField,
+} from '@umami/react-zen';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { touch } from '@/components/hooks/useModified';
+
+export function ReplaySaveForm({
+ websiteId,
+ replayId,
+ onSave,
+ onClose,
+}: {
+ websiteId: string;
+ replayId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery(
+ `/websites/${websiteId}/replays/saved/${replayId}`,
+ );
+
+ const handleSubmit = async (formData: { name: string }) => {
+ await mutateAsync(
+ { isSaved: true, name: formData.name },
+ {
+ onSuccess: () => {
+ touch('replays');
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/replays/[replayId]/page.tsx b/src/app/(main)/websites/[websiteId]/replays/[replayId]/page.tsx
new file mode 100644
index 000000000..7a6502e5d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/[replayId]/page.tsx
@@ -0,0 +1,16 @@
+import type { Metadata } from 'next';
+import { ReplayPlayback } from './ReplayPlayback';
+
+export default async function ({
+ params,
+}: {
+ params: Promise<{ websiteId: string; replayId: string }>;
+}) {
+ const { websiteId, replayId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Session Replay',
+};
diff --git a/src/app/(main)/websites/[websiteId]/replays/page.tsx b/src/app/(main)/websites/[websiteId]/replays/page.tsx
new file mode 100644
index 000000000..273fc3fc1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/replays/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { ReplaysPage } from './ReplaysPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Replays',
+};
diff --git a/src/app/(main)/websites/[websiteId]/reports/WebsiteReportsPage.tsx b/src/app/(main)/websites/[websiteId]/reports/WebsiteReportsPage.tsx
deleted file mode 100644
index e61aacb14..000000000
--- a/src/app/(main)/websites/[websiteId]/reports/WebsiteReportsPage.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-'use client';
-import Link from 'next/link';
-import { Button, Flexbox, Icon, Icons, Text } from 'react-basics';
-import { useMessages, useTeamUrl } from '@/components/hooks';
-import WebsiteHeader from '../WebsiteHeader';
-import ReportsDataTable from '@/app/(main)/reports/ReportsDataTable';
-
-export function WebsiteReportsPage({ websiteId }) {
- const { formatMessage, labels } = useMessages();
- const { renderTeamUrl } = useTeamUrl();
-
- return (
- <>
-
-
-
-
-
-
-
- {formatMessage(labels.createReport)}
-
-
-
-
- >
- );
-}
-
-export default WebsiteReportsPage;
diff --git a/src/app/(main)/websites/[websiteId]/reports/page.tsx b/src/app/(main)/websites/[websiteId]/reports/page.tsx
deleted file mode 100644
index 15c79de9a..000000000
--- a/src/app/(main)/websites/[websiteId]/reports/page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import WebsiteReportsPage from './WebsiteReportsPage';
-import { Metadata } from 'next';
-
-export default async function ({ params }: { params: { websiteId: string } }) {
- const { websiteId } = await params;
-
- return ;
-}
-
-export const metadata: Metadata = {
- title: 'Website Reports',
-};
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx
new file mode 100644
index 000000000..8786f82bc
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx
@@ -0,0 +1,16 @@
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { SegmentEditForm } from './SegmentEditForm';
+
+export function SegmentAddButton({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } label={t(labels.segment)} variant="primary" width="800px">
+ {({ close }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx
new file mode 100644
index 000000000..8f596f4cf
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx
@@ -0,0 +1,50 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function SegmentDeleteButton({
+ segmentId,
+ websiteId,
+ name,
+ onSave,
+}: {
+ segmentId: string;
+ websiteId: string;
+ name: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages } = useMessages();
+ const { mutateAsync, isPending, error, touch } = useDeleteQuery(
+ `/websites/${websiteId}/segments/${segmentId}`,
+ );
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('segments');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } title={t(labels.confirm)} variant="quiet" width="600px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={error}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx
new file mode 100644
index 000000000..79d4c390f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx
@@ -0,0 +1,32 @@
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import type { Filter } from '@/lib/types';
+import { SegmentEditForm } from './SegmentEditForm';
+
+export function SegmentEditButton({
+ segmentId,
+ websiteId,
+ filters,
+}: {
+ segmentId: string;
+ websiteId: string;
+ filters?: Filter[];
+}) {
+ const { t, labels } = useMessages();
+
+ return (
+ } title={t(labels.segment)} variant="quiet" width="800px">
+ {({ close }) => {
+ return (
+
+ );
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx
new file mode 100644
index 000000000..553c0c9b6
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx
@@ -0,0 +1,100 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ Label,
+ Loading,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { useMessages, useUpdateQuery, useWebsiteSegmentQuery } from '@/components/hooks';
+import { FieldFilters } from '@/components/input/FieldFilters';
+
+export function SegmentEditForm({
+ segmentId,
+ websiteId,
+ filters = [],
+ showFilters = true,
+ onSave,
+ onClose,
+}: {
+ segmentId?: string;
+ websiteId: string;
+ filters?: any[];
+ showFilters?: boolean;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { data } = useWebsiteSegmentQuery(websiteId, segmentId);
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const [currentMatch, setCurrentMatch] = useState('all');
+
+ useEffect(() => {
+ setCurrentMatch((data?.parameters as any)?.match || 'all');
+ }, [data]);
+
+ const { mutateAsync, error, isPending, touch, toast } = useUpdateQuery(
+ `/websites/${websiteId}/segments${segmentId ? `/${segmentId}` : ''}`,
+ {
+ type: 'segment',
+ },
+ );
+
+ const handleSubmit = async (formData: any) => {
+ await mutateAsync(
+ {
+ ...formData,
+ parameters: {
+ ...formData.parameters,
+ match: currentMatch !== 'all' ? currentMatch : undefined,
+ },
+ },
+ {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('segments');
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ if (segmentId && !data) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx
new file mode 100644
index 000000000..c1ba82ebb
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx
@@ -0,0 +1,24 @@
+import { DataGrid } from '@/components/common/DataGrid';
+import { useWebsiteSegmentsQuery } from '@/components/hooks';
+import { SegmentAddButton } from './SegmentAddButton';
+import { SegmentsTable } from './SegmentsTable';
+
+export function SegmentsDataTable({ websiteId }: { websiteId?: string }) {
+ const query = useWebsiteSegmentsQuery(websiteId, { type: 'segment' });
+
+ const renderActions = () => {
+ return ;
+ };
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx
new file mode 100644
index 000000000..cbe7a1c1f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx
@@ -0,0 +1,16 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { Panel } from '@/components/common/Panel';
+import { SegmentsDataTable } from './SegmentsDataTable';
+
+export function SegmentsPage({ websiteId }) {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx
new file mode 100644
index 000000000..7e8ddb2a6
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx
@@ -0,0 +1,38 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { SegmentDeleteButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton';
+import { SegmentEditButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditButton';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages, useNavigation } from '@/components/hooks';
+
+export function SegmentsTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { websiteId, renderUrl } = useNavigation();
+
+ return (
+
+
+ {(row: any) => (
+
+ {row.name}
+
+ )}
+
+
+ {(row: any) => }
+
+
+ {(row: any) => {
+ const { id, name } = row;
+
+ return (
+
+
+
+
+ );
+ }}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/segments/page.tsx b/src/app/(main)/websites/[websiteId]/segments/page.tsx
new file mode 100644
index 000000000..0d3faacbf
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/segments/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { SegmentsPage } from './SegmentsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Segments',
+};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx
new file mode 100644
index 000000000..1a54f506a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx
@@ -0,0 +1,105 @@
+import {
+ Button,
+ Column,
+ Dialog,
+ DialogTrigger,
+ Heading,
+ Icon,
+ Popover,
+ Row,
+ StatusLight,
+ Text,
+} from '@umami/react-zen';
+import { isSameDay } from 'date-fns';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useMobile, useSessionActivityQuery, useTimezone } from '@/components/hooks';
+import { Eye, FileText } from '@/components/icons';
+import { EventData } from '@/components/metrics/EventData';
+import { Lightning } from '@/components/svg';
+
+export function SessionActivity({
+ websiteId,
+ sessionId,
+ startDate,
+ endDate,
+}: {
+ websiteId: string;
+ sessionId: string;
+ startDate: Date;
+ endDate: Date;
+}) {
+ const { t, labels } = useMessages();
+ const { formatTimezoneDate } = useTimezone();
+ const { data, isLoading, error } = useSessionActivityQuery(
+ websiteId,
+ sessionId,
+ startDate,
+ endDate,
+ );
+ const { isMobile } = useMobile();
+ let lastDay = null;
+
+ const renderLink = (label: string, hostname: string) => {
+ return (
+
+ {label}
+
+ );
+ };
+
+ return (
+
+
+ {data?.map(({ eventId, createdAt, urlPath, eventName, visitId, hostname, hasData }) => {
+ const showHeader = !lastDay || !isSameDay(new Date(lastDay), new Date(createdAt));
+ lastDay = createdAt;
+
+ return (
+
+ {showHeader && {formatTimezoneDate(createdAt, 'PPPP')} }
+
+
+ {formatTimezoneDate(createdAt, 'pp')}
+
+
+ {eventName ? : }
+
+ {eventName ? t(labels.triggeredEvent) : t(labels.viewedPage)}
+
+
+ {eventName || renderLink(urlPath, hostname)}
+
+ {hasData > 0 && }
+
+
+
+ );
+ })}
+
+
+ );
+}
+
+const PropertiesButton = props => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx
new file mode 100644
index 000000000..15cb86ccc
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx
@@ -0,0 +1,32 @@
+import { Box, Column, Label, Row, Text } from '@umami/react-zen';
+import { Empty } from '@/components/common/Empty';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useSessionDataQuery } from '@/components/hooks';
+import { DATA_TYPES } from '@/lib/constants';
+
+export function SessionData({ websiteId, sessionId }: { websiteId: string; sessionId: string }) {
+ const { data, isLoading, error } = useSessionDataQuery(websiteId, sessionId);
+
+ return (
+
+ {!data?.length && }
+
+ {data?.map(({ dataKey, dataType, stringValue }) => {
+ return (
+
+ {dataKey}
+
+ {stringValue}
+
+
+ {DATA_TYPES[dataType]}
+
+
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx
new file mode 100644
index 000000000..8ccaede42
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx
@@ -0,0 +1,76 @@
+import { Column, Grid, Icon, Label, Row } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { DateDistance } from '@/components/common/DateDistance';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import { useFormat, useLocale, useMessages, useRegionNames } from '@/components/hooks';
+import { Calendar, KeyRound, Landmark, MapPin } from '@/components/icons';
+
+export function SessionInfo({ data }) {
+ const { locale } = useLocale();
+ const { t, labels } = useMessages();
+ const { formatValue } = useFormat();
+ const { getRegionName } = useRegionNames(locale);
+
+ return (
+
+ }>
+ {data?.distinctId}
+
+
+ }>
+
+
+
+ }>
+
+
+
+ }>
+ {formatValue(data?.country, 'country')}
+
+
+ }>
+ {getRegionName(data?.region)}
+
+
+ }>
+ {data?.city}
+
+
+ }>
+ {formatValue(data?.browser, 'browser')}
+
+
+ }
+ >
+ {formatValue(data?.os, 'os')}
+
+
+ }>
+ {formatValue(data?.device, 'device')}
+
+
+ );
+}
+
+const Info = ({
+ label,
+ icon,
+ children,
+}: {
+ label: string;
+ icon?: ReactNode;
+ children: ReactNode;
+}) => {
+ return (
+
+ {label}
+
+ {icon && {icon} }
+ {children || '—'}
+
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx
new file mode 100644
index 000000000..dd9ce4690
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx
@@ -0,0 +1,44 @@
+'use client';
+import { Column, Dialog, Modal, type ModalProps } from '@umami/react-zen';
+import { SessionProfile } from '@/app/(main)/websites/[websiteId]/sessions/SessionProfile';
+import { useNavigation } from '@/components/hooks';
+
+export interface SessionModalProps extends ModalProps {
+ websiteId: string;
+}
+
+export function SessionModal({ websiteId, ...props }: SessionModalProps) {
+ const {
+ router,
+ pathname,
+ query: { session },
+ updateParams,
+ } = useNavigation();
+ const isSharePage = pathname.includes('/share/');
+ const handleOpenChange = (isOpen: boolean) => {
+ if (!isOpen) {
+ router.push(updateParams({ session: undefined }));
+ }
+ };
+
+ return (
+
+
+
+ {({ close }) => (
+
+ close()} />
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx
new file mode 100644
index 000000000..9671c995e
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx
@@ -0,0 +1,94 @@
+'use client';
+import { Avatar } from '@/components/common/Avatar';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useWebsiteSessionQuery } from '@/components/hooks';
+import {
+ Button,
+ Column,
+ Icon,
+ Row,
+ Tab,
+ TabList,
+ TabPanel,
+ Tabs,
+ TextField,
+} from '@umami/react-zen';
+import { X } from 'lucide-react';
+import { SessionActivity } from './SessionActivity';
+import { SessionData } from './SessionData';
+import { SessionInfo } from './SessionInfo';
+import { SessionReplaysDataTable } from './SessionReplaysDataTable';
+import { SessionStats } from './SessionStats';
+
+export function SessionProfile({
+ websiteId,
+ sessionId,
+ showReplays = true,
+ onClose,
+}: {
+ websiteId: string;
+ sessionId: string;
+ showReplays?: boolean;
+ onClose?: () => void;
+}) {
+ const { data, isLoading, error } = useWebsiteSessionQuery(websiteId, sessionId);
+ const { t, labels } = useMessages();
+
+ return (
+
+ {data && (
+
+ {onClose && (
+
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.activity)}
+ {t(labels.properties)}
+ {showReplays && {t(labels.replays)} }
+
+
+
+
+
+
+
+ {showReplays && (
+
+
+
+ )}
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProfileModal.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProfileModal.tsx
new file mode 100644
index 000000000..b94be97ef
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProfileModal.tsx
@@ -0,0 +1,41 @@
+'use client';
+import { Column, Dialog, Modal } from '@umami/react-zen';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { buildPath } from '@/lib/url';
+import { SessionProfile } from './SessionProfile';
+
+export function SessionProfileModal({
+ websiteId,
+ sessionId,
+}: {
+ websiteId: string;
+ sessionId: string;
+}) {
+ const router = useRouter();
+ const searchParams = useSearchParams();
+
+ const closeModal = () => {
+ const query = Object.fromEntries(searchParams.entries());
+ delete query.session;
+
+ router.push(buildPath(`/websites/${websiteId}/sessions`, query));
+ };
+
+ const handleOpenChange = (isOpen: boolean) => {
+ if (!isOpen) {
+ closeModal();
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.module.css b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.module.css
deleted file mode 100644
index 0b9c011d1..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.module.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.container {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
- gap: 60px;
- margin-bottom: 40px;
-}
-
-.table {
- align-self: flex-start;
-}
-
-.link:hover {
- cursor: pointer;
- color: var(--primary400);
-}
-
-.title {
- text-align: center;
- font-weight: bold;
- margin: 20px 0;
-}
-
-.chart {
- min-height: 620px;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx
index a0b47bc9a..6d21750ac 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx
@@ -1,52 +1,97 @@
-import { GridColumn, GridTable } from 'react-basics';
-import { useSessionDataProperties, useSessionDataValues, useMessages } from '@/components/hooks';
+import { Column, Grid, ListItem, Select } from '@umami/react-zen';
+import { useMemo, useState } from 'react';
+import { PieChart } from '@/components/charts/PieChart';
import { LoadingPanel } from '@/components/common/LoadingPanel';
-import PieChart from '@/components/charts/PieChart';
-import { useState } from 'react';
+import {
+ useMessages,
+ useSessionDataPropertiesQuery,
+ useSessionDataValuesQuery,
+} from '@/components/hooks';
+import { ListTable } from '@/components/metrics/ListTable';
import { CHART_COLORS } from '@/lib/constants';
-import styles from './SessionProperties.module.css';
export function SessionProperties({ websiteId }: { websiteId: string }) {
const [propertyName, setPropertyName] = useState('');
- const { formatMessage, labels } = useMessages();
- const { data, isLoading, isFetched, error } = useSessionDataProperties(websiteId);
- const { data: values } = useSessionDataValues(websiteId, propertyName);
- const chartData =
- propertyName && values
- ? {
- labels: values.map(({ value }) => value),
- datasets: [
- {
- data: values.map(({ total }) => total),
- backgroundColor: CHART_COLORS,
- borderWidth: 0,
- },
- ],
- }
- : null;
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useSessionDataPropertiesQuery(websiteId);
+
+ const properties: string[] = data?.map(e => e.propertyName);
return (
-
-
-
-
- {row => (
- setPropertyName(row.propertyName)}>
- {row.propertyName}
-
- )}
-
-
-
- {propertyName && (
-
+
+
+ {data && (
+
+
+ {properties?.map(p => (
+
+ {p}
+
+ ))}
+
+
)}
-
+ {propertyName && }
+
);
}
-export default SessionProperties;
+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 (
+
+ {data && (
+
+
+
+
+ )}
+
+ );
+};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysDataTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysDataTable.tsx
new file mode 100644
index 000000000..daca0577c
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysDataTable.tsx
@@ -0,0 +1,60 @@
+'use client';
+import { Column } from '@umami/react-zen';
+import { useState } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useSessionReplaysQuery } from '@/components/hooks';
+import { ReplayPlayback } from '../replays/[replayId]/ReplayPlayback';
+import { SessionReplaysTable } from './SessionReplaysTable';
+
+function InlinePlayer({
+ websiteId,
+ replayId,
+ onClose,
+}: {
+ websiteId: string;
+ replayId: string;
+ onClose: () => void;
+}) {
+ return (
+
+
+
+ );
+}
+
+export function SessionReplaysDataTable({
+ websiteId,
+ sessionId,
+}: {
+ websiteId: string;
+ sessionId: string;
+}) {
+ const queryResult = useSessionReplaysQuery(websiteId, sessionId);
+ const [selectedId, setSelectedId] = useState();
+
+ const handlePlay = (id: string) => {
+ setSelectedId(prev => (prev === id ? undefined : id));
+ };
+
+ return (
+
+ {selectedId && (
+ setSelectedId(undefined)}
+ />
+ )}
+
+ {({ data }) => (
+
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysTable.tsx
new file mode 100644
index 000000000..41910e3b4
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionReplaysTable.tsx
@@ -0,0 +1,44 @@
+import { Button, DataColumn, DataTable, type DataTableProps, Icon } from '@umami/react-zen';
+import { Play } from 'lucide-react';
+import { DateDistance } from '@/components/common/DateDistance';
+import { useMessages } from '@/components/hooks';
+
+function formatDuration(ms: number) {
+ const seconds = Math.floor(ms / 1000);
+ const minutes = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+ return `${minutes}:${secs.toString().padStart(2, '0')}`;
+}
+
+export function SessionReplaysTable({
+ onPlay,
+ selectedId,
+ ...props
+}: DataTableProps & { onPlay: (id: string) => void; selectedId?: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+ {(row: any) => (
+ onPlay(row.id)}
+ >
+
+
+
+
+ )}
+
+
+
+ {(row: any) => formatDuration(row.duration || 0)}
+
+
+
+ {(row: any) => }
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionStats.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionStats.tsx
new file mode 100644
index 000000000..511d8596f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionStats.tsx
@@ -0,0 +1,21 @@
+import { useMessages } from '@/components/hooks';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
+import { formatShortTime } from '@/lib/format';
+
+export function SessionStats({ data }) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+ `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`}
+ />
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx
index 0f193a97b..1b8f441a5 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx
@@ -1,21 +1,20 @@
-import { useWebsiteSessions } from '@/components/hooks';
-import SessionsTable from './SessionsTable';
-import DataTable from '@/components/common/DataTable';
-import { ReactNode } from 'react';
+import { DataGrid } from '@/components/common/DataGrid';
+import { useNavigation, useWebsiteSessionsQuery } from '@/components/hooks';
+import { SessionsTable } from './SessionsTable';
-export default function SessionsDataTable({
- websiteId,
- children,
-}: {
- websiteId?: string;
- teamId?: string;
- children?: ReactNode;
-}) {
- const queryResult = useWebsiteSessions(websiteId);
+export function SessionsDataTable({ websiteId }: { websiteId: string }) {
+ const queryResult = useWebsiteSessionsQuery(websiteId);
+ const { updateParams } = useNavigation();
return (
- children}>
- {({ data }) => }
-
+
+ {({ data }) => (
+ updateParams({ session: row.id })}
+ />
+ )}
+
);
}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx
index 62d60de8b..34dfcefee 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx
@@ -1,42 +1,40 @@
+import { LoadingPanel } from '@/components/common/LoadingPanel';
import { useMessages } from '@/components/hooks';
-import useWebsiteSessionStats from '@/components/hooks/queries/useWebsiteSessionStats';
-import WebsiteDateFilter from '@/components/input/WebsiteDateFilter';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
+import { useWebsiteSessionStatsQuery } from '@/components/hooks/queries/useWebsiteSessionStatsQuery';
+import { MetricCard } from '@/components/metrics/MetricCard';
+import { MetricsBar } from '@/components/metrics/MetricsBar';
import { formatLongNumber } from '@/lib/format';
-import { Flexbox } from 'react-basics';
export function SessionsMetricsBar({ websiteId }: { websiteId: string }) {
- const { formatMessage, labels } = useMessages();
- const { data, isLoading, isFetched, error } = useWebsiteSessionStats(websiteId);
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteSessionStatsQuery(websiteId);
return (
-
-
-
-
-
-
-
-
-
+
+ {data && (
+
+
+
+
+
+
+ )}
+
);
}
-
-export default SessionsMetricsBar;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx
index 2ee044db6..f891f2ad7 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx
@@ -1,35 +1,43 @@
'use client';
-import WebsiteHeader from '../WebsiteHeader';
-import SessionsDataTable from './SessionsDataTable';
-import SessionsMetricsBar from './SessionsMetricsBar';
-import SessionProperties from './SessionProperties';
-import WorldMap from '@/components/metrics/WorldMap';
-import { GridRow } from '@/components/layout/Grid';
-import { Item, Tabs } from 'react-basics';
-import { useState } from 'react';
+import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { type Key, useState } from 'react';
+import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls';
+import { Panel } from '@/components/common/Panel';
import { useMessages } from '@/components/hooks';
-import SessionsWeekly from './SessionsWeekly';
+import { getItem, setItem } from '@/lib/storage';
+import { SessionModal } from './SessionModal';
+import { SessionProperties } from './SessionProperties';
+import { SessionsDataTable } from './SessionsDataTable';
+
+const KEY_NAME = 'umami.sessions.tab';
export function SessionsPage({ websiteId }) {
- const [tab, setTab] = useState('activity');
- const { formatMessage, labels } = useMessages();
+ const [tab, setTab] = useState(getItem(KEY_NAME) || 'activity');
+ const { t, labels } = useMessages();
+
+ const handleSelect = (value: Key) => {
+ setItem(KEY_NAME, value);
+ setTab(value);
+ };
return (
- <>
-
-
-
-
-
-
- setTab(value)} style={{ marginBottom: 30 }}>
- - {formatMessage(labels.activity)}
- - {formatMessage(labels.properties)}
-
- {tab === 'activity' && }
- {tab === 'properties' && }
- >
+
+
+
+
+
+
+ {t(labels.activity)}
+ {t(labels.properties)}
+
+
+
+
+
+
+
+
+
+
);
}
-
-export default SessionsPage;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.module.css b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.module.css
deleted file mode 100644
index 140ad0bb7..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.link {
- display: flex;
- align-items: center;
- gap: 20px;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx
index ddb3ed65b..1f3d451a7 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx
@@ -1,60 +1,62 @@
+import { DataColumn, DataTable, type DataTableProps } from '@umami/react-zen';
import Link from 'next/link';
-import { GridColumn, GridTable } from 'react-basics';
-import { useFormat, useMessages, useTimezone } from '@/components/hooks';
-import Avatar from '@/components/common/Avatar';
-import styles from './SessionsTable.module.css';
-import TypeIcon from '@/components/common/TypeIcon';
+import { Avatar } from '@/components/common/Avatar';
+import { DateDistance } from '@/components/common/DateDistance';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import { useFormat, useMessages } from '@/components/hooks';
-export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) {
- const { formatTimezoneDate } = useTimezone();
- const { formatMessage, labels } = useMessages();
+export function SessionsTable({
+ websiteId,
+ getSessionHref,
+ ...props
+}: DataTableProps & { websiteId: string; getSessionHref?: (row: any) => string }) {
+ const { t, labels } = useMessages();
const { formatValue } = useFormat();
return (
-
-
- {row => (
-
-
+
+
+ {(row: any) => (
+
+
)}
-
-
-
-
- {row => (
+
+
+
+
+
+ {(row: any) => (
+ {row.city ? `${row.city}, ` : ''}
{formatValue(row.country, 'country')}
)}
-
-
-
- {row => (
+
+
+ {(row: any) => (
{formatValue(row.browser, 'browser')}
)}
-
-
- {row => (
+
+
+ {(row: any) => (
{formatValue(row.os, 'os')}
)}
-
-
- {row => (
+
+
+ {(row: any) => (
{formatValue(row.device, 'device')}
)}
-
-
- {row => formatTimezoneDate(row.createdAt, 'PPPpp')}
-
-
+
+
+ {(row: any) => }
+
+
);
}
-
-export default SessionsTable;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.module.css b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.module.css
deleted file mode 100644
index 353616435..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.module.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.week {
- display: flex;
- justify-content: space-between;
- position: relative;
-}
-
-.header {
- text-align: center;
- font-weight: 700;
- margin-bottom: 10px;
-}
-
-.day {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- justify-content: flex-start;
- gap: 1px;
- position: relative;
-}
-
-.cell {
- display: flex;
- background-color: var(--base75);
- width: 20px;
- height: 20px;
- margin: auto;
- border-radius: 100%;
- align-items: flex-start;
-}
-
-.hour {
- font-weight: 700;
- color: var(--font-color300);
- height: 20px;
-}
-
-.block {
- background-color: var(--primary400);
- width: 20px;
- height: 20px;
- border-radius: 100%;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx
deleted file mode 100644
index 283a7ea08..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import { format, startOfDay, addHours } from 'date-fns';
-import { useLocale, useMessages, useWebsiteSessionsWeekly } from '@/components/hooks';
-import { LoadingPanel } from '@/components/common/LoadingPanel';
-import { getDayOfWeekAsDate } from '@/lib/date';
-import styles from './SessionsWeekly.module.css';
-import classNames from 'classnames';
-import { TooltipPopup } from 'react-basics';
-
-export function SessionsWeekly({ websiteId }: { websiteId: string }) {
- const { data, ...props } = useWebsiteSessionsWeekly(websiteId);
- const { dateLocale } = useLocale();
- const { labels, formatMessage } = useMessages();
- const { weekStartsOn } = dateLocale.options;
- const daysOfWeek = Array(7)
- .fill(weekStartsOn)
- .map((d, i) => (d + i) % 7);
-
- const [, max] = data
- ? data.reduce((arr: number[], hours: number[], index: number) => {
- const min = Math.min(...hours);
- const max = Math.max(...hours);
-
- if (index === 0) {
- return [min, max];
- }
-
- if (min < arr[0]) {
- arr[0] = min;
- }
-
- if (max > arr[1]) {
- arr[1] = max;
- }
-
- return arr;
- }, [])
- : [];
-
- return (
-
-
-
-
- {Array(24)
- .fill(null)
- .map((_, i) => {
- const label = format(addHours(startOfDay(new Date()), i), 'p', { locale: dateLocale })
- .replace(/\D00 ?/, '')
- .toLowerCase();
- return (
-
- {label}
-
- );
- })}
-
- {data &&
- daysOfWeek.map((index: number) => {
- const day = data[index];
- return (
-
-
- {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })}
-
- {day?.map((hour: number, j) => {
- const pct = hour / max;
- return (
-
- {hour > 0 && (
-
-
-
- )}
-
- );
- })}
-
- );
- })}
-
-
- );
-}
-
-export default SessionsWeekly;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.module.css
deleted file mode 100644
index fb830d382..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.module.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.timeline {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.row {
- display: grid;
- grid-template-columns: max-content max-content 1fr;
- align-items: center;
- gap: 20px;
-}
-
-.time {
- color: var(--font-color200);
- width: 150px;
-}
-
-.header {
- font-weight: bold;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx
deleted file mode 100644
index 6a847fb45..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { isSameDay } from 'date-fns';
-import { Loading, Icon, StatusLight } from 'react-basics';
-import Icons from '@/components/icons';
-import { useSessionActivity, useTimezone } from '@/components/hooks';
-import styles from './SessionActivity.module.css';
-import { Fragment } from 'react';
-
-export function SessionActivity({
- websiteId,
- sessionId,
- startDate,
- endDate,
-}: {
- websiteId: string;
- sessionId: string;
- startDate: Date;
- endDate: Date;
-}) {
- const { formatTimezoneDate } = useTimezone();
- const { data, isLoading } = useSessionActivity(websiteId, sessionId, startDate, endDate);
-
- if (isLoading) {
- return ;
- }
-
- let lastDay = null;
-
- return (
-
- {data.map(({ id, createdAt, urlPath, eventName, visitId }) => {
- const showHeader = !lastDay || !isSameDay(new Date(lastDay), new Date(createdAt));
- lastDay = createdAt;
-
- return (
-
- {showHeader && (
- {formatTimezoneDate(createdAt, 'PPPP')}
- )}
-
-
-
- {formatTimezoneDate(createdAt, 'pp')}
-
-
-
{eventName ? : }
-
{eventName || urlPath}
-
-
- );
- })}
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.module.css
deleted file mode 100644
index 4794803d2..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.module.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.data {
- display: flex;
- flex-direction: column;
- gap: 20px;
- position: relative;
-}
-
-.header {
- font-weight: bold;
- margin-bottom: 20px;
-}
-
-.empty {
- color: var(--font-color300);
- text-align: center;
-}
-
-.label {
- display: flex;
- align-items: center;
- justify-content: space-between;
-}
-
-.type {
- font-size: 11px;
- padding: 0 6px;
- border-radius: 4px;
- border: 1px solid var(--base400);
-}
-
-.name {
- color: var(--font-color200);
- font-weight: bold;
-}
-
-.value {
- margin: 5px 0;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx
deleted file mode 100644
index 56d4a0d91..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { TextOverflow } from 'react-basics';
-import { useMessages, useSessionData } from '@/components/hooks';
-import Empty from '@/components/common/Empty';
-import { DATA_TYPES } from '@/lib/constants';
-import styles from './SessionData.module.css';
-import { LoadingPanel } from '@/components/common/LoadingPanel';
-
-export function SessionData({ websiteId, sessionId }: { websiteId: string; sessionId: string }) {
- const { formatMessage, labels } = useMessages();
- const { data, ...query } = useSessionData(websiteId, sessionId);
-
- return (
- <>
- {formatMessage(labels.properties)}
-
- {!data?.length && }
- {data?.map(({ dataKey, dataType, stringValue }) => {
- return (
-
-
-
- {dataKey}
-
-
{DATA_TYPES[dataType]}
-
-
{stringValue}
-
- );
- })}
-
- >
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css
deleted file mode 100644
index 7058cd793..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css
+++ /dev/null
@@ -1,47 +0,0 @@
-.page {
- display: grid;
- grid-template-columns: max-content 1fr max-content;
- margin-bottom: 40px;
- position: relative;
-}
-
-.sidebar {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: flex-start;
- gap: 20px;
- width: 300px;
- padding-right: 20px;
- border-right: 1px solid var(--base300);
- position: relative;
-}
-
-.content {
- display: flex;
- flex-direction: column;
- gap: 30px;
- padding: 0 20px;
- position: relative;
-}
-
-.data {
- width: 300px;
- border-left: 1px solid var(--base300);
- padding-left: 20px;
- position: relative;
- transition: width 200ms ease-in-out;
-}
-
-@media screen and (max-width: 992px) {
- .page {
- grid-template-columns: 1fr;
- gap: 30px;
- }
-
- .sidebar,
- .data {
- border: 0;
- width: auto;
- }
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx
deleted file mode 100644
index 9ccf275f6..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-'use client';
-import Avatar from '@/components/common/Avatar';
-import { LoadingPanel } from '@/components/common/LoadingPanel';
-import { useWebsiteSession } from '@/components/hooks';
-import WebsiteHeader from '../../WebsiteHeader';
-import { SessionActivity } from './SessionActivity';
-import { SessionData } from './SessionData';
-import styles from './SessionDetailsPage.module.css';
-import SessionInfo from './SessionInfo';
-import { SessionStats } from './SessionStats';
-
-export default function SessionDetailsPage({
- websiteId,
- sessionId,
-}: {
- websiteId: string;
- sessionId: string;
-}) {
- const { data, ...query } = useWebsiteSession(websiteId, sessionId);
-
- return (
-
-
-
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css
deleted file mode 100644
index de6e796f7..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.info {
- display: grid;
- gap: 10px;
-}
-
-.info dl {
- width: 100%;
-}
-
-.info dt {
- color: var(--font-color200);
- font-weight: bold;
-}
-
-.info dd {
- display: flex;
- gap: 10px;
- align-items: center;
- margin: 5px 0 28px;
- text-align: left;
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx
deleted file mode 100644
index fc69494f8..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { useFormat, useLocale, useMessages, useRegionNames, useTimezone } from '@/components/hooks';
-import TypeIcon from '@/components/common/TypeIcon';
-import { Icon, CopyIcon } from 'react-basics';
-import Icons from '@/components/icons';
-import styles from './SessionInfo.module.css';
-
-export default function SessionInfo({ data }) {
- const { locale } = useLocale();
- const { formatTimezoneDate } = useTimezone();
- const { formatMessage, labels } = useMessages();
- const { formatValue } = useFormat();
- const { getRegionName } = useRegionNames(locale);
-
- return (
-
-
- ID
-
- {data?.id}
-
- {formatMessage(labels.distinctId)}
- {data?.distinctId}
- {formatMessage(labels.lastSeen)}
- {formatTimezoneDate(data?.lastAt, 'PPPPpp')}
-
- {formatMessage(labels.firstSeen)}
- {formatTimezoneDate(data?.firstAt, 'PPPPpp')}
-
- {formatMessage(labels.country)}
-
-
- {formatValue(data?.country, 'country')}
-
-
- {formatMessage(labels.region)}
-
-
-
-
- {getRegionName(data?.region)}
-
-
- {formatMessage(labels.city)}
-
-
-
-
- {data?.city}
-
-
- {formatMessage(labels.os)}
-
-
- {formatValue(data?.os, 'os')}
-
-
- {formatMessage(labels.device)}
-
-
- {formatValue(data?.device, 'device')}
-
-
- {formatMessage(labels.browser)}
-
-
- {formatValue(data?.browser, 'browser')}
-
-
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx
deleted file mode 100644
index eb385e9bb..000000000
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { useMessages } from '@/components/hooks';
-import MetricCard from '@/components/metrics/MetricCard';
-import MetricsBar from '@/components/metrics/MetricsBar';
-import { formatShortTime } from '@/lib/format';
-
-export function SessionStats({ data }) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
-
-
-
- `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`}
- />
-
- );
-}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx
index f4882880c..c9dff4b6f 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx
@@ -1,16 +1,16 @@
-import SessionDetailsPage from './SessionDetailsPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { SessionProfile } from '@/app/(main)/websites/[websiteId]/sessions/SessionProfile';
-export default async function WebsitePage({
+export default async function ({
params,
}: {
- params: { websiteId: string; sessionId: string };
+ params: Promise<{ websiteId: string; sessionId: string }>;
}) {
const { websiteId, sessionId } = await params;
- return ;
+ return ;
}
export const metadata: Metadata = {
- title: 'Websites',
+ title: 'Session',
};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/page.tsx b/src/app/(main)/websites/[websiteId]/sessions/page.tsx
index d1ff96f58..221ab71cc 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/page.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/page.tsx
@@ -1,7 +1,7 @@
-import SessionsPage from './SessionsPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { SessionsPage } from './SessionsPage';
-export default async function ({ params }: { params: { websiteId: string } }) {
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
const { websiteId } = await params;
return ;
diff --git a/src/app/(main)/websites/[websiteId]/settings/SettingsPage.tsx b/src/app/(main)/websites/[websiteId]/settings/SettingsPage.tsx
new file mode 100644
index 000000000..468f250d1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/SettingsPage.tsx
@@ -0,0 +1,6 @@
+'use client';
+import { WebsiteSettingsPage } from '@/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage';
+
+export function SettingsPage({ websiteId }: { websiteId: string }) {
+ return ;
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx
new file mode 100644
index 000000000..0c05c5819
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/ShareDeleteButton.tsx
@@ -0,0 +1,47 @@
+import { ConfirmationForm } from '@/components/common/ConfirmationForm';
+import { useDeleteQuery, useMessages, useModified } from '@/components/hooks';
+import { Trash } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+
+export function ShareDeleteButton({
+ shareId,
+ slug,
+ onSave,
+}: {
+ shareId: string;
+ slug: string;
+ onSave?: () => void;
+}) {
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, isPending, error } = useDeleteQuery(`/share/id/${shareId}`);
+ const { touch } = useModified();
+
+ const handleConfirm = async (close: () => void) => {
+ await mutateAsync(null, {
+ onSuccess: () => {
+ touch('shares');
+ onSave?.();
+ close();
+ },
+ });
+ };
+
+ return (
+ } title={t(labels.confirm)} variant="quiet" width="400px">
+ {({ close }) => (
+ {chunks} ,
+ })}
+ isLoading={isPending}
+ error={getErrorMessage(error)}
+ onConfirm={handleConfirm.bind(null, close)}
+ onClose={close}
+ buttonLabel={t(labels.delete)}
+ buttonVariant="danger"
+ />
+ )}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx
new file mode 100644
index 000000000..66664c5c1
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditButton.tsx
@@ -0,0 +1,16 @@
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { ShareEditForm } from './ShareEditForm';
+
+export function ShareEditButton({ shareId }: { shareId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } title={t(labels.share)} variant="quiet" width="600px">
+ {({ close }) => {
+ return ;
+ }}
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx
new file mode 100644
index 000000000..161d35733
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/ShareEditForm.tsx
@@ -0,0 +1,164 @@
+import {
+ Button,
+ Checkbox,
+ Column,
+ Form,
+ FormField,
+ FormSubmitButton,
+ Grid,
+ Label,
+ Loading,
+ Row,
+ Text,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { useApi, useConfig, useMessages, useModified } from '@/components/hooks';
+import { SHARE_NAV_ITEMS } from './constants';
+
+export function ShareEditForm({
+ shareId,
+ websiteId,
+ onSave,
+ onClose,
+}: {
+ shareId?: string;
+ websiteId?: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const { cloudMode } = useConfig();
+ const { get, post } = useApi();
+ const { touch } = useModified();
+ const { modified } = useModified('shares');
+ const [share, setShare] = useState(null);
+ const [isLoading, setIsLoading] = useState(!!shareId);
+ const [isPending, setIsPending] = useState(false);
+ const [error, setError] = useState(null);
+
+ const isEditing = !!shareId;
+
+ const getUrl = (slug: string) => {
+ return `${cloudMode ? process.env.cloudUrl : window?.location.origin}${process.env.basePath || ''}/share/${slug}`;
+ };
+
+ useEffect(() => {
+ if (!shareId) return;
+
+ const loadShare = async () => {
+ setIsLoading(true);
+ try {
+ const data = await get(`/share/id/${shareId}`);
+ setShare(data);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+ loadShare();
+ }, [shareId, modified]);
+
+ const handleSubmit = async (data: any) => {
+ const parameters: Record = {};
+ SHARE_NAV_ITEMS.forEach(section => {
+ section.items.forEach(item => {
+ parameters[item.id] = data[item.id] ?? false;
+ });
+ });
+
+ setIsPending(true);
+ setError(null);
+
+ try {
+ if (isEditing) {
+ await post(`/share/id/${shareId}`, {
+ name: data.name,
+ slug: share.slug,
+ parameters,
+ });
+ } else {
+ await post(`/websites/${websiteId}/shares`, {
+ name: data.name,
+ parameters,
+ });
+ }
+ touch('shares');
+ onSave?.();
+ onClose?.();
+ } catch (e) {
+ setError(e);
+ } finally {
+ setIsPending(false);
+ }
+ };
+
+ if (isLoading) {
+ return ;
+ }
+
+ const url = isEditing ? getUrl(share?.slug || '') : null;
+
+ // Build default values from share parameters
+ const defaultValues: Record = {
+ name: share?.name || '',
+ };
+ SHARE_NAV_ITEMS.forEach(section => {
+ section.items.forEach(item => {
+ const defaultSelected = item.id === 'overview' || item.id === 'events';
+ defaultValues[item.id] = share?.parameters?.[item.id] ?? defaultSelected;
+ });
+ });
+
+ // Get all item ids for validation
+ const allItemIds = SHARE_NAV_ITEMS.flatMap(section => section.items.map(item => item.id));
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx
new file mode 100644
index 000000000..f15661b2f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/SharesTable.tsx
@@ -0,0 +1,51 @@
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import { CopyButton } from '@/components/common/CopyButton';
+import { DateDistance } from '@/components/common/DateDistance';
+import { ExternalLink } from '@/components/common/ExternalLink';
+import { useConfig, useMessages, useMobile } from '@/components/hooks';
+import { ShareDeleteButton } from './ShareDeleteButton';
+import { ShareEditButton } from './ShareEditButton';
+
+export function SharesTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const { cloudMode } = useConfig();
+ const { isMobile } = useMobile();
+
+ const getUrl = (slug: string) => {
+ if (cloudMode) {
+ return `${process.env.cloudUrl}/share/${slug}`;
+ }
+ return `${window?.location.origin}${process.env.basePath || ''}/share/${slug}`;
+ };
+
+ return (
+
+
+ {({ name }: any) => name}
+
+
+ {({ slug }: any) => {
+ const url = getUrl(slug);
+ return (
+
+
+ {isMobile ? slug : url}
+
+
+
+ );
+ }}
+
+
+ {({ id, slug }: any) => {
+ return (
+
+
+
+
+ );
+ }}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx
new file mode 100644
index 000000000..daf39f8de
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx
@@ -0,0 +1,95 @@
+import { Button, Column, Dialog, DialogTrigger, Modal } from '@umami/react-zen';
+import { ActionForm } from '@/components/common/ActionForm';
+import {
+ useLoginQuery,
+ useMessages,
+ useModified,
+ useNavigation,
+ useUserTeamsQuery,
+} from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { WebsiteDeleteForm } from './WebsiteDeleteForm';
+import { WebsiteResetForm } from './WebsiteResetForm';
+import { WebsiteTransferForm } from './WebsiteTransferForm';
+
+export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
+ const { t, labels, messages } = useMessages();
+ const { user } = useLoginQuery();
+ const { touch } = useModified();
+ const { router, pathname, teamId, renderUrl } = useNavigation();
+ const { data: teams } = useUserTeamsQuery(user.id);
+ const isAdmin = pathname.startsWith('/admin');
+
+ const canTransferWebsite =
+ (
+ (!teamId &&
+ teams?.data?.filter(({ members }) =>
+ members.find(
+ ({ role, userId }) =>
+ [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id,
+ ),
+ )) ||
+ []
+ ).length > 0 ||
+ (teamId &&
+ !!teams?.data
+ ?.find(({ id }) => id === teamId)
+ ?.members.find(({ role, userId }) => role === ROLES.teamOwner && userId === user.id));
+
+ const handleSave = () => {
+ touch('websites');
+ onSave?.();
+ router.push(renderUrl(`/websites`));
+ };
+
+ const handleReset = async () => {
+ onSave?.();
+ };
+
+ return (
+
+ {!isAdmin && (
+
+
+ {t(labels.transfer)}
+
+
+ {({ close }) => (
+
+ )}
+
+
+
+
+ )}
+
+
+
+ {t(labels.reset)}
+
+
+ {({ close }) => (
+
+ )}
+
+
+
+
+
+
+
+
+ {t(labels.delete)}
+
+
+
+ {({ close }) => (
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteDeleteForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx
similarity index 54%
rename from src/app/(main)/settings/websites/[websiteId]/WebsiteDeleteForm.tsx
rename to src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx
index 5eef35442..fb450f478 100644
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteDeleteForm.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx
@@ -1,5 +1,5 @@
-import { useApi, useMessages } from '@/components/hooks';
-import TypeConfirmationForm from '@/components/common/TypeConfirmationForm';
+import { TypeConfirmationForm } from '@/components/common/TypeConfirmationForm';
+import { useDeleteQuery, useMessages } from '@/components/hooks';
const CONFIRM_VALUE = 'DELETE';
@@ -12,15 +12,14 @@ export function WebsiteDeleteForm({
onSave?: () => void;
onClose?: () => void;
}) {
- const { formatMessage, labels } = useMessages();
- const { del, useMutation } = useApi();
- const { mutate, isPending, error } = useMutation({
- mutationFn: () => del(`/websites/${websiteId}`),
- });
+ const { t, labels } = useMessages();
+ const { mutateAsync, isPending, error, touch } = useDeleteQuery(`/websites/${websiteId}`);
const handleConfirm = async () => {
- mutate(null, {
+ await mutateAsync(null, {
onSuccess: async () => {
+ touch('websites');
+ touch(`websites:${websiteId}`);
onSave?.();
onClose?.();
},
@@ -34,10 +33,8 @@ export function WebsiteDeleteForm({
onClose={onClose}
isLoading={isPending}
error={error}
- buttonLabel={formatMessage(labels.delete)}
+ buttonLabel={t(labels.delete)}
buttonVariant="danger"
/>
);
}
-
-export default WebsiteDeleteForm;
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx
new file mode 100644
index 000000000..63d370383
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx
@@ -0,0 +1,56 @@
+import { Form, FormButtons, FormField, FormSubmitButton, TextField } from '@umami/react-zen';
+import { useMessages, useUpdateQuery, useWebsite } from '@/components/hooks';
+import { DOMAIN_REGEX } from '@/lib/constants';
+
+export function WebsiteEditForm({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
+ const website = useWebsite();
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, touch, toast } = useUpdateQuery(`/websites/${websiteId}`);
+
+ const handleSubmit = async (data: any) => {
+ const { shareId, ...updateData } = data;
+ await mutateAsync(updateData, {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('websites');
+ touch(`website:${website.id}`);
+ onSave?.();
+ },
+ });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteReplaySettings.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteReplaySettings.tsx
new file mode 100644
index 000000000..d62a6d2ac
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteReplaySettings.tsx
@@ -0,0 +1,163 @@
+import {
+ Button,
+ Column,
+ Label,
+ ListItem,
+ Row,
+ Select,
+ Slider,
+ Switch,
+ Text,
+ TextField,
+} from '@umami/react-zen';
+import { useState } from 'react';
+import { EmptyPlaceholder } from '@/components/common/EmptyPlaceholder';
+import { useMessages, useSubscription, useUpdateQuery, useWebsite } from '@/components/hooks';
+import { Video } from '@/components/icons';
+
+const RECORDER_NAME = 'recorder.js';
+
+interface ReplayConfig {
+ sampleRate?: number;
+ maskLevel?: string;
+ maxDuration?: number;
+ blockSelector?: string;
+}
+
+export function WebsiteReplaySettings({ websiteId }: { websiteId: string }) {
+ const website = useWebsite();
+ const { t, labels, messages } = useMessages();
+ const { hasFeature, cloudMode } = useSubscription(website?.teamId);
+ const { mutateAsync, touch, toast, isPending } = useUpdateQuery(`/websites/${websiteId}`);
+ const [enabled, setEnabled] = useState(website?.replayEnabled ?? false);
+
+ const config = (website?.replayConfig as ReplayConfig) || {};
+
+ const [sampleRate, setSampleRate] = useState(config.sampleRate ?? 0.15);
+ const [maskLevel, setMaskLevel] = useState(config.maskLevel ?? 'moderate');
+ const [maxDuration, setMaxDuration] = useState(String(config.maxDuration ?? 300000));
+ const [blockSelector, setBlockSelector] = useState(config.blockSelector ?? '');
+
+ const recorderUrl = cloudMode
+ ? `${process.env.cloudUrl}/${RECORDER_NAME}`
+ : `${window?.location?.origin || ''}${process.env.basePath || ''}/${RECORDER_NAME}`;
+
+ let recorderAttrs = `data-website-id="${websiteId}" data-sample-rate="${sampleRate}" data-mask-level="${maskLevel}" data-max-duration="${parseInt(maxDuration, 10) || 300000}"`;
+ if (blockSelector) recorderAttrs += ` data-block-selector="${blockSelector}"`;
+ const recorderCode = ``;
+
+ const handleToggle = async (value: boolean) => {
+ const previous = enabled;
+ setEnabled(value);
+
+ try {
+ await mutateAsync(
+ {
+ replayEnabled: value,
+ },
+ {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('websites');
+ touch(`website:${websiteId}`);
+ },
+ },
+ );
+ } catch {
+ setEnabled(previous);
+ }
+ };
+
+ const handleSave = async () => {
+ await mutateAsync(
+ {
+ replayEnabled: enabled,
+ replayConfig: {
+ sampleRate,
+ maskLevel,
+ maxDuration: parseInt(maxDuration, 10) || 300000,
+ ...(blockSelector && { blockSelector }),
+ },
+ },
+ {
+ onSuccess: async () => {
+ toast(t(messages.saved));
+ touch('websites');
+ touch(`website:${websiteId}`);
+ },
+ },
+ );
+ };
+
+ if (cloudMode && !hasFeature('replays')) {
+ return (
+
+ {t(labels.replays)}
+ }
+ title={t(messages.upgradeRequired, { plan: 'Business' })}
+ description="Watch real user sessions to see exactly how visitors interact with your site."
+ >
+ window.open(`${process.env.cloudUrl}/settings/billing`, '_blank')}
+ >
+ {t(labels.upgrade)}
+
+
+
+ );
+ }
+
+ return (
+
+ {t(labels.replays)}
+
+ {t(labels.replayEnabled)}
+
+ {enabled && (
+ <>
+ {t(labels.replayCode)}
+ {t(messages.trackingCode)}
+
+ setSampleRate(Array.isArray(v) ? v[0] : v)}
+ showValue
+ formatOptions={{ style: 'percent', maximumFractionDigits: 0 }}
+ style={{ maxWidth: '360px' }}
+ />
+
+ {t(labels.maskLevel)}
+
+ strict
+ moderate
+
+
+
+ {t(labels.maxDuration)}
+
+ 5 minutes
+ 10 minutes
+ 15 minutes
+ 20 minutes
+
+
+
+ {t(labels.blockSelector)}
+
+
+
+
+ {t(labels.save)}
+
+
+ >
+ )}
+
+ );
+}
diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteResetForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx
similarity index 52%
rename from src/app/(main)/settings/websites/[websiteId]/WebsiteResetForm.tsx
rename to src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx
index 73886aa92..72a308eb0 100644
--- a/src/app/(main)/settings/websites/[websiteId]/WebsiteResetForm.tsx
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx
@@ -1,5 +1,5 @@
-import { useApi, useMessages } from '@/components/hooks';
-import TypeConfirmationForm from '@/components/common/TypeConfirmationForm';
+import { TypeConfirmationForm } from '@/components/common/TypeConfirmationForm';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
const CONFIRM_VALUE = 'RESET';
@@ -12,14 +12,11 @@ export function WebsiteResetForm({
onSave?: () => void;
onClose?: () => void;
}) {
- const { formatMessage, labels } = useMessages();
- const { post, useMutation } = useApi();
- const { mutate, isPending, error } = useMutation({
- mutationFn: (data: any) => post(`/websites/${websiteId}/reset`, data),
- });
+ const { t, labels } = useMessages();
+ const { mutateAsync, isPending, error } = useUpdateQuery(`/websites/${websiteId}/reset`);
const handleConfirm = async () => {
- mutate(null, {
+ await mutateAsync(null, {
onSuccess: async () => {
onSave?.();
onClose?.();
@@ -34,9 +31,7 @@ export function WebsiteResetForm({
onClose={onClose}
isLoading={isPending}
error={error}
- buttonLabel={formatMessage(labels.reset)}
+ buttonLabel={t(labels.reset)}
/>
);
}
-
-export default WebsiteResetForm;
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx
new file mode 100644
index 000000000..a6f078067
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx
@@ -0,0 +1,29 @@
+import { Column } from '@umami/react-zen';
+import { Panel } from '@/components/common/Panel';
+import { WebsiteData } from './WebsiteData';
+import { WebsiteEditForm } from './WebsiteEditForm';
+import { WebsiteReplaySettings } from './WebsiteReplaySettings';
+import { WebsiteShareForm } from './WebsiteShareForm';
+import { WebsiteTrackingCode } from './WebsiteTrackingCode';
+
+export function WebsiteSettings({ websiteId }: { websiteId: string; openExternal?: boolean }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx
new file mode 100644
index 000000000..ec9eb0b81
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx
@@ -0,0 +1,23 @@
+import { Row } from '@umami/react-zen';
+import Link from 'next/link';
+import { IconLabel } from '@/components/common/IconLabel';
+import { PageHeader } from '@/components/common/PageHeader';
+import { useMessages, useNavigation, useWebsite } from '@/components/hooks';
+import { ArrowLeft, Globe } from '@/components/icons';
+
+export function WebsiteSettingsHeader() {
+ const website = useWebsite();
+ const { t, labels } = useMessages();
+ const { renderUrl } = useNavigation();
+
+ return (
+ <>
+
+
+ } label={t(labels.website)} />
+
+
+ } />
+ >
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx
new file mode 100644
index 000000000..57b52cfb7
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx
@@ -0,0 +1,47 @@
+import { Column, Heading, Row, Text } from '@umami/react-zen';
+import { Plus } from 'lucide-react';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useWebsiteSharesQuery } from '@/components/hooks';
+import { DialogButton } from '@/components/input/DialogButton';
+import { ShareEditForm } from './ShareEditForm';
+import { SharesTable } from './SharesTable';
+
+export interface WebsiteShareFormProps {
+ websiteId: string;
+}
+
+export function WebsiteShareForm({ websiteId }: WebsiteShareFormProps) {
+ const { t, labels, messages } = useMessages();
+ const { data, error, isLoading } = useWebsiteSharesQuery({ websiteId });
+
+ const shares = data?.data || [];
+ const hasShares = shares.length > 0;
+
+ return (
+
+
+
+ {t(labels.share)}
+ }
+ label={t(labels.add)}
+ title={t(labels.share)}
+ variant="primary"
+ width="600px"
+ >
+ {({ close }) => }
+
+
+ {hasShares ? (
+ <>
+ {t(messages.shareUrl)}
+
+
+ >
+ ) : (
+ {t(messages.noDataAvailable)}
+ )}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx
new file mode 100644
index 000000000..9deb93f7f
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx
@@ -0,0 +1,40 @@
+import { Column, Label, Text, TextField } from '@umami/react-zen';
+import { useConfig, useMessages } from '@/components/hooks';
+
+const SCRIPT_NAME = 'script.js';
+
+export function WebsiteTrackingCode({
+ websiteId,
+ hostUrl,
+}: {
+ websiteId: string;
+ hostUrl?: string;
+}) {
+ const { t, messages, labels } = useMessages();
+ const config = useConfig();
+
+ const trackerScriptName =
+ config?.trackerScriptName?.split(',')?.map((n: string) => n.trim())?.[0] || SCRIPT_NAME;
+
+ const getUrl = (scriptName: string) => {
+ if (config?.cloudMode) {
+ return `${process.env.cloudUrl}/${scriptName}`;
+ }
+
+ return `${hostUrl || window?.location?.origin || ''}${
+ process.env.basePath || ''
+ }/${scriptName}`;
+ };
+
+ const url = trackerScriptName?.startsWith('http') ? trackerScriptName : getUrl(trackerScriptName);
+
+ const code = ``;
+
+ return (
+
+ {t(labels.trackingCode)}
+ {t(messages.trackingCode)}
+
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx
new file mode 100644
index 000000000..ce54f8199
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx
@@ -0,0 +1,100 @@
+import {
+ Button,
+ Form,
+ FormButtons,
+ FormField,
+ FormSubmitButton,
+ ListItem,
+ Loading,
+ Select,
+ Text,
+} from '@umami/react-zen';
+import { type Key, useState } from 'react';
+import {
+ useLoginQuery,
+ useMessages,
+ useUpdateQuery,
+ useUserTeamsQuery,
+ useWebsite,
+} from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+
+export function WebsiteTransferForm({
+ websiteId,
+ onSave,
+ onClose,
+}: {
+ websiteId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { user } = useLoginQuery();
+ const website = useWebsite();
+ const [teamId, setTeamId] = useState(null);
+ const { t, labels, messages, getErrorMessage } = useMessages();
+ const { mutateAsync, error, isPending } = useUpdateQuery(`/websites/${websiteId}/transfer`);
+ const { data: teams, isLoading } = useUserTeamsQuery(user.id);
+ const isTeamWebsite = !!website?.teamId;
+
+ const items =
+ teams?.data?.filter(({ members }) =>
+ members.some(
+ ({ role, userId }) =>
+ [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id,
+ ),
+ ) || [];
+
+ const handleSubmit = async () => {
+ await mutateAsync(
+ {
+ userId: website.teamId ? user.id : undefined,
+ teamId: website.userId ? teamId : undefined,
+ },
+ {
+ onSuccess: async () => {
+ onSave?.();
+ onClose?.();
+ },
+ },
+ );
+ };
+
+ const handleChange = (key: Key) => {
+ setTeamId(key as string);
+ };
+
+ if (isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/settings/constants.ts b/src/app/(main)/websites/[websiteId]/settings/constants.ts
new file mode 100644
index 000000000..dc75084e8
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/constants.ts
@@ -0,0 +1,31 @@
+export const SHARE_NAV_ITEMS = [
+ {
+ section: 'traffic',
+ items: [
+ { id: 'overview', label: 'overview' },
+ { id: 'events', label: 'events' },
+ { id: 'sessions', label: 'sessions' },
+ { id: 'realtime', label: 'realtime' },
+ { id: 'performance', label: 'performance' },
+ { id: 'compare', label: 'compare' },
+ { id: 'breakdown', label: 'breakdown' },
+ ],
+ },
+ {
+ section: 'behavior',
+ items: [
+ { id: 'goals', label: 'goals' },
+ { id: 'funnels', label: 'funnels' },
+ { id: 'journeys', label: 'journeys' },
+ { id: 'retention', label: 'retention' },
+ ],
+ },
+ {
+ section: 'growth',
+ items: [
+ { id: 'utm', label: 'utm' },
+ { id: 'revenue', label: 'revenue' },
+ { id: 'attribution', label: 'attribution' },
+ ],
+ },
+];
diff --git a/src/app/(main)/websites/[websiteId]/settings/page.tsx b/src/app/(main)/websites/[websiteId]/settings/page.tsx
new file mode 100644
index 000000000..a26d14f72
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/page.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from 'next';
+import { SettingsPage } from './SettingsPage';
+
+export default async function ({ params }: { params: Promise<{ websiteId: string }> }) {
+ const { websiteId } = await params;
+
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Settings',
+};
diff --git a/src/app/(main)/websites/page.tsx b/src/app/(main)/websites/page.tsx
index 859516c9d..cefaf8096 100644
--- a/src/app/(main)/websites/page.tsx
+++ b/src/app/(main)/websites/page.tsx
@@ -1,5 +1,5 @@
-import WebsitesPage from './WebsitesPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { WebsitesPage } from './WebsitesPage';
export default function () {
return ;
diff --git a/src/app/Providers.tsx b/src/app/Providers.tsx
index 66884c2fc..049f6a2f1 100644
--- a/src/app/Providers.tsx
+++ b/src/app/Providers.tsx
@@ -1,17 +1,19 @@
'use client';
-import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
-import { ReactBasicsProvider } from 'react-basics';
-import ErrorBoundary from '@/components/common/ErrorBoundary';
+import { RouterProvider, ZenProvider } from '@umami/react-zen';
+import { useRouter } from 'next/navigation';
+import { NextIntlClientProvider } from 'next-intl';
+import { useEffect } from 'react';
+import { ErrorBoundary } from '@/components/common/ErrorBoundary';
import { useLocale } from '@/components/hooks';
import 'chartjs-adapter-date-fns';
-import { useEffect } from 'react';
const client = new QueryClient({
defaultOptions: {
queries: {
retry: false,
refetchOnWindowFocus: false,
+ staleTime: 1000 * 60,
},
},
});
@@ -25,22 +27,36 @@ function MessagesProvider({ children }) {
}, [locale, dir]);
return (
- null}>
+ null}>
{children}
-
+
);
}
export function Providers({ children }) {
+ const router = useRouter();
+
+ function navigate(url: string) {
+ if (shouldUseNativeLink(url)) {
+ window.location.href = url;
+ } else {
+ router.push(url);
+ }
+ }
+
+ function shouldUseNativeLink(url: string) {
+ return url.startsWith('http');
+ }
+
return (
-
-
-
- {children}
-
-
-
+
+
+
+
+ {children}
+
+
+
+
);
}
-
-export default Providers;
diff --git a/src/app/actions/getConfig.ts b/src/app/actions/getConfig.ts
deleted file mode 100644
index 32b8a7d09..000000000
--- a/src/app/actions/getConfig.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-'use server';
-
-export type Config = {
- faviconUrl: string | undefined;
- privateMode: boolean;
- telemetryDisabled: boolean;
- trackerScriptName: string | undefined;
- updatesDisabled: boolean;
-};
-
-export async function getConfig(): Promise {
- return {
- faviconUrl: process.env.FAVICON_URL,
- privateMode: !!process.env.PRIVATE_MODE,
- telemetryDisabled: !!process.env.DISABLE_TELEMETRY,
- trackerScriptName: process.env.TRACKER_SCRIPT_NAME,
- updatesDisabled: !!process.env.DISABLE_UPDATES,
- };
-}
diff --git a/src/app/api/admin/teams/route.ts b/src/app/api/admin/teams/route.ts
new file mode 100644
index 000000000..ceb16ab11
--- /dev/null
+++ b/src/app/api/admin/teams/route.ts
@@ -0,0 +1,58 @@
+import { z } from 'zod';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewAllTeams } from '@/permissions';
+import { getTeams } from '@/queries/prisma/team';
+
+export async function GET(request: Request) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ if (!(await canViewAllTeams(auth))) {
+ return unauthorized();
+ }
+
+ const teams = await getTeams(
+ {
+ include: {
+ members: {
+ include: {
+ user: {
+ select: {
+ id: true,
+ username: true,
+ },
+ },
+ },
+ },
+ _count: {
+ select: {
+ websites: {
+ where: { deletedAt: null },
+ },
+ members: {
+ where: {
+ user: { deletedAt: null },
+ },
+ },
+ },
+ },
+ },
+ orderBy: {
+ createdAt: 'desc',
+ },
+ },
+ query,
+ );
+
+ return json(teams);
+}
diff --git a/src/app/api/admin/users/route.ts b/src/app/api/admin/users/route.ts
index 2185e03e7..2e5226157 100644
--- a/src/app/api/admin/users/route.ts
+++ b/src/app/api/admin/users/route.ts
@@ -1,13 +1,14 @@
import { z } from 'zod';
import { parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
-import { pagingParams } from '@/lib/schema';
-import { canViewUsers } from '@/lib/auth';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewUsers } from '@/permissions';
import { getUsers } from '@/queries/prisma/user';
export async function GET(request: Request) {
const schema = z.object({
...pagingParams,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -25,12 +26,18 @@ export async function GET(request: Request) {
include: {
_count: {
select: {
- websiteUser: {
+ websites: {
where: { deletedAt: null },
},
},
},
},
+ omit: {
+ password: true,
+ },
+ orderBy: {
+ createdAt: 'desc',
+ },
},
query,
);
diff --git a/src/app/api/admin/websites/route.ts b/src/app/api/admin/websites/route.ts
index 3f35ea49d..09b2ef98d 100644
--- a/src/app/api/admin/websites/route.ts
+++ b/src/app/api/admin/websites/route.ts
@@ -1,17 +1,15 @@
import { z } from 'zod';
+import { ROLES } from '@/lib/constants';
import { parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
-import { pagingParams } from '@/lib/schema';
-import { canViewAllWebsites } from '@/lib/auth';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewAllWebsites } from '@/permissions';
import { getWebsites } from '@/queries/prisma/website';
-import { ROLES } from '@/lib/constants';
export async function GET(request: Request) {
const schema = z.object({
- userId: z.string().uuid(),
- includeOwnedTeams: z.string().optional(),
- includeAllTeams: z.string().optional(),
...pagingParams,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -24,46 +22,13 @@ export async function GET(request: Request) {
return unauthorized();
}
- const { userId, includeOwnedTeams, includeAllTeams } = query;
-
const websites = await getWebsites(
{
- where: {
- OR: [
- ...(userId && [{ userId }]),
- ...(userId && includeOwnedTeams
- ? [
- {
- team: {
- deletedAt: null,
- teamUser: {
- some: {
- role: ROLES.teamOwner,
- userId,
- },
- },
- },
- },
- ]
- : []),
- ...(userId && includeAllTeams
- ? [
- {
- team: {
- deletedAt: null,
- teamUser: {
- some: {
- userId,
- },
- },
- },
- },
- ]
- : []),
- ],
- },
include: {
user: {
+ where: {
+ deletedAt: null,
+ },
select: {
username: true,
id: true,
@@ -74,7 +39,7 @@ export async function GET(request: Request) {
deletedAt: null,
},
include: {
- teamUser: {
+ members: {
where: {
role: ROLES.teamOwner,
},
@@ -82,6 +47,9 @@ export async function GET(request: Request) {
},
},
},
+ orderBy: {
+ createdAt: 'desc',
+ },
},
query,
);
diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts
index bfac55489..17ca2f7d9 100644
--- a/src/app/api/auth/login/route.ts
+++ b/src/app/api/auth/login/route.ts
@@ -1,13 +1,13 @@
import { z } from 'zod';
-import { checkPassword } from '@/lib/auth';
-import { createSecureToken } from '@/lib/jwt';
-import redis from '@/lib/redis';
-import { getUserByUsername } from '@/queries';
-import { json, unauthorized } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
import { saveAuth } from '@/lib/auth';
-import { secret } from '@/lib/crypto';
import { ROLES } from '@/lib/constants';
+import { secret } from '@/lib/crypto';
+import { createSecureToken } from '@/lib/jwt';
+import { checkPassword } from '@/lib/password';
+import redis from '@/lib/redis';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { getAllUserTeams, getUserByUsername } from '@/queries/prisma';
export async function POST(request: Request) {
const schema = z.object({
@@ -26,7 +26,7 @@ export async function POST(request: Request) {
const user = await getUserByUsername(username, { includePassword: true });
if (!user || !checkPassword(password, user.password)) {
- return unauthorized('message.incorrect-username-password');
+ return unauthorized({ code: 'incorrect-username-password' });
}
const { id, role, createdAt } = user;
@@ -39,8 +39,10 @@ export async function POST(request: Request) {
token = createSecureToken({ userId: user.id, role }, secret());
}
+ const teams = await getAllUserTeams(id);
+
return json({
token,
- user: { id, username, role, createdAt, isAdmin: role === ROLES.admin },
+ user: { id, username, role, createdAt, isAdmin: role === ROLES.admin, teams },
});
}
diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts
index 7bf0a8137..153f1f523 100644
--- a/src/app/api/auth/logout/route.ts
+++ b/src/app/api/auth/logout/route.ts
@@ -1,7 +1,14 @@
import redis from '@/lib/redis';
+import { parseRequest } from '@/lib/request';
import { ok } from '@/lib/response';
export async function POST(request: Request) {
+ const { error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
if (redis.enabled) {
const token = request.headers.get('authorization')?.split(' ')?.[1];
diff --git a/src/app/api/auth/sso/route.ts b/src/app/api/auth/sso/route.ts
index fc8fb9bf3..f82228695 100644
--- a/src/app/api/auth/sso/route.ts
+++ b/src/app/api/auth/sso/route.ts
@@ -1,7 +1,7 @@
-import redis from '@/lib/redis';
-import { json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
import { saveAuth } from '@/lib/auth';
+import redis from '@/lib/redis';
+import { parseRequest } from '@/lib/request';
+import { json, serverError } from '@/lib/response';
export async function POST(request: Request) {
const { auth, error } = await parseRequest(request);
@@ -10,9 +10,13 @@ export async function POST(request: Request) {
return error();
}
- if (redis.enabled) {
- const token = await saveAuth({ userId: auth.user.id }, 86400);
-
- return json({ user: auth.user, token });
+ if (!redis.enabled) {
+ return serverError({
+ message: 'Redis is disabled',
+ });
}
+
+ const token = await saveAuth({ userId: auth.user.id }, 86400);
+
+ return json({ user: auth.user, token });
}
diff --git a/src/app/api/auth/verify/route.ts b/src/app/api/auth/verify/route.ts
index 5f8543a55..526e8c9f8 100644
--- a/src/app/api/auth/verify/route.ts
+++ b/src/app/api/auth/verify/route.ts
@@ -1,5 +1,7 @@
+import { fetchAccount, fetchTeam } from '@/lib/load';
import { parseRequest } from '@/lib/request';
import { json } from '@/lib/response';
+import { getAllUserTeams } from '@/queries/prisma';
export async function POST(request: Request) {
const { auth, error } = await parseRequest(request);
@@ -8,5 +10,40 @@ export async function POST(request: Request) {
return error();
}
- return json(auth.user);
+ const user = { ...auth.user };
+ const teams = await getAllUserTeams(user.id);
+
+ if (process.env.CLOUD_MODE) {
+ const account = await fetchAccount(user.id);
+
+ if (account) {
+ user.subscription = {
+ isPro: account.isPro || false,
+ isBusiness: account.isBusiness || false,
+ isNoBilling: account.isNoBilling || false,
+ hasSubscription: account.hasSubscription || false,
+ };
+ }
+
+ const teamsWithSubscription = await Promise.all(
+ teams.map(async (team: any) => {
+ const teamAccount = await fetchTeam(team.id);
+ return {
+ ...team,
+ subscription: teamAccount
+ ? {
+ isPro: teamAccount.isPro || false,
+ isBusiness: teamAccount.isBusiness || false,
+ isNoBilling: teamAccount.isNoBilling || false,
+ hasSubscription: teamAccount.hasSubscription || false,
+ }
+ : null,
+ };
+ }),
+ );
+
+ return json({ ...user, teams: teamsWithSubscription });
+ }
+
+ return json({ ...user, teams });
}
diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts
index 87e04110d..46e8b3c33 100644
--- a/src/app/api/batch/route.ts
+++ b/src/app/api/batch/route.ts
@@ -2,8 +2,9 @@ import { z } from 'zod';
import * as send from '@/app/api/send/route';
import { parseRequest } from '@/lib/request';
import { json, serverError } from '@/lib/response';
+import { anyObjectParam } from '@/lib/schema';
-const schema = z.array(z.object({}).passthrough());
+const schema = z.array(anyObjectParam);
export async function POST(request: Request) {
try {
@@ -16,12 +17,29 @@ export async function POST(request: Request) {
const errors = [];
let index = 0;
+ let cache = null;
for (const data of body) {
- const newRequest = new Request(request, { body: JSON.stringify(data) });
+ // Recreate a fresh Request since `new Request(request)` will have the following error:
+ // > Cannot read private member #state from an object whose class did not declare it
+
+ // Copy headers we received, ensure JSON content type, and avoid conflicting content-length
+ const headers = new Headers(request.headers);
+ headers.set('content-type', 'application/json');
+ headers.delete('content-length');
+
+ const newRequest = new Request(request.url, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(data),
+ });
+
const response = await send.POST(newRequest);
+ const responseJson = await response.json();
if (!response.ok) {
- errors.push({ index, response: await response.json() });
+ errors.push({ index, response: responseJson });
+ } else {
+ cache ??= responseJson.cache;
}
index++;
@@ -32,6 +50,7 @@ export async function POST(request: Request) {
processed: body.length - errors.length,
errors: errors.length,
details: errors,
+ cache,
});
} catch (e) {
return serverError(e);
diff --git a/src/app/api/boards/[boardId]/route.ts b/src/app/api/boards/[boardId]/route.ts
new file mode 100644
index 000000000..8d7a23aeb
--- /dev/null
+++ b/src/app/api/boards/[boardId]/route.ts
@@ -0,0 +1,85 @@
+import { z } from 'zod';
+import { BOARD_TYPES, normalizeBoardType } from '@/lib/boards';
+import { parseRequest } from '@/lib/request';
+import { json, ok, serverError, unauthorized } from '@/lib/response';
+import { canDeleteBoard, canUpdateBoard, canViewBoard } from '@/permissions';
+import { deleteBoard, getBoard, updateBoard } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ boardId: string }> }) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { boardId } = await params;
+
+ if (!(await canViewBoard(auth, boardId))) {
+ return unauthorized();
+ }
+
+ const board = await getBoard(boardId);
+
+ return json(board);
+}
+
+export async function POST(request: Request, { params }: { params: Promise<{ boardId: string }> }) {
+ const schema = z.object({
+ type: z
+ .enum([
+ BOARD_TYPES.dashboard,
+ BOARD_TYPES.mixed,
+ BOARD_TYPES.website,
+ BOARD_TYPES.pixel,
+ BOARD_TYPES.link,
+ ])
+ .or(z.literal('open'))
+ .optional(),
+ name: z.string().optional(),
+ description: z.string().optional(),
+ parameters: z.object({}).passthrough().optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { boardId } = await params;
+ const { name, description, parameters } = body;
+ const type = normalizeBoardType(body.type);
+
+ if (!(await canUpdateBoard(auth, boardId))) {
+ return unauthorized();
+ }
+
+ try {
+ const board = await updateBoard(boardId, { type, name, description, parameters });
+
+ return Response.json(board);
+ } catch (e: any) {
+ return serverError(e);
+ }
+}
+
+export async function DELETE(
+ request: Request,
+ { params }: { params: Promise<{ boardId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { boardId } = await params;
+
+ if (!(await canDeleteBoard(auth, boardId))) {
+ return unauthorized();
+ }
+
+ await deleteBoard(boardId);
+
+ return ok();
+}
diff --git a/src/app/api/boards/[boardId]/shares/route.ts b/src/app/api/boards/[boardId]/shares/route.ts
new file mode 100644
index 000000000..f8adeff10
--- /dev/null
+++ b/src/app/api/boards/[boardId]/shares/route.ts
@@ -0,0 +1,73 @@
+import { z } from 'zod';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { uuid } from '@/lib/crypto';
+import { getRandomChars } from '@/lib/generate';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams } from '@/lib/schema';
+import { canUpdateBoard, canViewBoard } from '@/permissions';
+import { createShare, getSharesByEntityId } from '@/queries/prisma';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ boardId: string }> },
+) {
+ const schema = z.object({
+ ...filterParams,
+ ...pagingParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { boardId } = await params;
+ const { page, pageSize, search } = query;
+
+ if (!(await canViewBoard(auth, boardId))) {
+ return unauthorized();
+ }
+
+ const data = await getSharesByEntityId(boardId, {
+ page,
+ pageSize,
+ search,
+ });
+
+ return json(data);
+}
+
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ boardId: string }> },
+) {
+ const schema = z.object({
+ name: z.string().max(200),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { boardId } = await params;
+ const { name } = body;
+
+ if (!(await canUpdateBoard(auth, boardId))) {
+ return unauthorized();
+ }
+
+ const share = await createShare({
+ id: uuid(),
+ entityId: boardId,
+ shareType: ENTITY_TYPE.board,
+ name,
+ slug: getRandomChars(16),
+ parameters: {},
+ });
+
+ return json(share);
+}
diff --git a/src/app/api/boards/route.ts b/src/app/api/boards/route.ts
new file mode 100644
index 000000000..bb0710370
--- /dev/null
+++ b/src/app/api/boards/route.ts
@@ -0,0 +1,71 @@
+import { z } from 'zod';
+import { BOARD_TYPES, normalizeBoardType } from '@/lib/boards';
+import { uuid } from '@/lib/crypto';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions';
+import { createBoard, getUserBoards } from '@/queries/prisma';
+
+export async function GET(request: Request) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const boards = await getUserBoards(auth.user.id, filters);
+
+ return json(boards);
+}
+
+export async function POST(request: Request) {
+ const schema = z.object({
+ type: z
+ .enum([BOARD_TYPES.mixed, BOARD_TYPES.website, BOARD_TYPES.pixel, BOARD_TYPES.link])
+ .or(z.literal('open')),
+ name: z.string().max(100),
+ description: z.string().max(500).optional(),
+ userId: z.uuid().nullable().optional(),
+ teamId: z.uuid().nullable().optional(),
+ parameters: z
+ .object({
+ websiteId: z.uuid().optional(),
+ pixelId: z.uuid().optional(),
+ linkId: z.uuid().optional(),
+ })
+ .passthrough()
+ .optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { teamId } = body;
+
+ if ((teamId && !(await canCreateTeamWebsite(auth, teamId))) || !(await canCreateWebsite(auth))) {
+ return unauthorized();
+ }
+
+ const data = {
+ ...body,
+ type: normalizeBoardType(body.type),
+ id: uuid(),
+ parameters: body.parameters ?? {},
+ userId: !teamId ? auth.user.id : undefined,
+ };
+
+ const result = await createBoard(data);
+
+ return json(result);
+}
diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts
new file mode 100644
index 000000000..101a12243
--- /dev/null
+++ b/src/app/api/config/route.ts
@@ -0,0 +1,22 @@
+import { parseRequest } from '@/lib/request';
+import { json } from '@/lib/response';
+
+export async function GET(request: Request) {
+ const { error } = await parseRequest(request, null, { skipAuth: true });
+
+ if (error) {
+ return error();
+ }
+
+ return json({
+ cloudMode: !!process.env.CLOUD_MODE,
+ faviconUrl: process.env.FAVICON_URL,
+ linksUrl: process.env.LINKS_URL,
+ pixelsUrl: process.env.PIXELS_URL,
+ privateMode: !!process.env.PRIVATE_MODE,
+ telemetryDisabled: !!process.env.DISABLE_TELEMETRY,
+ trackerScriptName: process.env.TRACKER_SCRIPT_NAME,
+ updatesDisabled: !!process.env.DISABLE_UPDATES,
+ currentVersion: !!process.env.currentVersion,
+ });
+}
diff --git a/src/app/api/dashboard/route.ts b/src/app/api/dashboard/route.ts
new file mode 100644
index 000000000..880057181
--- /dev/null
+++ b/src/app/api/dashboard/route.ts
@@ -0,0 +1,62 @@
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { createBoard, getBoard, updateBoard } from '@/queries/prisma';
+import { z } from 'zod';
+
+export async function GET(request: Request) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const board = await getBoard(auth.user.id);
+
+ if (board && board.userId !== auth.user.id) {
+ return unauthorized();
+ }
+
+ return json(board);
+}
+
+export async function POST(request: Request) {
+ const schema = z.object({
+ name: z.string().optional(),
+ description: z.string().optional(),
+ parameters: z.object({}).passthrough().optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const userId = auth.user.id;
+ const existing = await getBoard(userId);
+
+ if (existing && existing.userId !== userId) {
+ return unauthorized();
+ }
+
+ const data = {
+ name: body.name,
+ description: body.description,
+ parameters: body.parameters ?? {},
+ };
+
+ if (existing) {
+ const result = await updateBoard(userId, data);
+
+ return json(result);
+ }
+
+ const result = await createBoard({
+ id: userId,
+ type: 'dashboard',
+ userId,
+ ...data,
+ });
+
+ return json(result);
+}
diff --git a/src/app/api/links/[linkId]/route.ts b/src/app/api/links/[linkId]/route.ts
new file mode 100644
index 000000000..92f572c43
--- /dev/null
+++ b/src/app/api/links/[linkId]/route.ts
@@ -0,0 +1,77 @@
+import { z } from 'zod';
+import { parseRequest } from '@/lib/request';
+import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response';
+import { canDeleteLink, canUpdateLink, canViewLink } from '@/permissions';
+import { deleteLink, getLink, updateLink } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ linkId: string }> }) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { linkId } = await params;
+
+ if (!(await canViewLink(auth, linkId))) {
+ return unauthorized();
+ }
+
+ const website = await getLink(linkId);
+
+ return json(website);
+}
+
+export async function POST(request: Request, { params }: { params: Promise<{ linkId: string }> }) {
+ const schema = z.object({
+ name: z.string().optional(),
+ url: z.string().optional(),
+ slug: z.string().min(8).optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { linkId } = await params;
+ const { name, url, slug } = body;
+
+ if (!(await canUpdateLink(auth, linkId))) {
+ return unauthorized();
+ }
+
+ try {
+ const result = await updateLink(linkId, { name, url, slug });
+
+ return Response.json(result);
+ } catch (e: any) {
+ if (e.message.toLowerCase().includes('unique constraint') && e.message.includes('slug')) {
+ return badRequest({ message: 'That slug is already taken.' });
+ }
+
+ return serverError(e);
+ }
+}
+
+export async function DELETE(
+ request: Request,
+ { params }: { params: Promise<{ linkId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { linkId } = await params;
+
+ if (!(await canDeleteLink(auth, linkId))) {
+ return unauthorized();
+ }
+
+ await deleteLink(linkId);
+
+ return ok();
+}
diff --git a/src/app/api/links/[linkId]/shares/route.ts b/src/app/api/links/[linkId]/shares/route.ts
new file mode 100644
index 000000000..0ed8516e6
--- /dev/null
+++ b/src/app/api/links/[linkId]/shares/route.ts
@@ -0,0 +1,73 @@
+import { z } from 'zod';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { uuid } from '@/lib/crypto';
+import { getRandomChars } from '@/lib/generate';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams } from '@/lib/schema';
+import { canUpdateLink, canViewLink } from '@/permissions';
+import { createShare, getSharesByEntityId } from '@/queries/prisma';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ linkId: string }> },
+) {
+ const schema = z.object({
+ ...filterParams,
+ ...pagingParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { linkId } = await params;
+ const { page, pageSize, search } = query;
+
+ if (!(await canViewLink(auth, linkId))) {
+ return unauthorized();
+ }
+
+ const data = await getSharesByEntityId(linkId, {
+ page,
+ pageSize,
+ search,
+ });
+
+ return json(data);
+}
+
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ linkId: string }> },
+) {
+ const schema = z.object({
+ name: z.string().max(200),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { linkId } = await params;
+ const { name } = body;
+
+ if (!(await canUpdateLink(auth, linkId))) {
+ return unauthorized();
+ }
+
+ const share = await createShare({
+ id: uuid(),
+ entityId: linkId,
+ shareType: ENTITY_TYPE.link,
+ name,
+ slug: getRandomChars(16),
+ parameters: {},
+ });
+
+ return json(share);
+}
diff --git a/src/app/api/links/route.ts b/src/app/api/links/route.ts
new file mode 100644
index 000000000..a639888bd
--- /dev/null
+++ b/src/app/api/links/route.ts
@@ -0,0 +1,64 @@
+import { z } from 'zod';
+import { uuid } from '@/lib/crypto';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions';
+import { createLink, getUserLinks } from '@/queries/prisma';
+
+export async function GET(request: Request) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const links = await getUserLinks(auth.user.id, filters);
+
+ return json(links);
+}
+
+export async function POST(request: Request) {
+ const schema = z.object({
+ name: z.string().max(100),
+ url: z.string().max(500),
+ slug: z.string().max(100),
+ teamId: z.string().nullable().optional(),
+ id: z.uuid().nullable().optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { id, name, url, slug, teamId } = body;
+
+ if ((teamId && !(await canCreateTeamWebsite(auth, teamId))) || !(await canCreateWebsite(auth))) {
+ return unauthorized();
+ }
+
+ const data: any = {
+ id: id ?? uuid(),
+ name,
+ url,
+ slug,
+ teamId,
+ };
+
+ if (!teamId) {
+ data.userId = auth.user.id;
+ }
+
+ const result = await createLink(data);
+
+ return json(result);
+}
diff --git a/src/app/api/me/password/route.ts b/src/app/api/me/password/route.ts
index 69bef49b3..24c737053 100644
--- a/src/app/api/me/password/route.ts
+++ b/src/app/api/me/password/route.ts
@@ -1,7 +1,7 @@
import { z } from 'zod';
-import { checkPassword, hashPassword } from '@/lib/auth';
+import { checkPassword, hashPassword } from '@/lib/password';
import { parseRequest } from '@/lib/request';
-import { json, badRequest } from '@/lib/response';
+import { badRequest, json } from '@/lib/response';
import { getUser, updateUser } from '@/queries/prisma/user';
export async function POST(request: Request) {
@@ -22,7 +22,7 @@ export async function POST(request: Request) {
const user = await getUser(userId, { includePassword: true });
if (!checkPassword(currentPassword, user.password)) {
- return badRequest('Current password is incorrect');
+ return badRequest({ message: 'Current password is incorrect' });
}
const password = hashPassword(newPassword);
diff --git a/src/app/api/me/teams/route.ts b/src/app/api/me/teams/route.ts
index 2ea6575eb..555bf3003 100644
--- a/src/app/api/me/teams/route.ts
+++ b/src/app/api/me/teams/route.ts
@@ -1,8 +1,8 @@
import { z } from 'zod';
-import { pagingParams } from '@/lib/schema';
-import { getUserTeams } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
import { json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
+import { pagingParams } from '@/lib/schema';
+import { getUserTeams } from '@/queries/prisma';
export async function GET(request: Request) {
const schema = z.object({
@@ -15,7 +15,9 @@ export async function GET(request: Request) {
return error();
}
- const teams = await getUserTeams(auth.user.id, query);
+ const filters = await getQueryFilters(query);
+
+ const teams = await getUserTeams(auth.user.id, filters);
return json(teams);
}
diff --git a/src/app/api/me/websites/route.ts b/src/app/api/me/websites/route.ts
index a8df856a4..9ec39c78d 100644
--- a/src/app/api/me/websites/route.ts
+++ b/src/app/api/me/websites/route.ts
@@ -1,12 +1,13 @@
import { z } from 'zod';
-import { pagingParams } from '@/lib/schema';
-import { getUserWebsites } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
import { json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
+import { pagingParams } from '@/lib/schema';
+import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma';
export async function GET(request: Request) {
const schema = z.object({
...pagingParams,
+ includeTeams: z.string().optional(),
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -15,7 +16,11 @@ export async function GET(request: Request) {
return error();
}
- const websites = await getUserWebsites(auth.user.id, query);
+ const filters = await getQueryFilters(query);
- return json(websites);
+ if (query.includeTeams) {
+ return json(await getAllUserWebsitesIncludingTeamOwner(auth.user.id, filters));
+ }
+
+ return json(await getUserWebsites(auth.user.id, filters));
}
diff --git a/src/app/api/pixels/[pixelId]/route.ts b/src/app/api/pixels/[pixelId]/route.ts
new file mode 100644
index 000000000..ecaf1fdf6
--- /dev/null
+++ b/src/app/api/pixels/[pixelId]/route.ts
@@ -0,0 +1,76 @@
+import { z } from 'zod';
+import { parseRequest } from '@/lib/request';
+import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response';
+import { canDeletePixel, canUpdatePixel, canViewPixel } from '@/permissions';
+import { deletePixel, getPixel, updatePixel } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ pixelId: string }> }) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { pixelId } = await params;
+
+ if (!(await canViewPixel(auth, pixelId))) {
+ return unauthorized();
+ }
+
+ const pixel = await getPixel(pixelId);
+
+ return json(pixel);
+}
+
+export async function POST(request: Request, { params }: { params: Promise<{ pixelId: string }> }) {
+ const schema = z.object({
+ name: z.string().optional(),
+ slug: z.string().min(8).optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { pixelId } = await params;
+ const { name, slug } = body;
+
+ if (!(await canUpdatePixel(auth, pixelId))) {
+ return unauthorized();
+ }
+
+ try {
+ const pixel = await updatePixel(pixelId, { name, slug });
+
+ return Response.json(pixel);
+ } catch (e: any) {
+ if (e.message.toLowerCase().includes('unique constraint') && e.message.includes('slug')) {
+ return badRequest({ message: 'That slug is already taken.' });
+ }
+
+ return serverError(e);
+ }
+}
+
+export async function DELETE(
+ request: Request,
+ { params }: { params: Promise<{ pixelId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { pixelId } = await params;
+
+ if (!(await canDeletePixel(auth, pixelId))) {
+ return unauthorized();
+ }
+
+ await deletePixel(pixelId);
+
+ return ok();
+}
diff --git a/src/app/api/pixels/[pixelId]/shares/route.ts b/src/app/api/pixels/[pixelId]/shares/route.ts
new file mode 100644
index 000000000..8b688cd7c
--- /dev/null
+++ b/src/app/api/pixels/[pixelId]/shares/route.ts
@@ -0,0 +1,73 @@
+import { z } from 'zod';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { uuid } from '@/lib/crypto';
+import { getRandomChars } from '@/lib/generate';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams } from '@/lib/schema';
+import { canUpdatePixel, canViewPixel } from '@/permissions';
+import { createShare, getSharesByEntityId } from '@/queries/prisma';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ pixelId: string }> },
+) {
+ const schema = z.object({
+ ...filterParams,
+ ...pagingParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { pixelId } = await params;
+ const { page, pageSize, search } = query;
+
+ if (!(await canViewPixel(auth, pixelId))) {
+ return unauthorized();
+ }
+
+ const data = await getSharesByEntityId(pixelId, {
+ page,
+ pageSize,
+ search,
+ });
+
+ return json(data);
+}
+
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ pixelId: string }> },
+) {
+ const schema = z.object({
+ name: z.string().max(200),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { pixelId } = await params;
+ const { name } = body;
+
+ if (!(await canUpdatePixel(auth, pixelId))) {
+ return unauthorized();
+ }
+
+ const share = await createShare({
+ id: uuid(),
+ entityId: pixelId,
+ shareType: ENTITY_TYPE.pixel,
+ name,
+ slug: getRandomChars(16),
+ parameters: {},
+ });
+
+ return json(share);
+}
diff --git a/src/app/api/pixels/route.ts b/src/app/api/pixels/route.ts
new file mode 100644
index 000000000..8baae4f3e
--- /dev/null
+++ b/src/app/api/pixels/route.ts
@@ -0,0 +1,62 @@
+import { z } from 'zod';
+import { uuid } from '@/lib/crypto';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions';
+import { createPixel, getUserPixels } from '@/queries/prisma';
+
+export async function GET(request: Request) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const links = await getUserPixels(auth.user.id, filters);
+
+ return json(links);
+}
+
+export async function POST(request: Request) {
+ const schema = z.object({
+ name: z.string().max(100),
+ slug: z.string().max(100),
+ teamId: z.string().nullable().optional(),
+ id: z.uuid().nullable().optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { id, name, slug, teamId } = body;
+
+ if ((teamId && !(await canCreateTeamWebsite(auth, teamId))) || !(await canCreateWebsite(auth))) {
+ return unauthorized();
+ }
+
+ const data: any = {
+ id: id ?? uuid(),
+ name,
+ slug,
+ teamId,
+ };
+
+ if (!teamId) {
+ data.userId = auth.user.id;
+ }
+
+ const result = await createPixel(data);
+
+ return json(result);
+}
diff --git a/src/app/api/realtime/[websiteId]/route.ts b/src/app/api/realtime/[websiteId]/route.ts
index 7f9c1a9a2..32b7a16c1 100644
--- a/src/app/api/realtime/[websiteId]/route.ts
+++ b/src/app/api/realtime/[websiteId]/route.ts
@@ -1,9 +1,9 @@
-import { json, unauthorized } from '@/lib/response';
-import { getRealtimeData } from '@/queries';
-import { canViewWebsite } from '@/lib/auth';
import { startOfMinute, subMinutes } from 'date-fns';
import { REALTIME_RANGE } from '@/lib/constants';
-import { parseRequest } from '@/lib/request';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getRealtimeData } from '@/queries/sql';
export async function GET(
request: Request,
@@ -16,15 +16,21 @@ export async function GET(
}
const { websiteId } = await params;
- const { timezone } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = subMinutes(startOfMinute(new Date()), REALTIME_RANGE);
+ const filters = await getQueryFilters(
+ {
+ ...query,
+ startAt: subMinutes(startOfMinute(new Date()), REALTIME_RANGE).getTime(),
+ endAt: Date.now(),
+ },
+ websiteId,
+ );
- const data = await getRealtimeData(websiteId, { startDate, timezone });
+ const data = await getRealtimeData(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/record/route.ts b/src/app/api/record/route.ts
new file mode 100644
index 000000000..20ca53469
--- /dev/null
+++ b/src/app/api/record/route.ts
@@ -0,0 +1,125 @@
+import { isbot } from 'isbot';
+import { serializeError } from 'serialize-error';
+import { z } from 'zod';
+import { secret } from '@/lib/crypto';
+import { getClientInfo, hasBlockedIp } from '@/lib/detect';
+import { parseToken } from '@/lib/jwt';
+import { fetchAccount, fetchTeam } from '@/lib/load';
+import { parseRequest } from '@/lib/request';
+import { badRequest, forbidden, json, serverError } from '@/lib/response';
+import { getWebsite } from '@/queries/prisma';
+import { saveRecording } from '@/queries/sql';
+
+interface Cache {
+ sessionId: string;
+ visitId: string;
+}
+
+const schema = z.object({
+ type: z.literal('record'),
+ payload: z.object({
+ website: z.uuid(),
+ events: z.array(z.any()).max(200),
+ timestamp: z.coerce.number().int().optional(),
+ }),
+});
+
+export async function POST(request: Request) {
+ try {
+ const { body, error } = await parseRequest(request, schema, { skipAuth: true });
+
+ if (error) {
+ return error();
+ }
+
+ const { website: websiteId, events, timestamp } = body.payload;
+
+ if (!events?.length) {
+ return json({ ok: true });
+ }
+
+ // Parse cache token to get session info
+ const cacheHeader = request.headers.get('x-umami-cache');
+
+ if (!cacheHeader) {
+ return badRequest({ message: 'Missing session token.' });
+ }
+
+ const cache = (await parseToken(cacheHeader, secret())) as Cache | null;
+
+ if (!cache?.sessionId || !cache?.visitId) {
+ return badRequest({ message: 'Invalid session token.' });
+ }
+
+ const { sessionId, visitId } = cache;
+
+ // Query directly to avoid stale Redis cache for recordingEnabled
+ const website = await getWebsite(websiteId);
+
+ if (!website) {
+ return badRequest({ message: 'Website not found.' });
+ }
+
+ if (!website.replayEnabled) {
+ return json({ ok: false, reason: 'replay_disabled' });
+ }
+
+ if (process.env.CLOUD_MODE) {
+ const account = website.teamId
+ ? await fetchTeam(website.teamId)
+ : website.userId
+ ? await fetchAccount(website.userId)
+ : null;
+
+ if (!account?.isBusiness && !account?.isNoBilling) {
+ return forbidden({ message: 'Business subscription required.' });
+ }
+ }
+
+ // Client info for bot/IP checks
+ const { ip, userAgent } = await getClientInfo(request, {});
+
+ if (!process.env.DISABLE_BOT_CHECK && isbot(userAgent)) {
+ return json({ beep: 'boop' });
+ }
+
+ if (hasBlockedIp(ip)) {
+ return forbidden();
+ }
+
+ // Compute timestamps from events
+ const eventTimestamps = events
+ .map((e: any) => Number(e?.timestamp))
+ .filter((t: number) => Number.isFinite(t) && t > 0);
+
+ const fallbackMs = (timestamp || Math.floor(Date.now() / 1000)) * 1000;
+ const minTimestamp = eventTimestamps.length ? Math.min(...eventTimestamps) : fallbackMs;
+ const maxTimestamp = eventTimestamps.length ? Math.max(...eventTimestamps) : fallbackMs;
+
+ const startedAt = new Date(minTimestamp);
+ const endedAt = new Date(maxTimestamp);
+
+ // Use timestamp-based chunk index for ordering
+ const chunkIndex = timestamp || Math.floor(Date.now() / 1000);
+
+ await saveRecording({
+ websiteId,
+ sessionId,
+ visitId,
+ chunkIndex,
+ events,
+ eventCount: events.length,
+ startedAt,
+ endedAt,
+ });
+
+ return json({ ok: true });
+ } catch (e) {
+ const error = serializeError(e);
+
+ // eslint-disable-next-line no-console
+ console.log(error);
+
+ return serverError({ errorObject: error });
+ }
+}
diff --git a/src/app/api/reports/[reportId]/route.ts b/src/app/api/reports/[reportId]/route.ts
index 24c32b579..d3384f7d6 100644
--- a/src/app/api/reports/[reportId]/route.ts
+++ b/src/app/api/reports/[reportId]/route.ts
@@ -1,9 +1,8 @@
-import { z } from 'zod';
import { parseRequest } from '@/lib/request';
-import { deleteReport, getReport, updateReport } from '@/queries';
-import { canDeleteReport, canUpdateReport, canViewReport } from '@/lib/auth';
-import { unauthorized, json, notFound, ok } from '@/lib/response';
-import { reportTypeParam } from '@/lib/schema';
+import { json, notFound, ok, unauthorized } from '@/lib/response';
+import { reportSchema } from '@/lib/schema';
+import { canDeleteReport, canUpdateReport, canViewReport } from '@/permissions';
+import { deleteReport, getReport, updateReport } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ reportId: string }> }) {
const { auth, error } = await parseRequest(request);
@@ -27,15 +26,7 @@ export async function POST(
request: Request,
{ params }: { params: Promise<{ reportId: string }> },
) {
- const schema = z.object({
- websiteId: z.string().uuid(),
- type: reportTypeParam,
- name: z.string().max(200),
- description: z.string().max(500),
- parameters: z.object({}).passthrough(),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportSchema);
if (error) {
return error();
@@ -56,11 +47,10 @@ export async function POST(
const result = await updateReport(reportId, {
websiteId,
- userId: auth.user.id,
type,
name,
description,
- parameters: parameters,
+ parameters,
} as any);
return json(result);
@@ -79,6 +69,10 @@ export async function DELETE(
const { reportId } = await params;
const report = await getReport(reportId);
+ if (!report) {
+ return notFound();
+ }
+
if (!(await canDeleteReport(auth, report))) {
return unauthorized();
}
diff --git a/src/app/api/reports/attribution/route.ts b/src/app/api/reports/attribution/route.ts
index a1f7992d0..bd7d86dc7 100644
--- a/src/app/api/reports/attribution/route.ts
+++ b/src/app/api/reports/attribution/route.ts
@@ -1,50 +1,26 @@
-import { canViewWebsite } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
-import { reportParms } from '@/lib/schema';
-import { getAttribution } from '@/queries/sql/reports/getAttribution';
-import { z } from 'zod';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { type AttributionParameters, getAttribution } from '@/queries/sql/reports/getAttribution';
export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- model: z.string().regex(/firstClick|lastClick/i),
- steps: z
- .array(
- z.object({
- type: z.string(),
- value: z.string(),
- }),
- )
- .min(1),
- currency: z.string().optional(),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- model,
- steps,
- currency,
- dateRange: { startDate, endDate },
- } = body;
+ const { websiteId } = body;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getAttribution(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- model: model,
- steps,
- currency,
- });
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
+
+ const data = await getAttribution(websiteId, parameters as AttributionParameters, filters);
return json(data);
}
diff --git a/src/app/api/reports/breakdown/route.ts b/src/app/api/reports/breakdown/route.ts
new file mode 100644
index 000000000..3c5931458
--- /dev/null
+++ b/src/app/api/reports/breakdown/route.ts
@@ -0,0 +1,26 @@
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { type BreakdownParameters, getBreakdown } from '@/queries/sql';
+
+export async function POST(request: Request) {
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = body;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
+
+ const data = await getBreakdown(websiteId, parameters as BreakdownParameters, filters);
+
+ return json(data);
+}
diff --git a/src/app/api/reports/funnel/route.ts b/src/app/api/reports/funnel/route.ts
index 6033c6333..c13f6f1c8 100644
--- a/src/app/api/reports/funnel/route.ts
+++ b/src/app/api/reports/funnel/route.ts
@@ -1,47 +1,26 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getFunnel } from '@/queries';
-import { reportParms } from '@/lib/schema';
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { type FunnelParameters, getFunnel } from '@/queries/sql';
export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- window: z.coerce.number().positive(),
- steps: z
- .array(
- z.object({
- type: z.string(),
- value: z.string(),
- }),
- )
- .min(2),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- steps,
- window,
- dateRange: { startDate, endDate },
- } = body;
+ const { websiteId } = body;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getFunnel(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- steps,
- windowMinutes: +window,
- });
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
+
+ const data = await getFunnel(websiteId, parameters as FunnelParameters, filters);
return json(data);
}
diff --git a/src/app/api/reports/goal/route.ts b/src/app/api/reports/goal/route.ts
new file mode 100644
index 000000000..3bd0415d6
--- /dev/null
+++ b/src/app/api/reports/goal/route.ts
@@ -0,0 +1,26 @@
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { type GoalParameters, getGoal } from '@/queries/sql/reports/getGoal';
+
+export async function POST(request: Request) {
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = body;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
+
+ const data = await getGoal(websiteId, parameters as GoalParameters, filters);
+
+ return json(data);
+}
diff --git a/src/app/api/reports/goals/route.ts b/src/app/api/reports/goals/route.ts
deleted file mode 100644
index 5a2f6bd0c..000000000
--- a/src/app/api/reports/goals/route.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getGoals } from '@/queries/sql/reports/getGoals';
-import { reportParms } from '@/lib/schema';
-
-export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- goals: z
- .array(
- z
- .object({
- type: z.string().regex(/url|event|event-data/),
- value: z.string(),
- goal: z.coerce.number(),
- operator: z
- .string()
- .regex(/count|sum|average/)
- .optional(),
- property: z.string().optional(),
- })
- .refine(data => {
- if (data['type'] === 'event-data') {
- return data['operator'] && data['property'];
- }
- return true;
- }),
- )
- .min(1),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
-
- if (error) {
- return error();
- }
-
- const {
- websiteId,
- dateRange: { startDate, endDate },
- goals,
- } = body;
-
- if (!(await canViewWebsite(auth, websiteId))) {
- return unauthorized();
- }
-
- const data = await getGoals(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- goals,
- });
-
- return json(data);
-}
diff --git a/src/app/api/reports/insights/route.ts b/src/app/api/reports/insights/route.ts
deleted file mode 100644
index b3569cba6..000000000
--- a/src/app/api/reports/insights/route.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getInsights } from '@/queries';
-import { reportParms } from '@/lib/schema';
-
-function convertFilters(filters: any[]) {
- return filters.reduce((obj, filter) => {
- obj[filter.name] = filter;
-
- return obj;
- }, {});
-}
-
-export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- fields: z
- .array(
- z.object({
- name: z.string(),
- type: z.string(),
- label: z.string(),
- }),
- )
- .min(1),
- filters: z.array(
- z.object({
- name: z.string(),
- type: z.string(),
- operator: z.string(),
- value: z.string(),
- }),
- ),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
-
- if (error) {
- return error();
- }
-
- const {
- websiteId,
- dateRange: { startDate, endDate },
- fields,
- filters,
- } = body;
-
- if (!(await canViewWebsite(auth, websiteId))) {
- return unauthorized();
- }
-
- const data = await getInsights(websiteId, fields, {
- ...convertFilters(filters),
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- });
-
- return json(data);
-}
diff --git a/src/app/api/reports/journey/route.ts b/src/app/api/reports/journey/route.ts
index 19ad98fa7..b53d225d4 100644
--- a/src/app/api/reports/journey/route.ts
+++ b/src/app/api/reports/journey/route.ts
@@ -1,43 +1,30 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getJourney } from '@/queries';
-import { reportParms } from '@/lib/schema';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getJourney } from '@/queries/sql';
export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- steps: z.coerce.number().min(3).max(7),
- startStep: z.string().optional(),
- endStep: z.string().optional(),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- dateRange: { startDate, endDate },
- steps,
- startStep,
- endStep,
- } = body;
+ const { websiteId, parameters, filters } = body;
+ const { eventType } = parameters;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getJourney(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- steps,
- startStep,
- endStep,
- });
+ if (eventType) {
+ filters.eventType = eventType;
+ }
+
+ const queryFilters = await getQueryFilters(filters, websiteId);
+
+ const data = await getJourney(websiteId, parameters, queryFilters);
return json(data);
}
diff --git a/src/app/api/reports/performance/route.ts b/src/app/api/reports/performance/route.ts
new file mode 100644
index 000000000..d32ffbdb6
--- /dev/null
+++ b/src/app/api/reports/performance/route.ts
@@ -0,0 +1,39 @@
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getPerformance, type PerformanceParameters } from '@/queries/sql/reports/getPerformance';
+import { getPerformanceMetrics } from '@/queries/sql/reports/getPerformanceMetrics';
+
+export async function POST(request: Request) {
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = body;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
+
+ const [{ chart, summary }, pages, pageTitles, devices, browsers] = await Promise.all([
+ getPerformance(websiteId, parameters as PerformanceParameters, filters),
+ getPerformanceMetrics(websiteId, parameters as PerformanceParameters, filters, 'url_path', 500),
+ getPerformanceMetrics(
+ websiteId,
+ parameters as PerformanceParameters,
+ filters,
+ 'page_title',
+ 500,
+ ),
+ getPerformanceMetrics(websiteId, parameters as PerformanceParameters, filters, 'device'),
+ getPerformanceMetrics(websiteId, parameters as PerformanceParameters, filters, 'browser', 500),
+ ]);
+
+ return json({ chart, summary, pages, pageTitles, devices, browsers });
+}
diff --git a/src/app/api/reports/retention/route.ts b/src/app/api/reports/retention/route.ts
index 83220bb4c..d1a7d698b 100644
--- a/src/app/api/reports/retention/route.ts
+++ b/src/app/api/reports/retention/route.ts
@@ -1,37 +1,26 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getRetention } from '@/queries';
-import { reportParms, timezoneParam } from '@/lib/schema';
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getRetention, type RetentionParameters } from '@/queries/sql';
export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- timezone: timezoneParam,
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- dateRange: { startDate, endDate },
- timezone,
- } = body;
+ const { websiteId } = body;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getRetention(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- timezone,
- });
+ const filters = await getQueryFilters(body.filters, websiteId);
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+
+ const data = await getRetention(websiteId, parameters as RetentionParameters, filters);
return json(data);
}
diff --git a/src/app/api/reports/revenue/route.ts b/src/app/api/reports/revenue/route.ts
index 13a34f382..2f87f80e0 100644
--- a/src/app/api/reports/revenue/route.ts
+++ b/src/app/api/reports/revenue/route.ts
@@ -1,63 +1,41 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { reportParms, timezoneParam } from '@/lib/schema';
-import { getRevenue } from '@/queries/sql/reports/getRevenue';
-import { getRevenueValues } from '@/queries/sql/reports/getRevenueValues';
-
-export async function GET(request: Request) {
- const { auth, query, error } = await parseRequest(request);
-
- if (error) {
- return error();
- }
-
- const { websiteId, startDate, endDate } = query;
-
- if (!(await canViewWebsite(auth, websiteId))) {
- return unauthorized();
- }
-
- const data = await getRevenueValues(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- });
-
- return json(data);
-}
+import { getCompareDate } from '@/lib/date';
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getRevenue, type RevenuParameters } from '@/queries/sql/reports/getRevenue';
+import { getRevenueMetrics } from '@/queries/sql/reports/getRevenueMetrics';
+import { getRevenueStats } from '@/queries/sql/reports/getRevenueStats';
export async function POST(request: Request) {
- const schema = z.object({
- currency: z.string(),
- ...reportParms,
- timezone: timezoneParam,
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- currency,
- timezone,
- dateRange: { startDate, endDate, unit },
- } = body;
+ const { websiteId } = body;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getRevenue(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- unit,
- timezone,
- currency,
- });
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+ const filters = await getQueryFilters(body.filters, websiteId);
- return json(data);
+ const [{ chart }, total, metrics] = await Promise.all([
+ getRevenue(websiteId, parameters as RevenuParameters, filters),
+ getRevenueStats(websiteId, parameters as RevenuParameters, filters),
+ getRevenueMetrics(websiteId, parameters as RevenuParameters, filters),
+ ]);
+
+ const { compare = 'prev' } = parameters as RevenuParameters;
+ const { startDate, endDate } = getCompareDate(compare, parameters.startDate, parameters.endDate);
+ const comparison = await getRevenueStats(
+ websiteId,
+ { ...(parameters as RevenuParameters), startDate, endDate },
+ filters,
+ );
+
+ return json({ chart, total: { ...total, comparison }, ...metrics });
}
diff --git a/src/app/api/reports/route.ts b/src/app/api/reports/route.ts
index ae6254c6b..b0a413543 100644
--- a/src/app/api/reports/route.ts
+++ b/src/app/api/reports/route.ts
@@ -1,15 +1,15 @@
import { z } from 'zod';
import { uuid } from '@/lib/crypto';
-import { pagingParams, reportTypeParam } from '@/lib/schema';
import { parseRequest } from '@/lib/request';
-import { canViewTeam, canViewWebsite, canUpdateWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { getReports, createReport } from '@/queries';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, reportSchema, reportTypeParam } from '@/lib/schema';
+import { canUpdateWebsite, canViewWebsite } from '@/permissions';
+import { createReport, getReports } from '@/queries/prisma';
export async function GET(request: Request) {
const schema = z.object({
- websiteId: z.string().uuid().optional(),
- teamId: z.string().uuid().optional(),
+ websiteId: z.uuid(),
+ type: reportTypeParam.optional(),
...pagingParams,
});
@@ -19,53 +19,24 @@ export async function GET(request: Request) {
return error();
}
- const { page, search, pageSize, websiteId, teamId } = query;
- const userId = auth.user.id;
+ const { page, search, pageSize, websiteId, type } = query;
const filters = {
page,
pageSize,
search,
};
- if (
- (websiteId && !(await canViewWebsite(auth, websiteId))) ||
- (teamId && !(await canViewTeam(auth, teamId)))
- ) {
+ if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const data = await getReports(
{
where: {
- OR: [
- ...(websiteId ? [{ websiteId }] : []),
- ...(teamId
- ? [
- {
- website: {
- deletedAt: null,
- teamId,
- },
- },
- ]
- : []),
- ...(userId && !websiteId && !teamId
- ? [
- {
- website: {
- deletedAt: null,
- userId,
- },
- },
- ]
- : []),
- ],
- },
- include: {
+ websiteId,
+ type,
website: {
- select: {
- domain: true,
- },
+ deletedAt: null,
},
},
},
@@ -76,15 +47,7 @@ export async function GET(request: Request) {
}
export async function POST(request: Request) {
- const schema = z.object({
- websiteId: z.string().uuid(),
- name: z.string().max(200),
- type: reportTypeParam,
- description: z.string().max(500),
- parameters: z.object({}).passthrough(),
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportSchema);
if (error) {
return error();
@@ -102,9 +65,9 @@ export async function POST(request: Request) {
websiteId,
type,
name,
- description,
- parameters: parameters,
- } as any);
+ description: description || '',
+ parameters,
+ });
return json(result);
}
diff --git a/src/app/api/reports/utm/route.ts b/src/app/api/reports/utm/route.ts
index 38e88a6de..577fdab79 100644
--- a/src/app/api/reports/utm/route.ts
+++ b/src/app/api/reports/utm/route.ts
@@ -1,35 +1,37 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { unauthorized, json } from '@/lib/response';
-import { parseRequest } from '@/lib/request';
-import { getUTM } from '@/queries';
-import { reportParms } from '@/lib/schema';
+import { UTM_PARAMS } from '@/lib/constants';
+import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { reportResultSchema } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getUTM, type UTMParameters } from '@/queries/sql';
export async function POST(request: Request) {
- const schema = z.object({
- ...reportParms,
- });
-
- const { auth, body, error } = await parseRequest(request, schema);
+ const { auth, body, error } = await parseRequest(request, reportResultSchema);
if (error) {
return error();
}
- const {
- websiteId,
- dateRange: { startDate, endDate, timezone },
- } = body;
+ const { websiteId } = body;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getUTM(websiteId, {
- startDate: new Date(startDate),
- endDate: new Date(endDate),
- timezone,
- });
+ const filters = await getQueryFilters(body.filters, websiteId);
+ const parameters = await setWebsiteDate(websiteId, body.parameters);
+
+ const data = {
+ utm_source: [],
+ utm_medium: [],
+ utm_campaign: [],
+ utm_term: [],
+ utm_content: [],
+ };
+
+ for (const key of UTM_PARAMS) {
+ data[key] = await getUTM(websiteId, { column: key, ...parameters } as UTMParameters, filters);
+ }
return json(data);
}
diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts
index 04876cd46..be0220bfe 100644
--- a/src/app/api/send/route.ts
+++ b/src/app/api/send/route.ts
@@ -1,36 +1,66 @@
-import { z } from 'zod';
+import { startOfHour } from 'date-fns';
import { isbot } from 'isbot';
-import { startOfHour, startOfMonth } from 'date-fns';
+import { serializeError } from 'serialize-error';
+import { z } from 'zod';
import clickhouse from '@/lib/clickhouse';
-import { parseRequest } from '@/lib/request';
-import { badRequest, json, forbidden, serverError } from '@/lib/response';
-import { fetchWebsite } from '@/lib/load';
+import { COLLECTION_TYPE, EVENT_TYPE } from '@/lib/constants';
+import { getSalt, hash, secret, uuid } from '@/lib/crypto';
import { getClientInfo, hasBlockedIp } from '@/lib/detect';
import { createToken, parseToken } from '@/lib/jwt';
-import { secret, uuid, hash } from '@/lib/crypto';
-import { COLLECTION_TYPE } from '@/lib/constants';
+import { fetchWebsite } from '@/lib/load';
+import { parseRequest } from '@/lib/request';
+import { badRequest, forbidden, json, serverError } from '@/lib/response';
import { anyObjectParam, urlOrPathParam } from '@/lib/schema';
import { safeDecodeURI, safeDecodeURIComponent } from '@/lib/url';
-import { createSession, saveEvent, saveSessionData } from '@/queries';
+import { createSession, saveEvent, saveSessionData } from '@/queries/sql';
+
+interface Cache {
+ websiteId: string;
+ sessionId: string;
+ visitId: string;
+ iat: number;
+}
const schema = z.object({
- type: z.enum(['event', 'identify']),
- payload: z.object({
- website: z.string().uuid(),
- data: anyObjectParam.optional(),
- hostname: z.string().max(100).optional(),
- language: z.string().max(35).optional(),
- referrer: urlOrPathParam.optional(),
- screen: z.string().max(11).optional(),
- title: z.string().optional(),
- url: urlOrPathParam.optional(),
- name: z.string().max(50).optional(),
- tag: z.string().max(50).optional(),
- ip: z.string().ip().optional(),
- userAgent: z.string().optional(),
- timestamp: z.coerce.number().int().optional(),
- id: z.string().optional(),
- }),
+ type: z.enum(['event', 'identify', 'performance']),
+ payload: z
+ .object({
+ website: z.uuid().optional(),
+ link: z.uuid().optional(),
+ pixel: z.uuid().optional(),
+ data: anyObjectParam.optional(),
+ hostname: z.string().max(100).optional(),
+ language: z.string().max(35).optional(),
+ referrer: urlOrPathParam.optional(),
+ screen: z.string().max(11).optional(),
+ title: z.string().optional(),
+ url: urlOrPathParam.optional(),
+ name: z.string().max(50).optional(),
+ tag: z.string().max(50).optional(),
+ ip: z.string().optional(),
+ userAgent: z.string().optional(),
+ timestamp: z.coerce.number().int().optional(),
+ id: z.string().optional(),
+ browser: z.string().optional(),
+ os: z.string().optional(),
+ device: z.string().optional(),
+ lcp: z.number().nonnegative().max(60000).optional(),
+ inp: z.number().nonnegative().max(60000).optional(),
+ cls: z.number().nonnegative().max(100).optional(),
+ fcp: z.number().nonnegative().max(60000).optional(),
+ ttfb: z.number().nonnegative().max(60000).optional(),
+ })
+ .refine(
+ data => {
+ const keys = [data.website, data.link, data.pixel];
+ const count = keys.filter(Boolean).length;
+ return count === 1;
+ },
+ {
+ message: 'Exactly one of website, link, or pixel must be provided',
+ path: ['website'],
+ },
+ ),
});
export async function POST(request: Request) {
@@ -45,6 +75,8 @@ export async function POST(request: Request) {
const {
website: websiteId,
+ pixel: pixelId,
+ link: linkId,
hostname,
screen,
language,
@@ -56,26 +88,36 @@ export async function POST(request: Request) {
tag,
timestamp,
id,
+ lcp,
+ inp,
+ cls,
+ fcp,
+ ttfb,
} = payload;
+ const sourceId = websiteId || pixelId || linkId;
+
// Cache check
- let cache: { websiteId: string; sessionId: string; visitId: string; iat: number } | null = null;
- const cacheHeader = request.headers.get('x-umami-cache');
+ let cache: Cache | null = null;
- if (cacheHeader) {
- const result = await parseToken(cacheHeader, secret());
+ if (websiteId) {
+ const cacheHeader = request.headers.get('x-umami-cache');
- if (result) {
- cache = result;
+ if (cacheHeader) {
+ const result = await parseToken(cacheHeader, secret());
+
+ if (result) {
+ cache = result;
+ }
}
- }
- // Find website
- if (!cache?.websiteId) {
- const website = await fetchWebsite(websiteId);
+ // Find website
+ if (!cache?.websiteId) {
+ const website = await fetchWebsite(websiteId);
- if (!website) {
- return badRequest('Website not found.');
+ if (!website) {
+ return badRequest({ message: 'Website not found.' });
+ }
}
}
@@ -96,31 +138,30 @@ export async function POST(request: Request) {
}
const createdAt = timestamp ? new Date(timestamp * 1000) : new Date();
- const now = Math.floor(new Date().getTime() / 1000);
+ const now = Math.floor(Date.now() / 1000);
- const sessionSalt = hash(startOfMonth(createdAt).toUTCString());
+ const saltRotation = process.env.SALT_ROTATION || 'month';
+ const sessionSalt = getSalt(saltRotation, createdAt);
const visitSalt = hash(startOfHour(createdAt).toUTCString());
- const sessionId = id ? uuid(websiteId, id) : uuid(websiteId, ip, userAgent, sessionSalt);
+ const sessionId = id ? uuid(sourceId, id) : uuid(sourceId, ip, userAgent, sessionSalt);
// Create a session if not found
if (!clickhouse.enabled && !cache?.sessionId) {
- await createSession(
- {
- id: sessionId,
- websiteId,
- browser,
- os,
- device,
- screen,
- language,
- country,
- region,
- city,
- distinctId: id,
- },
- { skipDuplicates: true },
- );
+ await createSession({
+ id: sessionId,
+ websiteId: sourceId,
+ browser,
+ os,
+ device,
+ screen,
+ language,
+ country,
+ region,
+ city,
+ distinctId: id,
+ createdAt,
+ });
}
// Visit info
@@ -170,16 +211,22 @@ export async function POST(request: Request) {
referrerPath = referrerUrl.pathname;
referrerQuery = referrerUrl.search.substring(1);
-
- if (referrerUrl.hostname !== 'localhost') {
- referrerDomain = referrerUrl.hostname.replace(/^www\./, '');
- }
+ referrerDomain = referrerUrl.hostname.replace(/^www\./, '');
}
+ const eventType = linkId
+ ? EVENT_TYPE.linkEvent
+ : pixelId
+ ? EVENT_TYPE.pixelEvent
+ : name
+ ? EVENT_TYPE.customEvent
+ : EVENT_TYPE.pageView;
+
await saveEvent({
- websiteId,
+ websiteId: sourceId,
sessionId,
visitId,
+ eventType,
createdAt,
// Page
@@ -222,9 +269,7 @@ export async function POST(request: Request) {
lifatid,
twclid,
});
- }
-
- if (type === COLLECTION_TYPE.identify) {
+ } else if (type === COLLECTION_TYPE.identify) {
if (data) {
await saveSessionData({
websiteId,
@@ -234,12 +279,44 @@ export async function POST(request: Request) {
createdAt,
});
}
+ } else if (type === COLLECTION_TYPE.performance) {
+ const base = hostname ? `https://${hostname}` : 'https://localhost';
+ const currentUrl = new URL(url, base);
+ const urlPath = currentUrl.pathname === '/undefined' ? '' : currentUrl.pathname;
+
+ await saveEvent({
+ websiteId: sourceId,
+ sessionId,
+ visitId,
+ urlPath,
+ pageTitle: safeDecodeURIComponent(title),
+ eventType: EVENT_TYPE.performance,
+ browser,
+ os,
+ device,
+ screen,
+ language,
+ country,
+ region,
+ city,
+ lcp,
+ inp,
+ cls,
+ fcp,
+ ttfb,
+ createdAt,
+ });
}
const token = createToken({ websiteId, sessionId, visitId, iat }, secret());
return json({ cache: token, sessionId, visitId });
} catch (e) {
- return serverError(e);
+ const error = serializeError(e);
+
+ // eslint-disable-next-line no-console
+ console.log(error);
+
+ return serverError({ errorObject: error });
}
}
diff --git a/src/app/api/share/[shareId]/route.ts b/src/app/api/share/[shareId]/route.ts
deleted file mode 100644
index e387938d2..000000000
--- a/src/app/api/share/[shareId]/route.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { json, notFound } from '@/lib/response';
-import { createToken } from '@/lib/jwt';
-import { secret } from '@/lib/crypto';
-import { getSharedWebsite } from '@/queries';
-
-export async function GET(request: Request, { params }: { params: Promise<{ shareId: string }> }) {
- const { shareId } = await params;
-
- const website = await getSharedWebsite(shareId);
-
- if (!website) {
- return notFound();
- }
-
- const data = { websiteId: website.id };
- const token = createToken(data, secret());
-
- return json({ ...data, token });
-}
diff --git a/src/app/api/share/[slug]/route.ts b/src/app/api/share/[slug]/route.ts
new file mode 100644
index 000000000..f110ae936
--- /dev/null
+++ b/src/app/api/share/[slug]/route.ts
@@ -0,0 +1,103 @@
+import { getBoardWebsiteIds } from '@/lib/boards';
+import { ENTITY_TYPE, ROLES } from '@/lib/constants';
+import { secret } from '@/lib/crypto';
+import { createToken } from '@/lib/jwt';
+import prisma from '@/lib/prisma';
+import redis from '@/lib/redis';
+import { json, notFound } from '@/lib/response';
+import type { BoardParameters, WhiteLabel } from '@/lib/types';
+import { getBoard, getLink, getPixel, getShareByCode, getWebsite } from '@/queries/prisma';
+
+async function getAccountId(entity: { userId?: string; teamId?: string }): Promise {
+ if (entity.userId) {
+ return entity.userId;
+ }
+
+ if (entity.teamId) {
+ const teamOwner = await prisma.client.teamUser.findFirst({
+ where: {
+ teamId: entity.teamId,
+ role: ROLES.teamOwner,
+ },
+ select: {
+ userId: true,
+ },
+ });
+
+ return teamOwner?.userId || null;
+ }
+
+ return null;
+}
+
+async function getWhiteLabel(accountId: string): Promise {
+ if (!redis.enabled) {
+ return null;
+ }
+
+ const data = await redis.client.get(`white-label:${accountId}`);
+
+ if (data) {
+ return data as WhiteLabel;
+ }
+
+ return null;
+}
+
+export async function GET(_request: Request, { params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params;
+
+ const share = await getShareByCode(slug);
+
+ if (!share) {
+ return notFound();
+ }
+
+ const data: Record = {
+ shareId: share.id,
+ shareType: share.shareType,
+ parameters: share.parameters,
+ };
+
+ let entity: { userId?: string; teamId?: string } | null = null;
+
+ if (share.shareType === ENTITY_TYPE.board) {
+ const board = await getBoard(share.entityId);
+ if (!board) return notFound();
+ entity = board;
+ data.boardId = share.entityId;
+ data.websiteIds = getBoardWebsiteIds({
+ type: board.type,
+ parameters: share.parameters as BoardParameters,
+ });
+ } else if (share.shareType === ENTITY_TYPE.website) {
+ entity = await getWebsite(share.entityId);
+ if (!entity) return notFound();
+ data.websiteId = share.entityId;
+ } else if (share.shareType === ENTITY_TYPE.pixel) {
+ entity = await getPixel(share.entityId);
+ if (!entity) return notFound();
+ data.websiteId = share.entityId;
+ data.pixelId = share.entityId;
+ } else if (share.shareType === ENTITY_TYPE.link) {
+ entity = await getLink(share.entityId);
+ if (!entity) return notFound();
+ data.websiteId = share.entityId;
+ data.linkId = share.entityId;
+ } else {
+ return notFound();
+ }
+
+ data.token = createToken(data, secret());
+
+ const accountId = await getAccountId(entity);
+
+ if (accountId) {
+ const whiteLabel = await getWhiteLabel(accountId);
+ if (whiteLabel) {
+ data.whiteLabel = whiteLabel;
+ }
+ }
+
+ return json(data);
+}
diff --git a/src/app/api/share/id/[shareId]/route.ts b/src/app/api/share/id/[shareId]/route.ts
new file mode 100644
index 000000000..80da17b80
--- /dev/null
+++ b/src/app/api/share/id/[shareId]/route.ts
@@ -0,0 +1,82 @@
+import z from 'zod';
+import { parseRequest } from '@/lib/request';
+import { json, notFound, ok, unauthorized } from '@/lib/response';
+import { anyObjectParam } from '@/lib/schema';
+import { canDeleteEntity, canUpdateEntity, canViewEntity } from '@/permissions';
+import { deleteShare, getShare, updateShare } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ shareId: string }> }) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { shareId } = await params;
+
+ const share = await getShare(shareId);
+
+ if (!(await canViewEntity(auth, share.entityId))) {
+ return unauthorized();
+ }
+
+ return json(share);
+}
+
+export async function POST(request: Request, { params }: { params: Promise<{ shareId: string }> }) {
+ const schema = z.object({
+ name: z.string().max(200),
+ slug: z.string().max(100),
+ parameters: anyObjectParam,
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { shareId } = await params;
+ const { name, slug, parameters } = body;
+
+ const share = await getShare(shareId);
+
+ if (!share) {
+ return notFound();
+ }
+
+ if (!(await canUpdateEntity(auth, share.entityId))) {
+ return unauthorized();
+ }
+
+ const result = await updateShare(shareId, {
+ name,
+ slug,
+ parameters,
+ } as any);
+
+ return json(result);
+}
+
+export async function DELETE(
+ request: Request,
+ { params }: { params: Promise<{ shareId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { shareId } = await params;
+
+ const share = await getShare(shareId);
+
+ if (!(await canDeleteEntity(auth, share.entityId))) {
+ return unauthorized();
+ }
+
+ await deleteShare(shareId);
+
+ return ok();
+}
diff --git a/src/app/api/share/route.ts b/src/app/api/share/route.ts
new file mode 100644
index 000000000..de8472fa5
--- /dev/null
+++ b/src/app/api/share/route.ts
@@ -0,0 +1,42 @@
+import z from 'zod';
+import { uuid } from '@/lib/crypto';
+import { getRandomChars } from '@/lib/generate';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { anyObjectParam } from '@/lib/schema';
+import { canUpdateEntity } from '@/permissions';
+import { createShare } from '@/queries/prisma';
+
+export async function POST(request: Request) {
+ const schema = z.object({
+ entityId: z.uuid(),
+ shareType: z.coerce.number().int(),
+ name: z.string().max(200),
+ slug: z.string().max(100).optional(),
+ parameters: anyObjectParam,
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { entityId, shareType, name, slug, parameters } = body;
+ const shareParameters = parameters ?? {};
+
+ if (!(await canUpdateEntity(auth, entityId))) {
+ return unauthorized();
+ }
+
+ const share = await createShare({
+ id: uuid(),
+ entityId,
+ shareType,
+ name,
+ slug: slug || getRandomChars(16),
+ parameters: shareParameters,
+ });
+
+ return json(share);
+}
diff --git a/src/app/api/teams/[teamId]/boards/route.ts b/src/app/api/teams/[teamId]/boards/route.ts
new file mode 100644
index 000000000..2e60b77e2
--- /dev/null
+++ b/src/app/api/teams/[teamId]/boards/route.ts
@@ -0,0 +1,29 @@
+import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewTeam } from '@/permissions';
+import { getTeamBoards } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+ const { teamId } = await params;
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ if (!(await canViewTeam(auth, teamId))) {
+ return unauthorized();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const boards = await getTeamBoards(teamId, filters);
+
+ return json(boards);
+}
diff --git a/src/app/api/teams/[teamId]/links/route.ts b/src/app/api/teams/[teamId]/links/route.ts
new file mode 100644
index 000000000..41e139b33
--- /dev/null
+++ b/src/app/api/teams/[teamId]/links/route.ts
@@ -0,0 +1,29 @@
+import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewTeam } from '@/permissions';
+import { getTeamLinks } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+ const { teamId } = await params;
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ if (!(await canViewTeam(auth, teamId))) {
+ return unauthorized();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const links = await getTeamLinks(teamId, filters);
+
+ return json(links);
+}
diff --git a/src/app/api/teams/[teamId]/pixels/route.ts b/src/app/api/teams/[teamId]/pixels/route.ts
new file mode 100644
index 000000000..daac2040d
--- /dev/null
+++ b/src/app/api/teams/[teamId]/pixels/route.ts
@@ -0,0 +1,29 @@
+import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewTeam } from '@/permissions';
+import { getTeamPixels } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+ const { teamId } = await params;
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ if (!(await canViewTeam(auth, teamId))) {
+ return unauthorized();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const websites = await getTeamPixels(teamId, filters);
+
+ return json(websites);
+}
diff --git a/src/app/api/teams/[teamId]/route.ts b/src/app/api/teams/[teamId]/route.ts
index 194e7bbb1..c334b2af0 100644
--- a/src/app/api/teams/[teamId]/route.ts
+++ b/src/app/api/teams/[teamId]/route.ts
@@ -1,8 +1,8 @@
import { z } from 'zod';
-import { unauthorized, json, notFound, ok } from '@/lib/response';
-import { canDeleteTeam, canUpdateTeam, canViewTeam } from '@/lib/auth';
import { parseRequest } from '@/lib/request';
-import { deleteTeam, getTeam, updateTeam } from '@/queries';
+import { json, notFound, ok, unauthorized } from '@/lib/response';
+import { canDeleteTeam, canUpdateTeam, canViewTeam } from '@/permissions';
+import { deleteTeam, getTeam, updateTeam } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
const { auth, error } = await parseRequest(request);
@@ -20,7 +20,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ team
const team = await getTeam(teamId, { includeMembers: true });
if (!team) {
- return notFound('Team not found.');
+ return notFound({ message: 'Team not found.' });
}
return json(team);
@@ -41,7 +41,7 @@ export async function POST(request: Request, { params }: { params: Promise<{ tea
const { teamId } = await params;
if (!(await canUpdateTeam(auth, teamId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
const team = await updateTeam(teamId, body);
@@ -62,7 +62,7 @@ export async function DELETE(
const { teamId } = await params;
if (!(await canDeleteTeam(auth, teamId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
await deleteTeam(teamId);
diff --git a/src/app/api/teams/[teamId]/users/[userId]/route.ts b/src/app/api/teams/[teamId]/users/[userId]/route.ts
index bf5f4d364..d09af9da6 100644
--- a/src/app/api/teams/[teamId]/users/[userId]/route.ts
+++ b/src/app/api/teams/[teamId]/users/[userId]/route.ts
@@ -1,8 +1,9 @@
-import { canDeleteTeamUser, canUpdateTeam } from '@/lib/auth';
+import { z } from 'zod';
import { parseRequest } from '@/lib/request';
import { badRequest, json, ok, unauthorized } from '@/lib/response';
-import { deleteTeamUser, getTeamUser, updateTeamUser } from '@/queries';
-import { z } from 'zod';
+import { teamRoleParam } from '@/lib/schema';
+import { canDeleteTeamUser, canUpdateTeam } from '@/permissions';
+import { deleteTeamUser, getTeamUser, updateTeamUser } from '@/queries/prisma';
export async function GET(
request: Request,
@@ -17,7 +18,7 @@ export async function GET(
const { teamId, userId } = await params;
if (!(await canUpdateTeam(auth, teamId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
const teamUser = await getTeamUser(teamId, userId);
@@ -30,7 +31,7 @@ export async function POST(
{ params }: { params: Promise<{ teamId: string; userId: string }> },
) {
const schema = z.object({
- role: z.string().regex(/team-member|team-view-only|team-manager/),
+ role: teamRoleParam,
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -42,13 +43,13 @@ export async function POST(
const { teamId, userId } = await params;
if (!(await canUpdateTeam(auth, teamId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
const teamUser = await getTeamUser(teamId, userId);
if (!teamUser) {
- return badRequest('The User does not exists on this team.');
+ return badRequest({ message: 'The User does not exists on this team.' });
}
const user = await updateTeamUser(teamUser.id, body);
@@ -69,13 +70,13 @@ export async function DELETE(
const { teamId, userId } = await params;
if (!(await canDeleteTeamUser(auth, teamId, userId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
const teamUser = await getTeamUser(teamId, userId);
if (!teamUser) {
- return badRequest('The User does not exists on this team.');
+ return badRequest({ message: 'The User does not exists on this team.' });
}
await deleteTeamUser(teamId, userId);
diff --git a/src/app/api/teams/[teamId]/users/route.ts b/src/app/api/teams/[teamId]/users/route.ts
index 57460b89e..c1297636e 100644
--- a/src/app/api/teams/[teamId]/users/route.ts
+++ b/src/app/api/teams/[teamId]/users/route.ts
@@ -1,13 +1,14 @@
import { z } from 'zod';
-import { unauthorized, json, badRequest } from '@/lib/response';
-import { canAddUserToTeam, canViewTeam } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
-import { pagingParams, roleParam } from '@/lib/schema';
-import { createTeamUser, getTeamUser, getTeamUsers } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { badRequest, json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams, teamRoleParam } from '@/lib/schema';
+import { canUpdateTeam, canViewTeam } from '@/permissions';
+import { createTeamUser, getTeamUser, getTeamUsers } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
const schema = z.object({
...pagingParams,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -19,9 +20,11 @@ export async function GET(request: Request, { params }: { params: Promise<{ team
const { teamId } = await params;
if (!(await canViewTeam(auth, teamId))) {
- return unauthorized('You must be the owner of this team.');
+ return unauthorized({ message: 'You must be a member of this team.' });
}
+ const filters = await getQueryFilters(query);
+
const users = await getTeamUsers(
{
where: {
@@ -38,8 +41,11 @@ export async function GET(request: Request, { params }: { params: Promise<{ team
},
},
},
+ orderBy: {
+ createdAt: 'asc',
+ },
},
- query,
+ filters,
);
return json(users);
@@ -47,8 +53,8 @@ export async function GET(request: Request, { params }: { params: Promise<{ team
export async function POST(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
const schema = z.object({
- userId: z.string().uuid(),
- role: roleParam,
+ userId: z.uuid(),
+ role: teamRoleParam,
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -59,8 +65,8 @@ export async function POST(request: Request, { params }: { params: Promise<{ tea
const { teamId } = await params;
- if (!(await canAddUserToTeam(auth))) {
- return unauthorized();
+ if (!(await canUpdateTeam(auth, teamId))) {
+ return unauthorized({ message: 'You must be the owner/manager of this team.' });
}
const { userId, role } = body;
@@ -68,7 +74,7 @@ export async function POST(request: Request, { params }: { params: Promise<{ tea
const teamUser = await getTeamUser(teamId, userId);
if (teamUser) {
- return badRequest('User is already a member of the Team.');
+ return badRequest({ message: 'User is already a member of the Team.' });
}
const users = await createTeamUser(userId, teamId, role);
diff --git a/src/app/api/teams/[teamId]/websites/route.ts b/src/app/api/teams/[teamId]/websites/route.ts
index f69ab4658..05c6d8045 100644
--- a/src/app/api/teams/[teamId]/websites/route.ts
+++ b/src/app/api/teams/[teamId]/websites/route.ts
@@ -1,13 +1,14 @@
import { z } from 'zod';
-import { unauthorized, json } from '@/lib/response';
-import { canViewTeam } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
-import { pagingParams } from '@/lib/schema';
-import { getTeamWebsites } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewTeam } from '@/permissions';
+import { getTeamWebsites } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) {
const schema = z.object({
...pagingParams,
+ ...searchParams,
});
const { teamId } = await params;
const { auth, query, error } = await parseRequest(request, schema);
@@ -20,7 +21,9 @@ export async function GET(request: Request, { params }: { params: Promise<{ team
return unauthorized();
}
- const websites = await getTeamWebsites(teamId, query);
+ const filters = await getQueryFilters(query);
+
+ const websites = await getTeamWebsites(teamId, filters);
return json(websites);
}
diff --git a/src/app/api/teams/join/route.ts b/src/app/api/teams/join/route.ts
index 3464054cf..3ce0913f7 100644
--- a/src/app/api/teams/join/route.ts
+++ b/src/app/api/teams/join/route.ts
@@ -1,9 +1,8 @@
import { z } from 'zod';
-import { unauthorized, json, badRequest, notFound } from '@/lib/response';
-import { canCreateTeam } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
import { ROLES } from '@/lib/constants';
-import { createTeamUser, findTeam, getTeamUser } from '@/queries';
+import { parseRequest } from '@/lib/request';
+import { badRequest, json, notFound } from '@/lib/response';
+import { createTeamUser, findTeam, getTeamUser } from '@/queries/prisma';
export async function POST(request: Request) {
const schema = z.object({
@@ -16,10 +15,6 @@ export async function POST(request: Request) {
return error();
}
- if (!(await canCreateTeam(auth))) {
- return unauthorized();
- }
-
const { accessCode } = body;
const team = await findTeam({
@@ -29,13 +24,13 @@ export async function POST(request: Request) {
});
if (!team) {
- return notFound('Team not found.');
+ return notFound({ message: 'Team not found.', code: 'team-not-found' });
}
const teamUser = await getTeamUser(team.id, auth.user.id);
if (teamUser) {
- return badRequest('User is already a team member.');
+ return badRequest({ message: 'User is already a team member.' });
}
const user = await createTeamUser(auth.user.id, team.id, ROLES.teamMember);
diff --git a/src/app/api/teams/route.ts b/src/app/api/teams/route.ts
index d319d87b8..2e2424a2f 100644
--- a/src/app/api/teams/route.ts
+++ b/src/app/api/teams/route.ts
@@ -1,14 +1,36 @@
import { z } from 'zod';
-import { getRandomChars } from '@/lib/crypto';
-import { unauthorized, json } from '@/lib/response';
-import { canCreateTeam } from '@/lib/auth';
import { uuid } from '@/lib/crypto';
-import { parseRequest } from '@/lib/request';
-import { createTeam } from '@/queries';
+import { getRandomChars } from '@/lib/generate';
+import { fetchAccount } from '@/lib/load';
+import redis from '@/lib/redis';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams } from '@/lib/schema';
+import { canCreateTeam } from '@/permissions';
+import { createTeam, getUserTeams } from '@/queries/prisma';
+
+export async function GET(request: Request) {
+ const schema = z.object({
+ ...pagingParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const filters = await getQueryFilters(query);
+
+ const teams = await getUserTeams(auth.user.id, filters);
+
+ return json(teams);
+}
export async function POST(request: Request) {
const schema = z.object({
name: z.string().max(50),
+ ownerId: z.uuid().optional(),
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -21,16 +43,37 @@ export async function POST(request: Request) {
return unauthorized();
}
- const { name } = body;
+ const { name, ownerId } = body;
+
+ const teamId = uuid();
+ const teamOwnerId = ownerId ?? auth.user.id;
const team = await createTeam(
{
- id: uuid(),
+ id: teamId,
name,
accessCode: `team_${getRandomChars(16)}`,
},
- auth.user.id,
+ teamOwnerId,
);
+ if (process.env.CLOUD_MODE && redis.enabled) {
+ const account = await fetchAccount(teamOwnerId);
+
+ if (account) {
+ await redis.client.set(
+ `team:${teamId}`,
+ {
+ teamOwnerId,
+ isPro: account.isPro || false,
+ isBusiness: account.isBusiness || false,
+ isNoBilling: account.isNoBilling || false,
+ hasSubscription: account.hasSubscription || false,
+ },
+ 60 * 60 * 24 * 90,
+ );
+ }
+ }
+
return json(team);
}
diff --git a/src/app/api/users/[userId]/route.ts b/src/app/api/users/[userId]/route.ts
index d011783c4..383f0ffac 100644
--- a/src/app/api/users/[userId]/route.ts
+++ b/src/app/api/users/[userId]/route.ts
@@ -1,8 +1,10 @@
-import { canDeleteUser, canUpdateUser, canViewUser, hashPassword } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
-import { badRequest, json, ok, unauthorized } from '@/lib/response';
-import { deleteUser, getUser, getUserByUsername, updateUser } from '@/queries';
import { z } from 'zod';
+import { hashPassword } from '@/lib/password';
+import { parseRequest } from '@/lib/request';
+import { badRequest, json, notFound, ok, unauthorized } from '@/lib/response';
+import { userRoleParam } from '@/lib/schema';
+import { canDeleteUser, canUpdateUser, canViewUser } from '@/permissions';
+import { deleteUser, getUser, getUserByUsername, updateUser } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const { auth, error } = await parseRequest(request);
@@ -22,14 +24,14 @@ export async function GET(request: Request, { params }: { params: Promise<{ user
return json(user);
}
-export async function POST(request: Request, { params }: { params: Promise<{ userId: string }> }) {
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ userId: string }> },
+) {
const schema = z.object({
- username: z.string().max(255),
- password: z.string().max(255).optional(),
- role: z
- .string()
- .regex(/admin|user|view-only/i)
- .optional(),
+ username: z.string().max(255).optional(),
+ password: z.string().min(8).max(255).optional(),
+ role: userRoleParam.optional(),
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -48,6 +50,10 @@ export async function POST(request: Request, { params }: { params: Promise<{ use
const user = await getUser(userId);
+ if (!user) {
+ return notFound();
+ }
+
const data: any = {};
if (password) {
@@ -60,15 +66,15 @@ export async function POST(request: Request, { params }: { params: Promise<{ use
}
if (username && auth.user.isAdmin) {
- data.username = username;
+ data.username = username.toLowerCase();
}
// Check when username changes
if (data.username && user.username !== data.username) {
- const user = await getUserByUsername(username);
+ const existingUser = await getUserByUsername(username);
- if (user) {
- return badRequest('User already exists');
+ if (existingUser && existingUser.id !== userId) {
+ return badRequest({ message: "User already exists" });
}
}
@@ -94,7 +100,7 @@ export async function DELETE(
}
if (userId === auth.user.id) {
- return badRequest('You cannot delete yourself.');
+ return badRequest({ message: "You cannot delete yourself." });
}
await deleteUser(userId);
diff --git a/src/app/api/users/[userId]/teams/route.ts b/src/app/api/users/[userId]/teams/route.ts
index ff6595250..7a834a3f1 100644
--- a/src/app/api/users/[userId]/teams/route.ts
+++ b/src/app/api/users/[userId]/teams/route.ts
@@ -1,8 +1,8 @@
import { z } from 'zod';
-import { pagingParams } from '@/lib/schema';
-import { getUserTeams } from '@/queries';
-import { unauthorized, json } from '@/lib/response';
import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams } from '@/lib/schema';
+import { getUserTeams } from '@/queries/prisma';
export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const schema = z.object({
diff --git a/src/app/api/users/[userId]/usage/route.ts b/src/app/api/users/[userId]/usage/route.ts
deleted file mode 100644
index e6ff217d6..000000000
--- a/src/app/api/users/[userId]/usage/route.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { z } from 'zod';
-import { json, unauthorized } from '@/lib/response';
-import { getAllUserWebsitesIncludingTeamOwner } from '@/queries/prisma/website';
-import { getEventUsage } from '@/queries/sql/events/getEventUsage';
-import { getEventDataUsage } from '@/queries/sql/events/getEventDataUsage';
-import { parseRequest } from '@/lib/request';
-
-export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
- const schema = z.object({
- startAt: z.coerce.number().int(),
- endAt: z.coerce.number().int(),
- });
-
- const { auth, query, error } = await parseRequest(request, schema);
-
- if (error) {
- return error();
- }
-
- if (!auth.user.isAdmin) {
- return unauthorized();
- }
-
- const { userId } = await params;
- const { startAt, endAt } = query;
-
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
-
- const websites = await getAllUserWebsitesIncludingTeamOwner(userId);
-
- const websiteIds = websites.map(a => a.id);
-
- const websiteEventUsage = await getEventUsage(websiteIds, startDate, endDate);
- const eventDataUsage = await getEventDataUsage(websiteIds, startDate, endDate);
-
- const websiteUsage = websites.map(a => ({
- websiteId: a.id,
- websiteName: a.name,
- websiteEventUsage: websiteEventUsage.find(b => a.id === b.websiteId)?.count || 0,
- eventDataUsage: eventDataUsage.find(b => a.id === b.websiteId)?.count || 0,
- deletedAt: a.deletedAt,
- }));
-
- const usage = websiteUsage.reduce(
- (acc, cv) => {
- acc.websiteEventUsage += cv.websiteEventUsage;
- acc.eventDataUsage += cv.eventDataUsage;
-
- return acc;
- },
- { websiteEventUsage: 0, eventDataUsage: 0 },
- );
-
- const filteredWebsiteUsage = websiteUsage.filter(
- a => !a.deletedAt && (a.websiteEventUsage > 0 || a.eventDataUsage > 0),
- );
-
- return json({
- ...usage,
- websites: filteredWebsiteUsage,
- });
-}
diff --git a/src/app/api/users/[userId]/websites/route.ts b/src/app/api/users/[userId]/websites/route.ts
index 77d410845..1107d8e16 100644
--- a/src/app/api/users/[userId]/websites/route.ts
+++ b/src/app/api/users/[userId]/websites/route.ts
@@ -1,12 +1,14 @@
import { z } from 'zod';
-import { unauthorized, json } from '@/lib/response';
-import { getUserWebsites } from '@/queries/prisma/website';
-import { pagingParams } from '@/lib/schema';
-import { parseRequest } from '@/lib/request';
+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';
export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const schema = z.object({
...pagingParams,
+ ...searchParams,
+ includeTeams: z.string().optional(),
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -21,7 +23,11 @@ export async function GET(request: Request, { params }: { params: Promise<{ user
return unauthorized();
}
- const websites = await getUserWebsites(userId, query);
+ const filters = await getQueryFilters(query);
- return json(websites);
+ if (query.includeTeams) {
+ return json(await getAllUserWebsitesIncludingTeamOwner(userId, filters));
+ }
+
+ return json(await getUserWebsites(userId, filters));
}
diff --git a/src/app/api/users/route.ts b/src/app/api/users/route.ts
index c5896f892..d70faba06 100644
--- a/src/app/api/users/route.ts
+++ b/src/app/api/users/route.ts
@@ -1,17 +1,19 @@
import { z } from 'zod';
-import { hashPassword, canCreateUser } from '@/lib/auth';
import { ROLES } from '@/lib/constants';
import { uuid } from '@/lib/crypto';
+import { hashPassword } from '@/lib/password';
import { parseRequest } from '@/lib/request';
-import { unauthorized, json, badRequest } from '@/lib/response';
-import { createUser, getUserByUsername } from '@/queries';
+import { badRequest, json, unauthorized } from '@/lib/response';
+import { userRoleParam } from '@/lib/schema';
+import { canCreateUser } from '@/permissions';
+import { createUser, getUserByUsername } from '@/queries/prisma';
export async function POST(request: Request) {
const schema = z.object({
- id: z.string().uuid().optional(),
+ id: z.uuid().optional(),
username: z.string().max(255),
- password: z.string(),
- role: z.string().regex(/admin|user|view-only/i),
+ password: z.string().min(8).max(255),
+ role: userRoleParam,
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -26,15 +28,17 @@ export async function POST(request: Request) {
const { id, username, password, role } = body;
- const existingUser = await getUserByUsername(username, { showDeleted: true });
+ const existingUser = await getUserByUsername(username, {
+ showDeleted: true,
+ });
if (existingUser) {
- return badRequest('User already exists');
+ return badRequest({ message: "User already exists" });
}
const user = await createUser({
id: id || uuid(),
- username,
+ username: username.toLowerCase(),
password: hashPassword(password),
role: role ?? ROLES.user,
});
diff --git a/src/app/api/websites/[websiteId]/active/route.ts b/src/app/api/websites/[websiteId]/active/route.ts
index 88c0fd178..233b97e50 100644
--- a/src/app/api/websites/[websiteId]/active/route.ts
+++ b/src/app/api/websites/[websiteId]/active/route.ts
@@ -1,7 +1,7 @@
-import { canViewWebsite } from '@/lib/auth';
-import { json, unauthorized } from '@/lib/response';
-import { getActiveVisitors } from '@/queries';
import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getActiveVisitors } from '@/queries/sql';
export async function GET(
request: Request,
@@ -19,7 +19,7 @@ export async function GET(
return unauthorized();
}
- const result = await getActiveVisitors(websiteId);
+ const visitors = await getActiveVisitors(websiteId);
- return json(result);
+ return json(visitors);
}
diff --git a/src/app/api/websites/[websiteId]/daterange/route.ts b/src/app/api/websites/[websiteId]/daterange/route.ts
index ea2d10d2c..14a241fd9 100644
--- a/src/app/api/websites/[websiteId]/daterange/route.ts
+++ b/src/app/api/websites/[websiteId]/daterange/route.ts
@@ -1,7 +1,7 @@
-import { canViewWebsite } from '@/lib/auth';
-import { getWebsiteDateRange } from '@/queries';
-import { json, unauthorized } from '@/lib/response';
import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteDateRange } from '@/queries/sql';
export async function GET(
request: Request,
@@ -19,7 +19,7 @@ export async function GET(
return unauthorized();
}
- const result = await getWebsiteDateRange(websiteId);
+ const dateRange = await getWebsiteDateRange(websiteId);
- return json(result);
+ return json(dateRange);
}
diff --git a/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts b/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts
new file mode 100644
index 000000000..e640f1b6f
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts
@@ -0,0 +1,25 @@
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getEventDataById } from '@/queries/sql/events/getEventDataById';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string; eventId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId, eventId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const data = await getEventDataById(websiteId, eventId);
+
+ return json(data);
+}
diff --git a/src/app/api/websites/[websiteId]/event-data/events/route.ts b/src/app/api/websites/[websiteId]/event-data/events/route.ts
index aec7b4713..eb6ee6ed8 100644
--- a/src/app/api/websites/[websiteId]/event-data/events/route.ts
+++ b/src/app/api/websites/[websiteId]/event-data/events/route.ts
@@ -1,7 +1,8 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
import { getEventDataEvents } from '@/queries/sql/events/getEventDataEvents';
export async function GET(
@@ -12,6 +13,7 @@ export async function GET(
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
event: z.string().optional(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -20,19 +22,15 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt, event } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
const data = await getEventDataEvents(websiteId, {
- startDate,
- endDate,
- event,
+ ...filters,
});
return json(data);
diff --git a/src/app/api/websites/[websiteId]/event-data/fields/route.ts b/src/app/api/websites/[websiteId]/event-data/fields/route.ts
index 60101e45c..bce6a977c 100644
--- a/src/app/api/websites/[websiteId]/event-data/fields/route.ts
+++ b/src/app/api/websites/[websiteId]/event-data/fields/route.ts
@@ -1,8 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getEventDataFields } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventDataFields } from '@/queries/sql';
export async function GET(
request: Request,
@@ -11,6 +12,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -20,19 +22,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getEventDataFields(websiteId, {
- startDate,
- endDate,
- });
+ const data = await getEventDataFields(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/event-data/properties/route.ts b/src/app/api/websites/[websiteId]/event-data/properties/route.ts
index fe085f74e..52d15cfbd 100644
--- a/src/app/api/websites/[websiteId]/event-data/properties/route.ts
+++ b/src/app/api/websites/[websiteId]/event-data/properties/route.ts
@@ -1,8 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getEventDataProperties } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventDataProperties } from '@/queries/sql';
export async function GET(
request: Request,
@@ -11,7 +12,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
- propertyName: z.string().optional(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -21,16 +22,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt, propertyName } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getEventDataProperties(websiteId, { startDate, endDate, propertyName });
+ const data = await getEventDataProperties(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/event-data/route.ts b/src/app/api/websites/[websiteId]/event-data/route.ts
new file mode 100644
index 000000000..2d0caf65e
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/event-data/route.ts
@@ -0,0 +1,50 @@
+import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventData } from '@/queries/sql/events/getEventData';
+
+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(),
+ ...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 filters = await getQueryFilters(query, websiteId);
+
+ const { data: rows, count, page, pageSize } = await getEventData(websiteId, filters);
+
+ const eventMap = new Map<
+ string,
+ { websiteId: string; eventId: string; eventName: string; eventProperties: object[] }
+ >();
+
+ for (const { websiteId, eventId, eventName, ...props } of rows) {
+ let entry = eventMap.get(eventId);
+ if (!entry) {
+ entry = { websiteId, eventId, eventName, eventProperties: [] };
+ eventMap.set(eventId, entry);
+ }
+ entry.eventProperties.push(props);
+ }
+
+ return json({ data: [...eventMap.values()], count, page, pageSize });
+}
\ No newline at end of file
diff --git a/src/app/api/websites/[websiteId]/event-data/stats/route.ts b/src/app/api/websites/[websiteId]/event-data/stats/route.ts
index 6928aa1e6..042e989a4 100644
--- a/src/app/api/websites/[websiteId]/event-data/stats/route.ts
+++ b/src/app/api/websites/[websiteId]/event-data/stats/route.ts
@@ -1,8 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getEventDataStats } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventDataStats } from '@/queries/sql';
export async function GET(
request: Request,
@@ -11,7 +12,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
- propertyName: z.string().optional(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -21,16 +22,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getEventDataStats(websiteId, { startDate, endDate });
+ const data = await getEventDataStats(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/event-data/values/route.ts b/src/app/api/websites/[websiteId]/event-data/values/route.ts
index 2a912439c..12e8f2dc0 100644
--- a/src/app/api/websites/[websiteId]/event-data/values/route.ts
+++ b/src/app/api/websites/[websiteId]/event-data/values/route.ts
@@ -1,8 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getEventDataValues } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventDataValues } from '@/queries/sql';
export async function GET(
request: Request,
@@ -11,8 +12,9 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
- eventName: z.string().optional(),
- propertyName: z.string().optional(),
+ event: z.string(),
+ propertyName: z.string(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -22,19 +24,16 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt, eventName, propertyName } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const { propertyName } = query;
+ const filters = await getQueryFilters(query, websiteId);
const data = await getEventDataValues(websiteId, {
- startDate,
- endDate,
- eventName,
+ ...filters,
propertyName,
});
diff --git a/src/app/api/websites/[websiteId]/events/route.ts b/src/app/api/websites/[websiteId]/events/route.ts
index 66eaba2c0..583e4abbf 100644
--- a/src/app/api/websites/[websiteId]/events/route.ts
+++ b/src/app/api/websites/[websiteId]/events/route.ts
@@ -1,18 +1,17 @@
-import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { pagingParams } from '@/lib/schema';
-import { getWebsiteEvents } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteEvents } 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(),
+ const schema = withDateRange({
+ ...filterParams,
...pagingParams,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -22,16 +21,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getWebsiteEvents(websiteId, { startDate, endDate }, query);
+ const data = await getWebsiteEvents(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/events/series/route.ts b/src/app/api/websites/[websiteId]/events/series/route.ts
index a30741c6e..6060105c2 100644
--- a/src/app/api/websites/[websiteId]/events/series/route.ts
+++ b/src/app/api/websites/[websiteId]/events/series/route.ts
@@ -1,9 +1,9 @@
import { z } from 'zod';
-import { parseRequest, getRequestDateRange, getRequestFilters } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
-import { getEventStats } from '@/queries';
+import { canViewWebsite } from '@/permissions';
+import { getEventStats } from '@/queries/sql';
export async function GET(
request: Request,
@@ -12,8 +12,9 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
- unit: unitParam,
+ unit: unitParam.optional(),
timezone: timezoneParam,
+ limit: z.coerce.number().optional(),
...filterParams,
});
@@ -24,22 +25,15 @@ export async function GET(
}
const { websiteId } = await params;
- const { timezone } = query;
- const { startDate, endDate, unit } = await getRequestDateRange(query);
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const filters = {
- ...(await getRequestFilters(query)),
- startDate,
- endDate,
- timezone,
- unit,
- };
+ const { limit } = query;
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getEventStats(websiteId, filters);
+ const data = await getEventStats(websiteId, { limit }, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/events/stats/route.ts b/src/app/api/websites/[websiteId]/events/stats/route.ts
new file mode 100644
index 000000000..fceb97cbd
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/events/stats/route.ts
@@ -0,0 +1,45 @@
+import { getCompareDate } from '@/lib/date';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteEventStats } from '@/queries/sql/events/getWebsiteEventStats';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = withDateRange({
+ ...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 filters = await getQueryFilters(query, websiteId);
+
+ const data = await getWebsiteEventStats(websiteId, filters);
+
+ const { startDate, endDate } = getCompareDate(
+ filters.compare ?? 'prev',
+ filters.startDate,
+ filters.endDate,
+ );
+
+ const comparison = await getWebsiteEventStats(websiteId, {
+ ...filters,
+ startDate,
+ endDate,
+ });
+
+ return json({ data: { ...data, comparison } });
+}
diff --git a/src/app/api/websites/[websiteId]/export/route.ts b/src/app/api/websites/[websiteId]/export/route.ts
index 534fd2298..1beb9bcb2 100644
--- a/src/app/api/websites/[websiteId]/export/route.ts
+++ b/src/app/api/websites/[websiteId]/export/route.ts
@@ -1,19 +1,16 @@
-import { z } from 'zod';
import JSZip from 'jszip';
import Papa from 'papaparse';
-import { getRequestFilters, parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { pagingParams } from '@/lib/schema';
-import { getEventMetrics, getPageviewMetrics, getSessionMetrics } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getEventMetrics, getPageviewMetrics, getSessionMetrics } 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(),
+ const schema = withDateRange({
...pagingParams,
});
@@ -24,29 +21,21 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
-
- const filters = {
- ...(await getRequestFilters(query)),
- startDate,
- endDate,
- };
+ const filters = await getQueryFilters(query, websiteId);
const [events, pages, referrers, browsers, os, devices, countries] = await Promise.all([
- getEventMetrics(websiteId, 'event', filters),
- getPageviewMetrics(websiteId, 'url', filters),
- getPageviewMetrics(websiteId, 'referrer', filters),
- getSessionMetrics(websiteId, 'browser', filters),
- getSessionMetrics(websiteId, 'os', filters),
- getSessionMetrics(websiteId, 'device', filters),
- getSessionMetrics(websiteId, 'country', filters),
+ getEventMetrics(websiteId, { type: 'event' }, filters),
+ getPageviewMetrics(websiteId, { type: 'path' }, filters),
+ getPageviewMetrics(websiteId, { type: 'referrer' }, filters),
+ getSessionMetrics(websiteId, { type: 'browser' }, filters),
+ getSessionMetrics(websiteId, { type: 'os' }, filters),
+ getSessionMetrics(websiteId, { type: 'device' }, filters),
+ getSessionMetrics(websiteId, { type: 'country' }, filters),
]);
const zip = new JSZip();
diff --git a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts
new file mode 100644
index 000000000..34ebcd598
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts
@@ -0,0 +1,65 @@
+import { z } from 'zod';
+import { EVENT_COLUMNS, EVENT_TYPE, SESSION_COLUMNS } from '@/lib/constants';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { badRequest, json, unauthorized } from '@/lib/response';
+import { filterParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import {
+ getChannelExpandedMetrics,
+ getEventExpandedMetrics,
+ getPageviewExpandedMetrics,
+ getSessionExpandedMetrics,
+} from '@/queries/sql';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = withDateRange({
+ type: z.string(),
+ limit: z.coerce.number().optional(),
+ offset: z.coerce.number().optional(),
+ ...searchParams,
+ ...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 { type, limit, offset, search } = query;
+ const filters = await getQueryFilters(query, websiteId);
+
+ if (search) {
+ filters[type] = `c.${search}`;
+ }
+
+ if (SESSION_COLUMNS.includes(type)) {
+ const data = await getSessionExpandedMetrics(websiteId, { type, limit, offset }, filters);
+
+ return json(data);
+ }
+
+ if (EVENT_COLUMNS.includes(type)) {
+ if (type === 'event') {
+ filters.eventType = EVENT_TYPE.customEvent;
+ return json(await getEventExpandedMetrics(websiteId, { type, limit, offset }, filters));
+ } else {
+ return json(await getPageviewExpandedMetrics(websiteId, { type, limit, offset }, filters));
+ }
+ }
+
+ if (type === 'channel') {
+ return json(await getChannelExpandedMetrics(websiteId, filters));
+ }
+
+ return badRequest();
+}
diff --git a/src/app/api/websites/[websiteId]/metrics/route.ts b/src/app/api/websites/[websiteId]/metrics/route.ts
index 488f85fcd..c9649ae9a 100644
--- a/src/app/api/websites/[websiteId]/metrics/route.ts
+++ b/src/app/api/websites/[websiteId]/metrics/route.ts
@@ -1,39 +1,25 @@
import { z } from 'zod';
-import thenby from 'thenby';
-import { canViewWebsite } from '@/lib/auth';
-import {
- SESSION_COLUMNS,
- EVENT_COLUMNS,
- FILTER_COLUMNS,
- OPERATORS,
- SEARCH_DOMAINS,
- SOCIAL_DOMAINS,
- EMAIL_DOMAINS,
- SHOPPING_DOMAINS,
- VIDEO_DOMAINS,
- PAID_AD_PARAMS,
-} from '@/lib/constants';
-import { getRequestFilters, getRequestDateRange, parseRequest } from '@/lib/request';
-import { json, unauthorized, badRequest } from '@/lib/response';
+import { EVENT_COLUMNS, EVENT_TYPE, SESSION_COLUMNS } from '@/lib/constants';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { badRequest, json, unauthorized } from '@/lib/response';
+import { filterParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
import {
+ getChannelMetrics,
+ getEventMetrics,
getPageviewMetrics,
getSessionMetrics,
- getEventMetrics,
- getChannelMetrics,
-} from '@/queries';
-import { filterParams } from '@/lib/schema';
+} from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
- const schema = z.object({
+ const schema = withDateRange({
type: z.string(),
- startAt: z.coerce.number().int(),
- endAt: z.coerce.number().int(),
limit: z.coerce.number().optional(),
offset: z.coerce.number().optional(),
- search: z.string().optional(),
+ ...searchParams,
...filterParams,
});
@@ -44,135 +30,36 @@ export async function GET(
}
const { websiteId } = await params;
- const { type, limit, offset, search } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const { startDate, endDate } = await getRequestDateRange(query);
- const column = FILTER_COLUMNS[type] || type;
- const filters = {
- ...(await getRequestFilters(query)),
- startDate,
- endDate,
- };
+ const { type, limit, offset, search } = query;
+ const filters = await getQueryFilters(query, websiteId);
if (search) {
- filters[type] = {
- name: type,
- column,
- operator: OPERATORS.contains,
- value: search,
- };
+ filters[type] = `c.${search}`;
}
if (SESSION_COLUMNS.includes(type)) {
- const data = await getSessionMetrics(websiteId, type, filters, limit, offset);
-
- if (type === 'language') {
- const combined = {};
-
- for (const { x, y } of data) {
- const key = String(x).toLowerCase().split('-')[0];
-
- if (combined[key] === undefined) {
- combined[key] = { x: key, y };
- } else {
- combined[key].y += y;
- }
- }
-
- return json(Object.values(combined));
- }
+ const data = await getSessionMetrics(websiteId, { type, limit, offset }, filters);
return json(data);
}
if (EVENT_COLUMNS.includes(type)) {
- let data;
-
if (type === 'event') {
- data = await getEventMetrics(websiteId, type, filters, limit, offset);
+ filters.eventType = EVENT_TYPE.customEvent;
+ return json(await getEventMetrics(websiteId, { type, limit, offset }, filters));
} else {
- data = await getPageviewMetrics(websiteId, type, filters, limit, offset);
+ return json(await getPageviewMetrics(websiteId, { type, limit, offset }, filters));
}
-
- return json(data);
}
if (type === 'channel') {
- const data = await getChannelMetrics(websiteId, filters);
-
- const channels = getChannels(data);
-
- return json(
- Object.keys(channels)
- .map(key => ({ x: key, y: channels[key] }))
- .sort(thenby.firstBy('y', -1)),
- );
+ return json(await getChannelMetrics(websiteId, filters));
}
return badRequest();
}
-
-function getChannels(data: { domain: string; query: string; visitors: number }[]) {
- const channels = {
- direct: 0,
- referral: 0,
- affiliate: 0,
- email: 0,
- sms: 0,
- organicSearch: 0,
- organicSocial: 0,
- organicShopping: 0,
- organicVideo: 0,
- paidAds: 0,
- paidSearch: 0,
- paidSocial: 0,
- paidShopping: 0,
- paidVideo: 0,
- };
-
- const match = (value: string) => {
- return (str: string | RegExp) => {
- return typeof str === 'string' ? value?.includes(str) : (str as RegExp).test(value);
- };
- };
-
- for (const { domain, query, visitors } of data) {
- if (!domain && !query) {
- channels.direct += Number(visitors);
- }
-
- const prefix = /utm_medium=(.*cp.*|ppc|retargeting|paid.*)/.test(query) ? 'paid' : 'organic';
-
- if (PAID_AD_PARAMS.some(match(query))) {
- channels.paidAds += Number(visitors);
- } else if (/utm_medium=(referral|app|link)/.test(query)) {
- channels.referral += Number(visitors);
- } else if (/utm_medium=affiliate/.test(query)) {
- channels.affiliate += Number(visitors);
- } else if (/utm_(source|medium)=sms/.test(query)) {
- channels.sms += Number(visitors);
- } else if (SEARCH_DOMAINS.some(match(domain)) || /utm_medium=organic/.test(query)) {
- channels[`${prefix}Search`] += Number(visitors);
- } else if (
- SOCIAL_DOMAINS.some(match(domain)) ||
- /utm_medium=(social|social-network|social-media|sm|social network|social media)/.test(query)
- ) {
- channels[`${prefix}Social`] += Number(visitors);
- } else if (EMAIL_DOMAINS.some(match(domain)) || /utm_medium=(.*e[-_ ]?mail.*)/.test(query)) {
- channels.email += Number(visitors);
- } else if (
- SHOPPING_DOMAINS.some(match(domain)) ||
- /utm_campaign=(.*(([^a-df-z]|^)shop|shopping).*)/.test(query)
- ) {
- channels[`${prefix}Shopping`] += Number(visitors);
- } else if (VIDEO_DOMAINS.some(match(domain)) || /utm_medium=(.*video.*)/.test(query)) {
- channels[`${prefix}Video`] += Number(visitors);
- }
- }
-
- return channels;
-}
diff --git a/src/app/api/websites/[websiteId]/pageviews/route.ts b/src/app/api/websites/[websiteId]/pageviews/route.ts
index eaa618797..b9945c87b 100644
--- a/src/app/api/websites/[websiteId]/pageviews/route.ts
+++ b/src/app/api/websites/[websiteId]/pageviews/route.ts
@@ -1,21 +1,15 @@
-import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { getRequestFilters, getRequestDateRange, parseRequest } from '@/lib/request';
-import { unitParam, timezoneParam, filterParams } from '@/lib/schema';
import { getCompareDate } from '@/lib/date';
-import { unauthorized, json } from '@/lib/response';
-import { getPageviewStats, getSessionStats } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getPageviewStats, getSessionStats } 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(),
- unit: unitParam,
- timezone: timezoneParam,
- compare: z.string().optional(),
+ const schema = withDateRange({
...filterParams,
});
@@ -26,32 +20,23 @@ export async function GET(
}
const { websiteId } = await params;
- const { timezone, compare } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const { startDate, endDate, unit } = await getRequestDateRange(query);
-
- const filters = {
- ...(await getRequestFilters(query)),
- startDate,
- endDate,
- timezone,
- unit,
- };
+ const filters = await getQueryFilters(query, websiteId);
const [pageviews, sessions] = await Promise.all([
getPageviewStats(websiteId, filters),
getSessionStats(websiteId, filters),
]);
- if (compare) {
+ if (filters.compare) {
const { startDate: compareStartDate, endDate: compareEndDate } = getCompareDate(
- compare,
- startDate,
- endDate,
+ filters.compare,
+ filters.startDate,
+ filters.endDate,
);
const [comparePageviews, compareSessions] = await Promise.all([
@@ -70,8 +55,8 @@ export async function GET(
return json({
pageviews,
sessions,
- startDate,
- endDate,
+ startDate: filters.startDate,
+ endDate: filters.endDate,
compare: {
pageviews: comparePageviews,
sessions: compareSessions,
diff --git a/src/app/api/websites/[websiteId]/replays/[replayId]/route.ts b/src/app/api/websites/[websiteId]/replays/[replayId]/route.ts
new file mode 100644
index 000000000..eb030c163
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/replays/[replayId]/route.ts
@@ -0,0 +1,37 @@
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getReplayChunks } from '@/queries/sql';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string; replayId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId, replayId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const chunks = await getReplayChunks(websiteId, replayId);
+
+ const allEvents = chunks.flatMap(chunk => chunk.events);
+ const sessionId = chunks.length > 0 ? chunks[0].sessionId : null;
+ const startedAt = chunks.length > 0 ? chunks[0].startedAt : null;
+ const endedAt = chunks.length > 0 ? chunks[chunks.length - 1].endedAt : null;
+
+ return json({
+ sessionId,
+ events: allEvents,
+ startedAt,
+ endedAt,
+ eventCount: allEvents.length,
+ chunkCount: chunks.length,
+ });
+}
diff --git a/src/app/api/websites/[websiteId]/replays/route.ts b/src/app/api/websites/[websiteId]/replays/route.ts
new file mode 100644
index 000000000..fb38a0178
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/replays/route.ts
@@ -0,0 +1,34 @@
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getSessionReplays } from '@/queries/sql';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = withDateRange({
+ ...filterParams,
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const filters = await getQueryFilters(query, websiteId);
+
+ const data = await getSessionReplays(websiteId, filters);
+
+ return json(data);
+}
diff --git a/src/app/api/websites/[websiteId]/replays/saved/[replayId]/route.ts b/src/app/api/websites/[websiteId]/replays/saved/[replayId]/route.ts
new file mode 100644
index 000000000..2212d9d08
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/replays/saved/[replayId]/route.ts
@@ -0,0 +1,60 @@
+import { z } from 'zod';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canUpdateWebsite, canViewWebsite } from '@/permissions';
+import {
+ createReplaySaved,
+ deleteReplaySaved,
+ getReplaySaved,
+} from '@/queries/prisma/sessionReplay';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string; replayId: string }> },
+) {
+ const { auth, error } = await parseRequest(request);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId, replayId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const isSaved = await getReplaySaved(websiteId, replayId);
+
+ return json({ isSaved });
+}
+
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string; replayId: string }> },
+) {
+ const schema = z.object({
+ isSaved: z.boolean(),
+ name: z.string().max(100).optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId, replayId } = await params;
+
+ if (!(await canUpdateWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ if (body.isSaved) {
+ await createReplaySaved(websiteId, replayId, body.name ?? '');
+ } else {
+ await deleteReplaySaved(websiteId, replayId);
+ }
+
+ return json({ ok: true });
+}
diff --git a/src/app/api/websites/[websiteId]/replays/saved/route.ts b/src/app/api/websites/[websiteId]/replays/saved/route.ts
new file mode 100644
index 000000000..aca134d2c
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/replays/saved/route.ts
@@ -0,0 +1,32 @@
+import { z } from 'zod';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getSavedReplays } from '@/queries/prisma/sessionReplay';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const data = await getSavedReplays(websiteId, query);
+
+ return json(data);
+}
diff --git a/src/app/api/websites/[websiteId]/reports/route.ts b/src/app/api/websites/[websiteId]/reports/route.ts
index c6941f537..0e4e404ec 100644
--- a/src/app/api/websites/[websiteId]/reports/route.ts
+++ b/src/app/api/websites/[websiteId]/reports/route.ts
@@ -1,15 +1,16 @@
import { z } from 'zod';
-import { canViewWebsite } from '@/lib/auth';
-import { getWebsiteReports } from '@/queries';
-import { pagingParams } from '@/lib/schema';
import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, reportTypeParam } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getReports } from '@/queries/prisma';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
+ type: reportTypeParam.optional(),
...pagingParams,
});
@@ -20,17 +21,25 @@ export async function GET(
}
const { websiteId } = await params;
- const { page, pageSize, search } = query;
+ const { type, page, pageSize, search } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const data = await getWebsiteReports(websiteId, {
- page: +page,
- pageSize: +pageSize,
- search,
- });
+ const data = await getReports(
+ {
+ where: {
+ websiteId,
+ type,
+ },
+ },
+ {
+ page,
+ pageSize,
+ search,
+ },
+ );
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/reset/route.ts b/src/app/api/websites/[websiteId]/reset/route.ts
index 62edceeae..e0be5a53e 100644
--- a/src/app/api/websites/[websiteId]/reset/route.ts
+++ b/src/app/api/websites/[websiteId]/reset/route.ts
@@ -1,7 +1,7 @@
-import { canUpdateWebsite } from '@/lib/auth';
-import { resetWebsite } from '@/queries';
-import { unauthorized, ok } from '@/lib/response';
import { parseRequest } from '@/lib/request';
+import { ok, unauthorized } from '@/lib/response';
+import { canUpdateWebsite } from '@/permissions';
+import { resetWebsite } from '@/queries/prisma';
export async function POST(
request: Request,
diff --git a/src/app/api/websites/[websiteId]/revenue/sessions/route.ts b/src/app/api/websites/[websiteId]/revenue/sessions/route.ts
new file mode 100644
index 000000000..78fad488e
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/revenue/sessions/route.ts
@@ -0,0 +1,37 @@
+import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getRevenueSessions } from '@/queries/sql/reports/getRevenueSessions';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = withDateRange({
+ currency: z.string(),
+ ...filterParams,
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const { currency, ...rest } = query;
+ const filters = await getQueryFilters(rest, websiteId);
+
+ const data = await getRevenueSessions(websiteId, currency, filters);
+
+ return json(data);
+}
diff --git a/src/app/api/websites/[websiteId]/route.ts b/src/app/api/websites/[websiteId]/route.ts
index 4f8763b56..c74d018a3 100644
--- a/src/app/api/websites/[websiteId]/route.ts
+++ b/src/app/api/websites/[websiteId]/route.ts
@@ -1,9 +1,17 @@
import { z } from 'zod';
-import { canUpdateWebsite, canDeleteWebsite, canViewWebsite } from '@/lib/auth';
-import { SHARE_ID_REGEX } from '@/lib/constants';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { uuid } from '@/lib/crypto';
import { parseRequest } from '@/lib/request';
-import { ok, json, unauthorized, serverError } from '@/lib/response';
-import { deleteWebsite, getWebsite, updateWebsite } from '@/queries';
+import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response';
+import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions';
+import {
+ createShare,
+ deleteSharesByEntityId,
+ deleteWebsite,
+ getShareByEntityId,
+ getWebsite,
+ updateWebsite,
+} from '@/queries/prisma';
export async function GET(
request: Request,
@@ -33,7 +41,17 @@ export async function POST(
const schema = z.object({
name: z.string().optional(),
domain: z.string().optional(),
- shareId: z.string().regex(SHARE_ID_REGEX).nullable().optional(),
+ shareId: z.string().max(50).nullable().optional(),
+ replayEnabled: z.boolean().optional(),
+ replayConfig: z
+ .object({
+ sampleRate: z.number().min(0).max(1).optional(),
+ maskLevel: z.enum(['strict', 'moderate']).optional(),
+ maxDuration: z.number().int().positive().optional(),
+ blockSelector: z.string().optional(),
+ })
+ .nullable()
+ .optional(),
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -43,19 +61,42 @@ export async function POST(
}
const { websiteId } = await params;
- const { name, domain, shareId } = body;
+ const { name, domain, shareId, replayEnabled, replayConfig } = body;
if (!(await canUpdateWebsite(auth, websiteId))) {
return unauthorized();
}
try {
- const website = await updateWebsite(websiteId, { name, domain, shareId });
+ const website = await updateWebsite(websiteId, {
+ name,
+ domain,
+ ...(replayEnabled !== undefined && { replayEnabled }),
+ ...(replayConfig !== undefined && { replayConfig }),
+ });
- return Response.json(website);
+ if (shareId === null) {
+ await deleteSharesByEntityId(website.id);
+ }
+
+ const share = shareId
+ ? await createShare({
+ id: uuid(),
+ entityId: websiteId,
+ shareType: ENTITY_TYPE.website,
+ name: website.name,
+ slug: shareId,
+ parameters: { overview: true, events: true },
+ })
+ : await getShareByEntityId(websiteId);
+
+ return json({
+ ...website,
+ shareId: share?.slug ?? null,
+ });
} catch (e: any) {
- if (e.message.includes('Unique constraint') && e.message.includes('share_id')) {
- return serverError(new Error('That share ID is already taken.'));
+ if (e.message.toLowerCase().includes('unique constraint')) {
+ return badRequest({ message: 'That share ID is already taken.' });
}
return serverError(e);
diff --git a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts
index fd2442cbc..045125550 100644
--- a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts
+++ b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts
@@ -1,9 +1,9 @@
-import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/lib/auth';
+import { z } from 'zod';
import { parseRequest } from '@/lib/request';
import { json, notFound, ok, unauthorized } from '@/lib/response';
-import { segmentTypeParam } from '@/lib/schema';
-import { deleteSegment, getSegment, updateSegment } from '@/queries';
-import { z } from 'zod';
+import { anyObjectParam, segmentTypeParam } from '@/lib/schema';
+import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions';
+import { deleteSegment, getWebsiteSegment, updateSegment } from '@/queries/prisma';
export async function GET(
request: Request,
@@ -17,12 +17,16 @@ export async function GET(
const { websiteId, segmentId } = await params;
- const segment = await getSegment(segmentId);
-
- if (websiteId && !(await canViewWebsite(auth, websiteId))) {
+ if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
+ const segment = await getWebsiteSegment(websiteId, segmentId);
+
+ if (!segment) {
+ return notFound();
+ }
+
return json(segment);
}
@@ -33,7 +37,7 @@ export async function POST(
const schema = z.object({
type: segmentTypeParam,
name: z.string().max(200),
- parameters: z.object({}).passthrough(),
+ parameters: anyObjectParam,
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -45,16 +49,16 @@ export async function POST(
const { websiteId, segmentId } = await params;
const { type, name, parameters } = body;
- const segment = await getSegment(segmentId);
+ if (!(await canUpdateWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const segment = await getWebsiteSegment(websiteId, segmentId);
if (!segment) {
return notFound();
}
- if (!(await canUpdateWebsite(auth, websiteId))) {
- return unauthorized();
- }
-
const result = await updateSegment(segmentId, {
type,
name,
@@ -76,16 +80,16 @@ export async function DELETE(
const { websiteId, segmentId } = await params;
- const segment = await getSegment(segmentId);
+ if (!(await canDeleteWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const segment = await getWebsiteSegment(websiteId, segmentId);
if (!segment) {
return notFound();
}
- if (!(await canDeleteWebsite(auth, websiteId))) {
- return unauthorized();
- }
-
await deleteSegment(segmentId);
return ok();
diff --git a/src/app/api/websites/[websiteId]/segments/route.ts b/src/app/api/websites/[websiteId]/segments/route.ts
index 2cf8388fe..db34193ed 100644
--- a/src/app/api/websites/[websiteId]/segments/route.ts
+++ b/src/app/api/websites/[websiteId]/segments/route.ts
@@ -1,10 +1,10 @@
-import { canUpdateWebsite, canViewWebsite } from '@/lib/auth';
-import { uuid } from '@/lib/crypto';
-import { parseRequest } from '@/lib/request';
-import { json, unauthorized } from '@/lib/response';
-import { segmentTypeParam } from '@/lib/schema';
-import { createSegment, getWebsiteSegments } from '@/queries';
import { z } from 'zod';
+import { uuid } from '@/lib/crypto';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { searchParams, segmentParamSchema, segmentTypeParam } from '@/lib/schema';
+import { canUpdateWebsite, canViewWebsite } from '@/permissions';
+import { createSegment, getWebsiteSegments } from '@/queries/prisma';
export async function GET(
request: Request,
@@ -12,6 +12,7 @@ export async function GET(
) {
const schema = z.object({
type: segmentTypeParam,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -27,7 +28,9 @@ export async function GET(
return unauthorized();
}
- const segments = await getWebsiteSegments(websiteId, type);
+ const filters = await getQueryFilters(query);
+
+ const segments = await getWebsiteSegments(websiteId, type, filters);
return json(segments);
}
@@ -39,7 +42,7 @@ export async function POST(
const schema = z.object({
type: segmentTypeParam,
name: z.string().max(200),
- parameters: z.object({}).passthrough(),
+ parameters: segmentParamSchema,
});
const { auth, body, error } = await parseRequest(request, schema);
diff --git a/src/app/api/websites/[websiteId]/session-data/properties/route.ts b/src/app/api/websites/[websiteId]/session-data/properties/route.ts
index a6d9e2a4a..2d8db1535 100644
--- a/src/app/api/websites/[websiteId]/session-data/properties/route.ts
+++ b/src/app/api/websites/[websiteId]/session-data/properties/route.ts
@@ -1,8 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getSessionDataProperties } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getSessionDataProperties } from '@/queries/sql';
export async function GET(
request: Request,
@@ -11,7 +12,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
- propertyName: z.string().optional(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -20,17 +21,15 @@ export async function GET(
return error();
}
- const { startAt, endAt, propertyName } = query;
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getSessionDataProperties(websiteId, { startDate, endDate, propertyName });
+ const data = await getSessionDataProperties(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/session-data/values/route.ts b/src/app/api/websites/[websiteId]/session-data/values/route.ts
index d950da340..7d06870ac 100644
--- a/src/app/api/websites/[websiteId]/session-data/values/route.ts
+++ b/src/app/api/websites/[websiteId]/session-data/values/route.ts
@@ -1,8 +1,9 @@
-import { canViewWebsite } from '@/lib/auth';
-import { parseRequest } from '@/lib/request';
-import { json, unauthorized } from '@/lib/response';
-import { getSessionDataValues } from '@/queries';
import { z } from 'zod';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getSessionDataValues } from '@/queries/sql';
export async function GET(
request: Request,
@@ -12,6 +13,7 @@ export async function GET(
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string().optional(),
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -20,19 +22,17 @@ export async function GET(
return error();
}
- const { startAt, endAt, propertyName } = query;
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const { propertyName } = query;
+ const filters = await getQueryFilters(query, websiteId);
const data = await getSessionDataValues(websiteId, {
- startDate,
- endDate,
+ ...filters,
propertyName,
});
diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts
index aac40c38f..41b766d03 100644
--- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts
@@ -1,8 +1,8 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getSessionActivity } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getSessionActivity } from '@/queries/sql';
export async function GET(
request: Request,
@@ -20,16 +20,14 @@ export async function GET(
}
const { websiteId, sessionId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getSessionActivity(websiteId, sessionId, startDate, endDate);
+ const data = await getSessionActivity(websiteId, sessionId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts
index 9c389c827..6b5c2418a 100644
--- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts
@@ -1,7 +1,7 @@
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getSessionData } from '@/queries';
import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getSessionData } from '@/queries/sql';
export async function GET(
request: Request,
diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/replays/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/replays/route.ts
new file mode 100644
index 000000000..b71ff46a9
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/replays/route.ts
@@ -0,0 +1,33 @@
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { pagingParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getSessionReplays } from '@/queries/sql';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string; sessionId: string }> },
+) {
+ const schema = withDateRange({
+ ...pagingParams,
+ ...searchParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId, sessionId } = await params;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const filters = await getQueryFilters(query, websiteId);
+
+ const data = await getSessionReplays(websiteId, filters, sessionId);
+
+ return json(data);
+}
diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts
index c4621ef42..109166370 100644
--- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts
@@ -1,7 +1,7 @@
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { getWebsiteSession } from '@/queries';
import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteSession } from '@/queries/sql';
export async function GET(
request: Request,
diff --git a/src/app/api/websites/[websiteId]/sessions/route.ts b/src/app/api/websites/[websiteId]/sessions/route.ts
index 5a14f00f7..88199aff9 100644
--- a/src/app/api/websites/[websiteId]/sessions/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/route.ts
@@ -1,18 +1,17 @@
-import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { pagingParams } from '@/lib/schema';
-import { getWebsiteSessions } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, pagingParams, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteSessions } 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(),
+ const schema = withDateRange({
+ ...filterParams,
...pagingParams,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -22,16 +21,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getWebsiteSessions(websiteId, { startDate, endDate }, query);
+ const data = await getWebsiteSessions(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/sessions/stats/route.ts b/src/app/api/websites/[websiteId]/sessions/stats/route.ts
index 8ea62ae89..459830edf 100644
--- a/src/app/api/websites/[websiteId]/sessions/stats/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/stats/route.ts
@@ -1,9 +1,9 @@
import { z } from 'zod';
-import { parseRequest, getRequestDateRange, getRequestFilters } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
import { filterParams } from '@/lib/schema';
-import { getWebsiteSessionStats } from '@/queries';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteSessionStats } from '@/queries/sql';
export async function GET(
request: Request,
@@ -27,15 +27,9 @@ export async function GET(
return unauthorized();
}
- const { startDate, endDate } = await getRequestDateRange(query);
+ const filters = await getQueryFilters(query, websiteId);
- const filters = await getRequestFilters(query);
-
- const metrics = await getWebsiteSessionStats(websiteId, {
- ...filters,
- startDate,
- endDate,
- });
+ const metrics = await getWebsiteSessionStats(websiteId, filters);
const data = Object.keys(metrics[0]).reduce((obj, key) => {
obj[key] = {
diff --git a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts
index 20be378d7..b9ccf3ef0 100644
--- a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts
+++ b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts
@@ -1,9 +1,9 @@
import { z } from 'zod';
-import { parseRequest } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
-import { pagingParams, timezoneParam } from '@/lib/schema';
-import { getWebsiteSessionsWeekly } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, timezoneParam } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWeeklyTraffic } from '@/queries/sql';
export async function GET(
request: Request,
@@ -13,7 +13,7 @@ export async function GET(
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
timezone: timezoneParam,
- ...pagingParams,
+ ...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -23,16 +23,14 @@ export async function GET(
}
const { websiteId } = await params;
- const { startAt, endAt, timezone } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const startDate = new Date(+startAt);
- const endDate = new Date(+endAt);
+ const filters = await getQueryFilters(query, websiteId);
- const data = await getWebsiteSessionsWeekly(websiteId, { startDate, endDate, timezone });
+ const data = await getWeeklyTraffic(websiteId, filters);
return json(data);
}
diff --git a/src/app/api/websites/[websiteId]/shares/route.ts b/src/app/api/websites/[websiteId]/shares/route.ts
new file mode 100644
index 000000000..65d53771d
--- /dev/null
+++ b/src/app/api/websites/[websiteId]/shares/route.ts
@@ -0,0 +1,77 @@
+import { z } from 'zod';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { uuid } from '@/lib/crypto';
+import { getRandomChars } from '@/lib/generate';
+import { parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { anyObjectParam, filterParams, pagingParams } from '@/lib/schema';
+import { canUpdateWebsite, canViewWebsite } from '@/permissions';
+import { createShare, getSharesByEntityId } from '@/queries/prisma';
+
+export async function GET(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = z.object({
+ ...filterParams,
+ ...pagingParams,
+ });
+
+ const { auth, query, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = await params;
+ const { page, pageSize, search } = query;
+
+ if (!(await canViewWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const data = await getSharesByEntityId(websiteId, {
+ page,
+ pageSize,
+ search,
+ });
+
+ return json(data);
+}
+
+export async function POST(
+ request: Request,
+ { params }: { params: Promise<{ websiteId: string }> },
+) {
+ const schema = z.object({
+ name: z.string().max(200),
+ parameters: anyObjectParam.optional(),
+ });
+
+ const { auth, body, error } = await parseRequest(request, schema);
+
+ if (error) {
+ return error();
+ }
+
+ const { websiteId } = await params;
+ const { name, parameters } = body;
+ const shareParameters = parameters ?? {};
+
+ if (!(await canUpdateWebsite(auth, websiteId))) {
+ return unauthorized();
+ }
+
+ const slug = getRandomChars(16);
+
+ const share = await createShare({
+ id: uuid(),
+ entityId: websiteId,
+ shareType: ENTITY_TYPE.website,
+ name,
+ slug,
+ parameters: shareParameters,
+ });
+
+ return json(share);
+}
diff --git a/src/app/api/websites/[websiteId]/stats/route.ts b/src/app/api/websites/[websiteId]/stats/route.ts
index ffe9a3672..bb060e41f 100644
--- a/src/app/api/websites/[websiteId]/stats/route.ts
+++ b/src/app/api/websites/[websiteId]/stats/route.ts
@@ -1,19 +1,15 @@
-import { z } from 'zod';
-import { parseRequest, getRequestDateRange, getRequestFilters } from '@/lib/request';
-import { unauthorized, json } from '@/lib/response';
-import { canViewWebsite } from '@/lib/auth';
import { getCompareDate } from '@/lib/date';
-import { filterParams } from '@/lib/schema';
-import { getWebsiteStats } from '@/queries';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+import { json, unauthorized } from '@/lib/response';
+import { filterParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteStats } 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(),
- compare: z.string().optional(),
+ const schema = withDateRange({
...filterParams,
});
@@ -24,40 +20,26 @@ export async function GET(
}
const { websiteId } = await params;
- const { compare } = query;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- const { startDate, endDate } = await getRequestDateRange(query);
- const { startDate: compareStartDate, endDate: compareEndDate } = getCompareDate(
- compare,
- startDate,
- endDate,
+ const filters = await getQueryFilters(query, websiteId);
+
+ const data = await getWebsiteStats(websiteId, filters);
+
+ const { startDate, endDate } = getCompareDate(
+ filters.compare ?? 'prev',
+ filters.startDate,
+ filters.endDate,
);
- const filters = await getRequestFilters(query);
-
- const metrics = await getWebsiteStats(websiteId, {
+ const comparison = await getWebsiteStats(websiteId, {
...filters,
startDate,
endDate,
});
- const prevPeriod = await getWebsiteStats(websiteId, {
- ...filters,
- startDate: compareStartDate,
- endDate: compareEndDate,
- });
-
- const stats = Object.keys(metrics[0]).reduce((obj, key) => {
- obj[key] = {
- value: Number(metrics[0][key]) || 0,
- prev: Number(prevPeriod[0][key]) || 0,
- };
- return obj;
- }, {});
-
- return json(stats);
+ return json({ ...data, comparison });
}
diff --git a/src/app/api/websites/[websiteId]/transfer/route.ts b/src/app/api/websites/[websiteId]/transfer/route.ts
index 03c0ae7f4..df2fed20d 100644
--- a/src/app/api/websites/[websiteId]/transfer/route.ts
+++ b/src/app/api/websites/[websiteId]/transfer/route.ts
@@ -1,16 +1,16 @@
import { z } from 'zod';
-import { canTransferWebsiteToTeam, canTransferWebsiteToUser } from '@/lib/auth';
-import { updateWebsite } from '@/queries';
import { parseRequest } from '@/lib/request';
-import { badRequest, unauthorized, json } from '@/lib/response';
+import { badRequest, json, unauthorized } from '@/lib/response';
+import { canTransferWebsiteToTeam, canTransferWebsiteToUser } from '@/permissions';
+import { updateWebsite } from '@/queries/prisma';
export async function POST(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
- userId: z.string().uuid().optional(),
- teamId: z.string().uuid().optional(),
+ userId: z.uuid().optional(),
+ teamId: z.uuid().optional(),
});
const { auth, body, error } = await parseRequest(request, schema);
diff --git a/src/app/api/websites/[websiteId]/values/route.ts b/src/app/api/websites/[websiteId]/values/route.ts
index 561c62fe3..f07e60f3d 100644
--- a/src/app/api/websites/[websiteId]/values/route.ts
+++ b/src/app/api/websites/[websiteId]/values/route.ts
@@ -1,19 +1,18 @@
-import { canViewWebsite } from '@/lib/auth';
-import { EVENT_COLUMNS, FILTER_COLUMNS, FILTER_GROUPS, SESSION_COLUMNS } from '@/lib/constants';
-import { getRequestDateRange, parseRequest } from '@/lib/request';
+import { EVENT_COLUMNS, FILTER_COLUMNS, SEGMENT_TYPES, SESSION_COLUMNS } from '@/lib/constants';
+import { getQueryFilters, parseRequest } from '@/lib/request';
import { badRequest, json, unauthorized } from '@/lib/response';
-import { getWebsiteSegments, getValues } from '@/queries';
-import { z } from 'zod';
+import { fieldsParam, searchParams, withDateRange } from '@/lib/schema';
+import { canViewWebsite } from '@/permissions';
+import { getWebsiteSegments } from '@/queries/prisma';
+import { getValues } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
- const schema = z.object({
- type: z.string(),
- startAt: z.coerce.number().int(),
- endAt: z.coerce.number().int(),
- search: z.string().optional(),
+ const schema = withDateRange({
+ type: fieldsParam,
+ ...searchParams,
});
const { auth, query, error } = await parseRequest(request, schema);
@@ -23,23 +22,26 @@ export async function GET(
}
const { websiteId } = await params;
- const { type, search } = query;
- const { startDate, endDate } = await getRequestDateRange(query);
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
- if (!SESSION_COLUMNS.includes(type) && !EVENT_COLUMNS.includes(type) && !FILTER_GROUPS[type]) {
- return badRequest('Invalid type.');
+ const { type } = query;
+
+ if (!SESSION_COLUMNS.includes(type) && !EVENT_COLUMNS.includes(type) && !SEGMENT_TYPES[type]) {
+ return badRequest();
}
- let values;
+ let values: any[];
- if (FILTER_GROUPS[type]) {
- values = (await getWebsiteSegments(websiteId, type)).map(segment => ({ value: segment.name }));
+ if (SEGMENT_TYPES[type]) {
+ values = (await getWebsiteSegments(websiteId, type))?.data?.map(segment => ({
+ value: segment.name,
+ }));
} else {
- values = await getValues(websiteId, FILTER_COLUMNS[type], startDate, endDate, search);
+ const filters = await getQueryFilters(query, websiteId);
+ values = await getValues(websiteId, FILTER_COLUMNS[type], filters);
}
return json(values.filter(n => n).sort());
diff --git a/src/app/api/websites/route.ts b/src/app/api/websites/route.ts
index 7a2146f87..d54aeac62 100644
--- a/src/app/api/websites/route.ts
+++ b/src/app/api/websites/route.ts
@@ -1,13 +1,22 @@
import { z } from 'zod';
-import { canCreateTeamWebsite, canCreateWebsite } from '@/lib/auth';
-import { json, unauthorized } from '@/lib/response';
+import { ENTITY_TYPE } from '@/lib/constants';
import { uuid } from '@/lib/crypto';
-import { parseRequest } from '@/lib/request';
-import { createWebsite, getUserWebsites } from '@/queries';
-import { pagingParams } from '@/lib/schema';
+import { fetchAccount } from '@/lib/load';
+import { getQueryFilters, parseRequest } from '@/lib/request';
+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';
+
+const CLOUD_WEBSITE_LIMIT = 3;
export async function GET(request: Request) {
- const schema = z.object({ ...pagingParams });
+ const schema = z.object({
+ ...pagingParams,
+ ...searchParams,
+ includeTeams: z.string().optional(),
+ });
const { auth, query, error } = await parseRequest(request, schema);
@@ -15,9 +24,15 @@ export async function GET(request: Request) {
return error();
}
- const websites = await getUserWebsites(auth.user.id, query);
+ const userId = auth.user.id;
- return json(websites);
+ const filters = await getQueryFilters(query);
+
+ if (query.includeTeams) {
+ return json(await getAllUserWebsitesIncludingTeamOwner(userId, filters));
+ }
+
+ return json(await getUserWebsites(userId, filters));
}
export async function POST(request: Request) {
@@ -25,8 +40,8 @@ export async function POST(request: Request) {
name: z.string().max(100),
domain: z.string().max(500),
shareId: z.string().max(50).nullable().optional(),
- teamId: z.string().nullable().optional(),
- id: z.string().uuid().nullable().optional(),
+ teamId: z.uuid().nullable().optional(),
+ id: z.uuid().nullable().optional(),
});
const { auth, body, error } = await parseRequest(request, schema);
@@ -37,6 +52,18 @@ export async function POST(request: Request) {
const { id, name, domain, shareId, teamId } = body;
+ if (process.env.CLOUD_MODE && !teamId) {
+ const account = await fetchAccount(auth.user.id);
+
+ if (!account?.hasSubscription) {
+ const count = await getWebsiteCount(auth.user.id);
+
+ if (count >= CLOUD_WEBSITE_LIMIT) {
+ return unauthorized({ message: 'Website limit reached.' });
+ }
+ }
+ }
+
if ((teamId && !(await canCreateTeamWebsite(auth, teamId))) || !(await canCreateWebsite(auth))) {
return unauthorized();
}
@@ -46,7 +73,6 @@ export async function POST(request: Request) {
createdBy: auth.user.id,
name,
domain,
- shareId,
teamId,
};
@@ -56,5 +82,19 @@ export async function POST(request: Request) {
const website = await createWebsite(data);
- return json(website);
+ const share = shareId
+ ? await createShare({
+ id: uuid(),
+ entityId: website.id,
+ shareType: ENTITY_TYPE.website,
+ name: website.name,
+ slug: shareId,
+ parameters: { overview: true, events: true },
+ })
+ : null;
+
+ return json({
+ ...website,
+ shareId: share?.slug ?? null,
+ });
}
diff --git a/src/app/global.css b/src/app/global.css
new file mode 100644
index 000000000..cbf11ae67
--- /dev/null
+++ b/src/app/global.css
@@ -0,0 +1,75 @@
+:root {
+ --font-family: var(--font-inter), sans-serif;
+ --primary: oklch(62.3% 0.214 259.815);
+ --primary-foreground: oklch(98.5% 0 0);
+}
+
+html,
+body {
+ font-family: var(--font-family), sans-serif;
+ font-size: 14px;
+ color: var(--text-primary);
+ background-color: var(--surface-raised);
+ width: 100%;
+ min-height: 100vh;
+}
+
+html[style*="padding-right"] {
+ padding-right: 0 !important;
+}
+
+::-webkit-scrollbar {
+ width: 15px;
+ background: transparent;
+}
+
+::-webkit-scrollbar-track {
+ border: 7px solid rgba(0, 0, 0, 0);
+ background-color: var(--border-default);
+ background-clip: padding-box;
+}
+
+::-webkit-scrollbar-thumb {
+ border: 7px solid rgba(0, 0, 0, 0);
+ background-color: var(--text-disabled);
+ border-radius: var(--border-radius-full);
+ background-clip: padding-box;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ border: 4px solid rgba(0, 0, 0, 0);
+ background-clip: padding-box;
+}
+
+/* Fix autofill background color to match dark theme */
+input:-webkit-autofill,
+input:-webkit-autofill:hover,
+input:-webkit-autofill:focus,
+input:-webkit-autofill:active,
+textarea:-webkit-autofill,
+textarea:-webkit-autofill:hover,
+textarea:-webkit-autofill:focus,
+select:-webkit-autofill,
+select:-webkit-autofill:hover,
+select:-webkit-autofill:focus {
+ -webkit-box-shadow: 0 0 0 1000px var(--background-color) inset !important;
+ transition: color 5000s ease-in-out 0s;
+}
+
+/* Code snippet textareas */
+.code-textarea textarea {
+ min-height: 100px;
+}
+
+/* rrweb-player overrides */
+.rr-controller__btns {
+ gap: 8px;
+}
+
+[data-theme="dark"] .rr-controller__btns button {
+ color: black;
+}
+
+[data-theme="dark"] .rr-controller__btns .label {
+ color: black;
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index e939f8c44..0cd4363b5 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,12 +1,17 @@
-import { Metadata } from 'next';
-import Providers from './Providers';
-import '@fontsource/inter/300.css';
-import '@fontsource/inter/400.css';
-import '@fontsource/inter/500.css';
-import '@fontsource/inter/700.css';
-import 'react-basics/dist/styles.css';
-import '@/styles/index.css';
-import '@/styles/variables.css';
+import type { Metadata } from 'next';
+import { headers } from 'next/headers';
+import { Inter } from 'next/font/google';
+import { Suspense } from 'react';
+import { getBaseUrl } from '@/lib/get-base-url';
+import { Providers } from './Providers';
+import '@umami/react-zen/styles.full.css';
+import './global.css';
+
+const inter = Inter({
+ subsets: ['latin'],
+ display: 'swap',
+ variable: '--font-inter',
+});
export default function ({ children }) {
if (process.env.DISABLE_UI) {
@@ -18,7 +23,7 @@ export default function ({ children }) {
}
return (
-
+
@@ -31,16 +36,23 @@ export default function ({ children }) {
-
- {children}
+
+
+ {children}
+
);
}
-export const metadata: Metadata = {
- title: {
- template: '%s | Umami',
- default: 'Umami',
- },
-};
+export async function generateMetadata(): Promise {
+ const headerStore = await headers();
+
+ return {
+ metadataBase: getBaseUrl(headerStore),
+ title: {
+ template: '%s | Umami',
+ default: 'Umami',
+ },
+ };
+}
diff --git a/src/app/login/LoginForm.module.css b/src/app/login/LoginForm.module.css
deleted file mode 100644
index 0d3f981f0..000000000
--- a/src/app/login/LoginForm.module.css
+++ /dev/null
@@ -1,33 +0,0 @@
-.login {
- width: 400px;
- margin: auto;
- transform: translateY(-25%);
-}
-
-.form {
- display: flex;
- flex-direction: column;
- margin: 0 auto;
- width: 300px;
-}
-
-.title {
- font-size: 24px;
- font-weight: 700;
- text-align: center;
- margin: 30px 0;
-}
-
-.icon {
- width: 100%;
-}
-
-.icon svg {
- width: 32px;
- height: 32px;
-}
-
-.button {
- flex: 1;
- justify-content: center;
-}
diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx
index a808c622d..23101b947 100644
--- a/src/app/login/LoginForm.tsx
+++ b/src/app/login/LoginForm.tsx
@@ -1,77 +1,70 @@
import {
+ Column,
Form,
- FormRow,
- FormInput,
FormButtons,
- TextField,
- PasswordField,
- SubmitButton,
+ FormField,
+ FormSubmitButton,
+ Heading,
Icon,
-} from 'react-basics';
+ PasswordField,
+ TextField,
+} from '@umami/react-zen';
import { useRouter } from 'next/navigation';
-import { useApi, useMessages } from '@/components/hooks';
-import { setUser } from '@/store/app';
+import { useMessages, useUpdateQuery } from '@/components/hooks';
+import { Logo } from '@/components/svg';
import { setClientAuthToken } from '@/lib/client';
-import Logo from '@/assets/logo.svg';
-import styles from './LoginForm.module.css';
+import { setUser } from '@/store/app';
export function LoginForm() {
- const { formatMessage, labels, getMessage } = useMessages();
+ const { t, labels, getErrorMessage } = useMessages();
const router = useRouter();
- const { post, useMutation } = useApi();
- const { mutate, error, isPending } = useMutation({
- mutationFn: (data: any) => post('/auth/login', data),
- });
+ const { mutateAsync, error } = useUpdateQuery('/auth/login');
const handleSubmit = async (data: any) => {
- mutate(data, {
+ await mutateAsync(data, {
onSuccess: async ({ token, user }) => {
setClientAuthToken(token);
setUser(user);
-
- router.push('/dashboard');
+ router.push('/');
},
});
};
return (
-
+
);
}
-
-export default LoginForm;
diff --git a/src/app/login/LoginPage.module.css b/src/app/login/LoginPage.module.css
deleted file mode 100644
index 45115d5b6..000000000
--- a/src/app/login/LoginPage.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.page {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100vh;
- background: var(--base75);
-}
diff --git a/src/app/login/LoginPage.tsx b/src/app/login/LoginPage.tsx
index 2eca070f9..7bb2e35fc 100644
--- a/src/app/login/LoginPage.tsx
+++ b/src/app/login/LoginPage.tsx
@@ -1,13 +1,17 @@
'use client';
-import LoginForm from './LoginForm';
-import styles from './LoginPage.module.css';
+import { Column } from '@umami/react-zen';
+import { LoginForm } from './LoginForm';
export function LoginPage() {
return (
-
+
-
+
);
}
-
-export default LoginPage;
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
index cca230c20..ea27735ac 100644
--- a/src/app/login/page.tsx
+++ b/src/app/login/page.tsx
@@ -1,8 +1,8 @@
-import { Metadata } from 'next';
-import LoginPage from './LoginPage';
+import type { Metadata } from 'next';
+import { LoginPage } from './LoginPage';
export default async function () {
- if (process.env.DISABLE_LOGIN) {
+ if (process.env.DISABLE_LOGIN || process.env.CLOUD_MODE) {
return null;
}
diff --git a/src/app/logout/LogoutPage.tsx b/src/app/logout/LogoutPage.tsx
index 2914c4eb7..33e1615d2 100644
--- a/src/app/logout/LogoutPage.tsx
+++ b/src/app/logout/LogoutPage.tsx
@@ -1,32 +1,25 @@
'use client';
-import { useEffect } from 'react';
import { useRouter } from 'next/navigation';
+import { useEffect } from 'react';
import { useApi } from '@/components/hooks';
-import { setUser } from '@/store/app';
import { removeClientAuthToken } from '@/lib/client';
+import { setUser } from '@/store/app';
export function LogoutPage() {
const router = useRouter();
const { post } = useApi();
- const disabled = process.env.cloudMode;
useEffect(() => {
async function logout() {
await post('/auth/logout');
+
+ window.location.href = `${process.env.basePath || ''}/login`;
}
- if (!disabled) {
- removeClientAuthToken();
-
- logout();
-
- router.push('/login');
-
- return () => setUser(null);
- }
- }, [disabled, router, post]);
+ removeClientAuthToken();
+ setUser(null);
+ logout();
+ }, [router, post]);
return null;
}
-
-export default LogoutPage;
diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx
index 80a61f52f..20952788a 100644
--- a/src/app/logout/page.tsx
+++ b/src/app/logout/page.tsx
@@ -1,8 +1,8 @@
-import LogoutPage from './LogoutPage';
-import { Metadata } from 'next';
+import type { Metadata } from 'next';
+import { LogoutPage } from './LogoutPage';
export default function () {
- if (process.env.DISABLE_LOGIN) {
+ if (process.env.DISABLE_LOGIN || process.env.CLOUD_MODE) {
return null;
}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index c673e40f4..fe7e70442 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -1,13 +1,13 @@
'use client';
-import { Flexbox } from 'react-basics';
+import { Flexbox } from '@umami/react-zen';
import { useMessages } from '@/components/hooks';
export default function () {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
return (
-
- {formatMessage(labels.pageNotFound)}
+
+ {t(labels.pageNotFound)}
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 4977c99b5..6f0033dff 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,5 +1,19 @@
+'use client';
import { redirect } from 'next/navigation';
+import { useEffect } from 'react';
+import { LAST_TEAM_CONFIG } from '@/lib/constants';
+import { getItem } from '@/lib/storage';
export default function RootPage() {
- redirect('/dashboard');
+ useEffect(() => {
+ const lastTeam = getItem(LAST_TEAM_CONFIG);
+
+ if (lastTeam) {
+ redirect(`/teams/${lastTeam}/websites`);
+ } else {
+ redirect(`/websites`);
+ }
+ }, []);
+
+ return null;
}
diff --git a/src/app/share/ShareProvider.tsx b/src/app/share/ShareProvider.tsx
new file mode 100644
index 000000000..60e989014
--- /dev/null
+++ b/src/app/share/ShareProvider.tsx
@@ -0,0 +1,86 @@
+'use client';
+import { Loading } from '@umami/react-zen';
+import { usePathname, useRouter } from 'next/navigation';
+import { createContext, type ReactNode, useEffect } from 'react';
+import { useShareTokenQuery } from '@/components/hooks';
+import { ENTITY_TYPE } from '@/lib/constants';
+import type { WhiteLabel } from '@/lib/types';
+
+export interface ShareData {
+ shareId: string;
+ slug: string;
+ shareType: number;
+ websiteId?: string;
+ websiteIds?: string[];
+ boardId?: string;
+ pixelId?: string;
+ linkId?: string;
+ parameters: any;
+ token: string;
+ whiteLabel?: WhiteLabel;
+}
+
+export const ShareContext = createContext(null);
+
+const ALL_SECTION_IDS = [
+ 'overview',
+ 'events',
+ 'sessions',
+ 'realtime',
+ 'performance',
+ 'compare',
+ 'breakdown',
+ 'goals',
+ 'funnels',
+ 'journeys',
+ 'retention',
+ 'utm',
+ 'revenue',
+ 'attribution',
+];
+
+function getSharePath(pathname: string) {
+ const segments = pathname.split('/');
+ const firstSegment = segments[3];
+
+ // If first segment looks like a domain name, skip it
+ if (firstSegment?.includes('.')) {
+ return segments[4];
+ }
+
+ return firstSegment;
+}
+
+export function ShareProvider({ slug, children }: { slug: string; children: ReactNode }) {
+ const { share, isLoading, isFetching } = useShareTokenQuery(slug);
+ const router = useRouter();
+ const pathname = usePathname();
+ const path = getSharePath(pathname);
+ const isBoardShare = share?.shareType === ENTITY_TYPE.board;
+ const isWebsiteShare = share?.shareType === ENTITY_TYPE.website;
+
+ const allowedSections = isWebsiteShare && share?.parameters
+ ? ALL_SECTION_IDS.filter(id => share.parameters[id] === true)
+ : [];
+
+ const shouldRedirect = isWebsiteShare &&
+ allowedSections.length === 1 &&
+ allowedSections[0] !== 'overview' &&
+ (path === undefined || path === '' || path === 'overview');
+
+ useEffect(() => {
+ if (shouldRedirect) {
+ router.replace(`/share/${slug}/${allowedSections[0]}`);
+ }
+ }, [shouldRedirect, slug, allowedSections, router]);
+
+ if (isFetching && isLoading) {
+ return ;
+ }
+
+ if (!share || shouldRedirect) {
+ return null;
+ }
+
+ return {children} ;
+}
diff --git a/src/app/share/[...shareId]/Footer.module.css b/src/app/share/[...shareId]/Footer.module.css
deleted file mode 100644
index 5dc2d5841..000000000
--- a/src/app/share/[...shareId]/Footer.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.footer {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: flex-end;
- font-size: var(--font-size-sm);
- height: 100px;
-}
-
-.footer a {
- color: var(--font-color100);
-}
diff --git a/src/app/share/[...shareId]/Footer.tsx b/src/app/share/[...shareId]/Footer.tsx
deleted file mode 100644
index e1ba9833c..000000000
--- a/src/app/share/[...shareId]/Footer.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { CURRENT_VERSION, HOMEPAGE_URL } from '@/lib/constants';
-import styles from './Footer.module.css';
-
-export function Footer() {
- return (
-
- );
-}
-
-export default Footer;
diff --git a/src/app/share/[...shareId]/Header.module.css b/src/app/share/[...shareId]/Header.module.css
deleted file mode 100644
index 9fc946c78..000000000
--- a/src/app/share/[...shareId]/Header.module.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.header {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: space-between;
- width: 100%;
- height: 100px;
-}
-
-.title {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 10px;
- font-size: var(--font-size-lg);
- font-weight: 700;
- color: var(--font-color100) !important;
-}
-
-.buttons {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: flex-end;
-}
-
-@media only screen and (max-width: 992px) {
- .header .buttons {
- flex: 1;
- }
-}
diff --git a/src/app/share/[...shareId]/Header.tsx b/src/app/share/[...shareId]/Header.tsx
deleted file mode 100644
index a71a5b560..000000000
--- a/src/app/share/[...shareId]/Header.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Icon, Text } from 'react-basics';
-import Link from 'next/link';
-import LanguageButton from '@/components/input/LanguageButton';
-import ThemeButton from '@/components/input/ThemeButton';
-import SettingsButton from '@/components/input/SettingsButton';
-import Icons from '@/components/icons';
-import styles from './Header.module.css';
-
-export function Header() {
- return (
-
-
-
-
-
-
- umami
-
-
-
-
-
-
-
-
- );
-}
-
-export default Header;
diff --git a/src/app/share/[...shareId]/SharePage.module.css b/src/app/share/[...shareId]/SharePage.module.css
deleted file mode 100644
index f6c68cf6a..000000000
--- a/src/app/share/[...shareId]/SharePage.module.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.container {
- flex: 1;
- min-height: calc(100vh - 200px);
- min-height: calc(100dvh - 200px);
-}
diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx
deleted file mode 100644
index 00c7ec3f2..000000000
--- a/src/app/share/[...shareId]/SharePage.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-'use client';
-import WebsiteDetailsPage from '../../(main)/websites/[websiteId]/WebsiteDetailsPage';
-import { useShareToken } from '@/components/hooks';
-import Page from '@/components/layout/Page';
-import Header from './Header';
-import Footer from './Footer';
-import styles from './SharePage.module.css';
-import { WebsiteProvider } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-
-export default function SharePage({ shareId }) {
- const { shareToken, isLoading } = useShareToken(shareId);
-
- if (isLoading || !shareToken) {
- return null;
- }
-
- return (
-
- );
-}
diff --git a/src/app/share/[...shareId]/page.tsx b/src/app/share/[...shareId]/page.tsx
deleted file mode 100644
index 548082fb0..000000000
--- a/src/app/share/[...shareId]/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import SharePage from './SharePage';
-
-export default async function ({ params }: { params: Promise<{ shareId: string }> }) {
- const { shareId } = await params;
-
- return ;
-}
diff --git a/src/app/share/[slug]/[[...path]]/ShareBranding.tsx b/src/app/share/[slug]/[[...path]]/ShareBranding.tsx
new file mode 100644
index 000000000..89573b288
--- /dev/null
+++ b/src/app/share/[slug]/[[...path]]/ShareBranding.tsx
@@ -0,0 +1,32 @@
+'use client';
+import { useShare } from '@/components/hooks';
+import { Logo } from '@/components/svg';
+import { Icon, Row, Text } from '@umami/react-zen';
+
+const LOGO_SIZE = { sm: 24, md: 32, lg: 40 };
+const TEXT_SIZE = { sm: 'sm', md: 'base', lg: 'lg' } as const;
+
+export function ShareBranding({ size = 'md' }: { size?: 'sm' | 'md' | 'lg' }) {
+ const share = useShare();
+ const logoDomain = share?.whiteLabel?.domainName || 'https://umami.is';
+ const logoName = share?.whiteLabel?.displayName || 'umami';
+ const logoImage = share?.whiteLabel?.logoUrl;
+ const height = LOGO_SIZE[size];
+
+ return (
+
+
+ {logoImage ? (
+
+ ) : (
+
+
+
+ )}
+
+ {logoName}
+
+
+
+ );
+}
diff --git a/src/app/share/[slug]/[[...path]]/ShareFooter.tsx b/src/app/share/[slug]/[[...path]]/ShareFooter.tsx
new file mode 100644
index 000000000..69177b34c
--- /dev/null
+++ b/src/app/share/[slug]/[[...path]]/ShareFooter.tsx
@@ -0,0 +1,25 @@
+'use client';
+import { useShare } from '@/components/hooks';
+import { Column, Row } from '@umami/react-zen';
+import { ShareBranding } from './ShareBranding';
+
+export function ShareFooter() {
+ const share = useShare();
+
+ if (!share?.whiteLabel) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/share/[slug]/[[...path]]/ShareNav.tsx b/src/app/share/[slug]/[[...path]]/ShareNav.tsx
new file mode 100644
index 000000000..3dd743444
--- /dev/null
+++ b/src/app/share/[slug]/[[...path]]/ShareNav.tsx
@@ -0,0 +1,210 @@
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMessages, useNavigation, useShare } from '@/components/hooks';
+import { AlignEndHorizontal, Clock, Eye, PanelLeft, Sheet, Tag, User } from '@/components/icons';
+import { LanguageButton } from '@/components/input/LanguageButton';
+import { PreferencesButton } from '@/components/input/PreferencesButton';
+import { Funnel, Gauge, Lightning, Magnet, Money, Network, Path, Target } from '@/components/svg';
+import {
+ Button,
+ Column,
+ Focusable,
+ Icon,
+ Row,
+ Text,
+ ThemeButton,
+ Tooltip,
+ TooltipTrigger,
+} from '@umami/react-zen';
+import Link from 'next/link';
+import { ShareBranding } from './ShareBranding';
+
+export function ShareNav({
+ collapsed,
+ onCollapse,
+ onItemClick,
+}: {
+ collapsed?: boolean;
+ onCollapse?: (collapsed: boolean) => void;
+ onItemClick?: () => void;
+}) {
+ const share = useShare();
+ const { t, labels } = useMessages();
+ const { pathname } = useNavigation();
+ const { slug, parameters } = share;
+
+ const renderPath = (path: string) => `/share/${slug}${path}`;
+
+ const allItems = [
+ {
+ section: 'traffic',
+ label: t(labels.traffic),
+ items: [
+ { id: 'overview', label: t(labels.overview), icon: , path: renderPath('') },
+ { id: 'events', label: t(labels.events), icon: , path: renderPath('/events') },
+ {
+ id: 'sessions',
+ label: t(labels.sessions),
+ icon: ,
+ path: renderPath('/sessions'),
+ },
+ {
+ id: 'realtime',
+ label: t(labels.realtime),
+ icon: ,
+ path: renderPath('/realtime'),
+ },
+ {
+ id: 'performance',
+ label: t(labels.performance),
+ icon: ,
+ path: renderPath('/performance'),
+ },
+ {
+ id: 'compare',
+ label: t(labels.compare),
+ icon: ,
+ path: renderPath('/compare'),
+ },
+ {
+ id: 'breakdown',
+ label: t(labels.breakdown),
+ icon: ,
+ path: renderPath('/breakdown'),
+ },
+ ],
+ },
+ {
+ section: 'behavior',
+ label: t(labels.behavior),
+ items: [
+ { id: 'goals', label: t(labels.goals), icon: , path: renderPath('/goals') },
+ { id: 'funnels', label: t(labels.funnels), icon: , path: renderPath('/funnels') },
+ {
+ id: 'journeys',
+ label: t(labels.journeys),
+ icon: ,
+ path: renderPath('/journeys'),
+ },
+ {
+ id: 'retention',
+ label: t(labels.retention),
+ icon: ,
+ path: renderPath('/retention'),
+ },
+ ],
+ },
+ {
+ section: 'growth',
+ label: t(labels.growth),
+ items: [
+ { id: 'utm', label: t(labels.utm), icon: , path: renderPath('/utm') },
+ { id: 'revenue', label: t(labels.revenue), icon: , path: renderPath('/revenue') },
+ {
+ id: 'attribution',
+ label: t(labels.attribution),
+ icon: ,
+ path: renderPath('/attribution'),
+ },
+ ],
+ },
+ ];
+
+ // Filter items based on parameters
+ const items = allItems
+ .map(section => ({
+ label: section.label,
+ items: section.items.filter(item => parameters[item.id] === true),
+ }))
+ .filter(section => section.items.length > 0);
+
+ const selectedKey = items
+ .flatMap(e => e.items)
+ .find(({ path }) => path && pathname.endsWith(path.split('?')[0]))?.id;
+
+ const isMobile = !!onItemClick;
+
+ return (
+
+
+ {!collapsed && }
+ {!onItemClick && (
+ onCollapse?.(!collapsed)}>
+
+
+
+
+ )}
+
+
+ {items.map(({ label: sectionLabel, items: sectionItems }, index) => (
+
+ {!collapsed && (
+
+ {sectionLabel}
+
+ )}
+ {sectionItems.map(({ id, path, label, icon }) => {
+ const isSelected = selectedKey === id;
+ return (
+
+
+
+
+
+
+
+ {label}
+
+
+ );
+ })}
+
+ ))}
+
+
+ {collapsed ? (
+
+
+
+
+
+ ) : (
+
+
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/share/[slug]/[[...path]]/SharePage.tsx b/src/app/share/[slug]/[[...path]]/SharePage.tsx
new file mode 100644
index 000000000..750097aa1
--- /dev/null
+++ b/src/app/share/[slug]/[[...path]]/SharePage.tsx
@@ -0,0 +1,137 @@
+'use client';
+import { BoardViewPage } from '@/app/(main)/boards/[boardId]/BoardViewPage';
+import { LinkPage } from '@/app/(main)/links/[linkId]/LinkPage';
+import { PixelPage } from '@/app/(main)/pixels/[pixelId]/PixelPage';
+import { AttributionPage } from '@/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage';
+import { BreakdownPage } from '@/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage';
+import { FunnelsPage } from '@/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage';
+import { GoalsPage } from '@/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage';
+import { JourneysPage } from '@/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage';
+import { RetentionPage } from '@/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage';
+import { RevenuePage } from '@/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage';
+import { UTMPage } from '@/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage';
+import { PerformancePage } from '@/app/(main)/websites/[websiteId]/(reports)/performance/PerformancePage';
+import { ComparePage } from '@/app/(main)/websites/[websiteId]/compare/ComparePage';
+import { EventsPage } from '@/app/(main)/websites/[websiteId]/events/EventsPage';
+import { RealtimePage } from '@/app/(main)/websites/[websiteId]/realtime/RealtimePage';
+import { SessionsPage } from '@/app/(main)/websites/[websiteId]/sessions/SessionsPage';
+import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader';
+import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage';
+import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider';
+import { PageBody } from '@/components/common/PageBody';
+import { useShare } from '@/components/hooks';
+import { MobileMenuButton } from '@/components/input/MobileMenuButton';
+import { ENTITY_TYPE } from '@/lib/constants';
+import { Column, Grid, Row, useTheme } from '@umami/react-zen';
+import { usePathname, useRouter } from 'next/navigation';
+import { useEffect, useState } from 'react';
+import { ShareFooter } from './ShareFooter';
+import { ShareNav } from './ShareNav';
+
+const PAGE_COMPONENTS: Record> = {
+ '': WebsitePage,
+ overview: WebsitePage,
+ events: EventsPage,
+ sessions: SessionsPage,
+ realtime: RealtimePage,
+ performance: PerformancePage,
+ compare: ComparePage,
+ breakdown: BreakdownPage,
+ goals: GoalsPage,
+ funnels: FunnelsPage,
+ journeys: JourneysPage,
+ retention: RetentionPage,
+ utm: UTMPage,
+ revenue: RevenuePage,
+ attribution: AttributionPage,
+};
+
+function getSharePath(pathname: string) {
+ const segments = pathname.split('/');
+ const firstSegment = segments[3];
+
+ // If first segment looks like a domain name, skip it
+ if (firstSegment?.includes('.')) {
+ return segments[4];
+ }
+
+ return firstSegment;
+}
+
+export function SharePage() {
+ const [navCollapsed, setNavCollapsed] = useState(
+ () => typeof window !== 'undefined' && localStorage.getItem('share:navCollapsed') === 'true',
+ );
+
+ const handleCollapse = (value: boolean) => {
+ localStorage.setItem('share:navCollapsed', String(value));
+ setNavCollapsed(value);
+ };
+ const share = useShare();
+ const { setTheme } = useTheme();
+ const router = useRouter();
+ const pathname = usePathname();
+ const path = getSharePath(pathname);
+ const { slug, websiteId, boardId, pixelId, linkId, parameters = {}, shareType } = share;
+
+ useEffect(() => {
+ const url = new URL(window?.location?.href);
+ const theme = url.searchParams.get('theme');
+
+ if (theme === 'light' || theme === 'dark') {
+ setTheme(theme);
+ }
+ }, [setTheme]);
+
+ const entityPage =
+ shareType === ENTITY_TYPE.board && boardId ? (
+
+ ) : shareType === ENTITY_TYPE.pixel && pixelId ? (
+
+ ) : shareType === ENTITY_TYPE.link && linkId ? (
+
+ ) : null;
+
+ if (entityPage) {
+ return (
+
+ {entityPage}
+
+
+ );
+ }
+
+ // Check if the requested path is allowed
+ const pageKey = path || '';
+ const isAllowed = pageKey === '' || parameters[pageKey] === true;
+
+ if (!isAllowed) {
+ router.replace(`/share/${slug}`);
+ return null;
+ }
+
+ const PageComponent = PAGE_COMPONENTS[pageKey] || WebsitePage;
+
+ return (
+
+
+
+ {({ close }) => {
+ return ;
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/share/[slug]/[[...path]]/page.tsx b/src/app/share/[slug]/[[...path]]/page.tsx
new file mode 100644
index 000000000..872cf2678
--- /dev/null
+++ b/src/app/share/[slug]/[[...path]]/page.tsx
@@ -0,0 +1,5 @@
+import { SharePage } from './SharePage';
+
+export default function () {
+ return ;
+}
diff --git a/src/app/share/[slug]/layout.tsx b/src/app/share/[slug]/layout.tsx
new file mode 100644
index 000000000..7a5f45990
--- /dev/null
+++ b/src/app/share/[slug]/layout.tsx
@@ -0,0 +1,13 @@
+import { ShareProvider } from '@/app/share/ShareProvider';
+
+export default async function ({
+ params,
+ children,
+}: {
+ params: Promise<{ slug: string }>;
+ children: React.ReactNode;
+}) {
+ const { slug } = await params;
+
+ return {children} ;
+}
diff --git a/src/app/sso/SSOPage.tsx b/src/app/sso/SSOPage.tsx
index eb7c0f0a9..3cc950938 100644
--- a/src/app/sso/SSOPage.tsx
+++ b/src/app/sso/SSOPage.tsx
@@ -1,10 +1,10 @@
'use client';
-import { useEffect } from 'react';
-import { Loading } from 'react-basics';
+import { Loading } from '@umami/react-zen';
import { useRouter, useSearchParams } from 'next/navigation';
+import { useEffect } from 'react';
import { setClientAuthToken } from '@/lib/client';
-export default function SSOPage() {
+export function SSOPage() {
const router = useRouter();
const search = useSearchParams();
const url = search.get('url');
@@ -18,5 +18,5 @@ export default function SSOPage() {
}
}, [router, url, token]);
- return ;
+ return ;
}
diff --git a/src/app/sso/page.tsx b/src/app/sso/page.tsx
index 0cfef1a90..f6290d41c 100644
--- a/src/app/sso/page.tsx
+++ b/src/app/sso/page.tsx
@@ -1,5 +1,5 @@
import { Suspense } from 'react';
-import SSOPage from './SSOPage';
+import { SSOPage } from './SSOPage';
export default function () {
return (
diff --git a/src/assets/calendar.svg b/src/assets/calendar.svg
deleted file mode 100644
index 230c4e66a..000000000
--- a/src/assets/calendar.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/clock.svg b/src/assets/clock.svg
deleted file mode 100644
index ab4c1dec5..000000000
--- a/src/assets/clock.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/dashboard.svg b/src/assets/dashboard.svg
index 2090e5dcd..398f2f22b 100644
--- a/src/assets/dashboard.svg
+++ b/src/assets/dashboard.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/eye.svg b/src/assets/eye.svg
deleted file mode 100644
index 09c934531..000000000
--- a/src/assets/eye.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/funnel.svg b/src/assets/funnel.svg
index 63fb71589..c97b2fd9e 100644
--- a/src/assets/funnel.svg
+++ b/src/assets/funnel.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/globe.svg b/src/assets/globe.svg
deleted file mode 100644
index 509eaba6a..000000000
--- a/src/assets/globe.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/lightbulb.svg b/src/assets/lightbulb.svg
index 4ff96dcca..46572b030 100644
--- a/src/assets/lightbulb.svg
+++ b/src/assets/lightbulb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/link.svg b/src/assets/link.svg
deleted file mode 100644
index c53d1adac..000000000
--- a/src/assets/link.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
index b13953132..c7f45174b 100644
--- a/src/assets/logo.svg
+++ b/src/assets/logo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/magnet.svg b/src/assets/magnet.svg
index 67007a018..79e1627aa 100644
--- a/src/assets/magnet.svg
+++ b/src/assets/magnet.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/money.svg b/src/assets/money.svg
index 954f954d8..2f364d83c 100644
--- a/src/assets/money.svg
+++ b/src/assets/money.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/moon.svg b/src/assets/moon.svg
deleted file mode 100644
index 638286fda..000000000
--- a/src/assets/moon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/network.svg b/src/assets/network.svg
index 728550475..93c941ce2 100644
--- a/src/assets/network.svg
+++ b/src/assets/network.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/path.svg b/src/assets/path.svg
index eb9e24ba9..e99207d50 100644
--- a/src/assets/path.svg
+++ b/src/assets/path.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/pushpin.svg b/src/assets/pushpin.svg
index 653a552d9..692622109 100644
--- a/src/assets/pushpin.svg
+++ b/src/assets/pushpin.svg
@@ -1,8 +1 @@
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/assets/security.svg b/src/assets/security.svg
new file mode 100644
index 000000000..dd20891cf
--- /dev/null
+++ b/src/assets/security.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/sun.svg b/src/assets/sun.svg
deleted file mode 100644
index c96547760..000000000
--- a/src/assets/sun.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/switch.svg b/src/assets/switch.svg
new file mode 100644
index 000000000..86166cc5c
--- /dev/null
+++ b/src/assets/switch.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/tag.svg b/src/assets/tag.svg
index 0e0f3668b..d1238692e 100644
--- a/src/assets/tag.svg
+++ b/src/assets/tag.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/target.svg b/src/assets/target.svg
index c2e47e32d..ae9fef258 100644
--- a/src/assets/target.svg
+++ b/src/assets/target.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/assets/user.svg b/src/assets/user.svg
deleted file mode 100644
index 245a67f6f..000000000
--- a/src/assets/user.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/users.svg b/src/assets/users.svg
deleted file mode 100644
index 7036a22c0..000000000
--- a/src/assets/users.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/charts/BarChart.tsx b/src/components/charts/BarChart.tsx
index f6a6e5e05..92d34db43 100644
--- a/src/components/charts/BarChart.tsx
+++ b/src/components/charts/BarChart.tsx
@@ -1,46 +1,73 @@
-import BarChartTooltip from '@/components/charts/BarChartTooltip';
-import Chart, { ChartProps } from '@/components/charts/Chart';
-import { useTheme } from '@/components/hooks';
+import { useTheme } from '@umami/react-zen';
+import { memo, useCallback, useMemo, useState } from 'react';
+import { Chart, type ChartProps } from '@/components/charts/Chart';
+import { ChartTooltip } from '@/components/charts/ChartTooltip';
+import { useLocale } from '@/components/hooks';
import { renderNumberLabels } from '@/lib/charts';
-import { useMemo, useState } from 'react';
+import { getThemeColors } from '@/lib/colors';
+import { DATE_FORMATS, formatDate } from '@/lib/date';
+import { formatLongCurrency, formatLongNumber } from '@/lib/format';
+
+const MemoChart = memo(Chart);
+
+const dateFormats = {
+ millisecond: 'T',
+ second: 'pp',
+ minute: 'p',
+ hour: 'p - PP',
+ day: 'PPPP',
+ week: 'PPPP',
+ month: 'LLLL yyyy',
+ quarter: 'qqq',
+ year: 'yyyy',
+};
export interface BarChartProps extends ChartProps {
- unit: string;
+ unit?: string;
stacked?: boolean;
currency?: string;
renderXLabel?: (label: string, index: number, values: any[]) => string;
renderYLabel?: (label: string, index: number, values: any[]) => string;
XAxisType?: string;
YAxisType?: string;
- minDate?: number | string;
- maxDate?: number | string;
- isAllTime?: boolean;
+ minDate?: Date;
+ maxDate?: Date;
}
-export function BarChart(props: BarChartProps) {
- const [tooltip, setTooltip] = useState(null);
- const { colors } = useTheme();
- const {
- renderXLabel,
- renderYLabel,
- unit,
- XAxisType = 'time',
- YAxisType = 'linear',
- stacked = false,
- minDate,
- maxDate,
- currency,
- isAllTime,
- } = props;
+interface TooltipState {
+ title: string;
+ color?: string;
+ value: string;
+}
- const options: any = useMemo(() => {
+function BarChartComponent({
+ chartData,
+ renderXLabel,
+ renderYLabel,
+ unit,
+ XAxisType = 'timeseries',
+ YAxisType = 'linear',
+ stacked = false,
+ minDate,
+ maxDate,
+ currency,
+ ...props
+}: BarChartProps) {
+ const [tooltip, setTooltip] = useState(null);
+ const { theme } = useTheme();
+ const { locale } = useLocale();
+ const { colors } = useMemo(() => getThemeColors(theme), [theme]);
+
+ const chartOptions: any = useMemo(() => {
return {
+ __id: Date.now(),
scales: {
x: {
type: XAxisType,
stacked: true,
- min: isAllTime ? '' : minDate,
- max: maxDate,
+ min: formatDate(minDate, DATE_FORMATS[unit], locale),
+ max: formatDate(maxDate, DATE_FORMATS[unit], locale),
+ offset: true,
time: {
unit,
},
@@ -61,7 +88,7 @@ export function BarChart(props: BarChartProps) {
type: YAxisType,
min: 0,
beginAtZero: true,
- stacked,
+ stacked: !!stacked,
grid: {
color: colors.chart.line,
},
@@ -75,25 +102,65 @@ export function BarChart(props: BarChartProps) {
},
},
};
- }, [colors, unit, stacked, renderXLabel, renderYLabel]);
+ }, [
+ colors,
+ unit,
+ stacked,
+ renderXLabel,
+ renderYLabel,
+ minDate,
+ maxDate,
+ locale,
+ XAxisType,
+ YAxisType,
+ ]);
- const handleTooltip = ({ tooltip }: { tooltip: any }) => {
- const { opacity } = tooltip;
+ const handleTooltip = useCallback(
+ ({ tooltip }: { tooltip: any }) => {
+ const { opacity, labelColors, dataPoints } = tooltip;
+ const nextTooltip = opacity
+ ? {
+ title: formatDate(
+ new Date(dataPoints[0].raw?.d || dataPoints[0].raw?.x || dataPoints[0].raw),
+ dateFormats[unit],
+ locale,
+ ),
+ color: labelColors?.[0]?.backgroundColor,
+ value: currency
+ ? formatLongCurrency(dataPoints[0].raw.y, currency)
+ : `${formatLongNumber(dataPoints[0].raw.y)} ${dataPoints[0].dataset.label}`,
+ }
+ : null;
- setTooltip(
- opacity ? : null,
- );
- };
+ setTooltip(prev => {
+ if (
+ prev?.title === nextTooltip?.title &&
+ prev?.color === nextTooltip?.color &&
+ prev?.value === nextTooltip?.value
+ ) {
+ return prev;
+ }
+
+ return nextTooltip;
+ });
+ },
+ [currency, locale, unit],
+ );
return (
-
+ <>
+
+ {tooltip && }
+ >
);
}
-export default BarChart;
+export const BarChart = memo(BarChartComponent);
+
+BarChart.displayName = 'BarChart';
diff --git a/src/components/charts/BarChartTooltip.tsx b/src/components/charts/BarChartTooltip.tsx
deleted file mode 100644
index 8bcbad8f7..000000000
--- a/src/components/charts/BarChartTooltip.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { useLocale } from '@/components/hooks';
-import { formatDate } from '@/lib/date';
-import { formatLongCurrency, formatLongNumber } from '@/lib/format';
-import { Flexbox, StatusLight } from 'react-basics';
-
-const formats = {
- millisecond: 'T',
- second: 'pp',
- minute: 'p',
- hour: 'p - PP',
- day: 'PPPP',
- week: 'PPPP',
- month: 'LLLL yyyy',
- quarter: 'qqq',
- year: 'yyyy',
-};
-
-export default function BarChartTooltip({ tooltip, unit, currency }) {
- const { locale } = useLocale();
- const { labelColors, dataPoints } = tooltip;
-
- return (
-
-
- {formatDate(new Date(dataPoints[0].raw.d || dataPoints[0].raw.x), formats[unit], locale)}
-
-
-
- {currency
- ? formatLongCurrency(dataPoints[0].raw.y, currency)
- : formatLongNumber(dataPoints[0].raw.y)}{' '}
- {dataPoints[0].dataset.label}
-
-
-
- );
-}
diff --git a/src/components/charts/BubbleChart.tsx b/src/components/charts/BubbleChart.tsx
index dfe67f3a8..bf487ac05 100644
--- a/src/components/charts/BubbleChart.tsx
+++ b/src/components/charts/BubbleChart.tsx
@@ -1,27 +1,31 @@
-import { Chart, ChartProps } from '@/components/charts/Chart';
import { useState } from 'react';
-import { StatusLight } from 'react-basics';
-import { formatLongNumber } from '@/lib/format';
+import { Chart, type ChartProps } from '@/components/charts/Chart';
+import { ChartTooltip } from '@/components/charts/ChartTooltip';
export interface BubbleChartProps extends ChartProps {
type?: 'bubble';
}
-export default function BubbleChart(props: BubbleChartProps) {
+export function BubbleChart({ type = 'bubble', ...props }: BubbleChartProps) {
const [tooltip, setTooltip] = useState(null);
- const { type = 'bubble' } = props;
const handleTooltip = ({ tooltip }) => {
- const { labelColors, dataPoints } = tooltip;
+ const { opacity, labelColors, title, dataPoints } = tooltip;
setTooltip(
- tooltip.opacity ? (
-
- {formatLongNumber(dataPoints?.[0]?.raw)} {dataPoints?.[0]?.label}
-
- ) : null,
+ opacity
+ ? {
+ color: labelColors?.[0]?.backgroundColor,
+ value: `${title}: ${dataPoints[0].raw}`,
+ }
+ : null,
);
};
- return ;
+ return (
+ <>
+
+ {tooltip && }
+ >
+ );
}
diff --git a/src/components/charts/Chart.module.css b/src/components/charts/Chart.module.css
deleted file mode 100644
index ee61f29bf..000000000
--- a/src/components/charts/Chart.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.chart {
- position: relative;
- height: 400px;
- overflow: hidden;
-}
-
-.tooltip {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
diff --git a/src/components/charts/Chart.tsx b/src/components/charts/Chart.tsx
index a21086bf4..b6ae9d794 100644
--- a/src/components/charts/Chart.tsx
+++ b/src/components/charts/Chart.tsx
@@ -1,38 +1,33 @@
-import { useState, useRef, useEffect, useMemo, ReactNode } from 'react';
-import { Loading } from 'react-basics';
-import classNames from 'classnames';
-import ChartJS, { LegendItem, ChartOptions } from 'chart.js/auto';
-import HoverTooltip from '@/components/common/HoverTooltip';
-import Legend from '@/components/metrics/Legend';
+import { Box, type BoxProps, Column } from '@umami/react-zen';
+import ChartJS, {
+ type ChartData,
+ type ChartOptions,
+ type LegendItem,
+ type UpdateMode,
+} from 'chart.js/auto';
+import { useEffect, useMemo, useRef, useState } from 'react';
+import { Legend } from '@/components/metrics/Legend';
import { DEFAULT_ANIMATION_DURATION } from '@/lib/constants';
-import styles from './Chart.module.css';
-export interface ChartProps {
+ChartJS.defaults.font.family = 'Inter';
+
+export interface ChartProps extends BoxProps {
type?: 'bar' | 'bubble' | 'doughnut' | 'pie' | 'line' | 'polarArea' | 'radar' | 'scatter';
- data?: object;
- isLoading?: boolean;
- animationDuration?: number;
- updateMode?: string;
- onCreate?: (chart: any) => void;
- onUpdate?: (chart: any) => void;
- onTooltip?: (model: any) => void;
- className?: string;
+ chartData?: ChartData & { focusLabel?: string };
chartOptions?: ChartOptions;
- tooltip?: ReactNode;
+ updateMode?: UpdateMode;
+ animationDuration?: number;
+ onTooltip?: (model: any) => void;
}
export function Chart({
type,
- data,
- isLoading = false,
+ chartData,
animationDuration = DEFAULT_ANIMATION_DURATION,
- tooltip,
updateMode,
- onCreate,
- onUpdate,
onTooltip,
- className,
chartOptions,
+ ...props
}: ChartProps) {
const canvas = useRef(null);
const chart = useRef(null);
@@ -57,6 +52,7 @@ export function Chart({
},
tooltip: {
enabled: false,
+ intersect: true,
external: onTooltip,
},
},
@@ -64,53 +60,6 @@ export function Chart({
};
}, [chartOptions]);
- const createChart = (data: any) => {
- ChartJS.defaults.font.family = 'Inter';
-
- chart.current = new ChartJS(canvas.current, {
- type,
- data,
- options,
- });
-
- onCreate?.(chart.current);
-
- setLegendItems(chart.current.legend.legendItems);
- };
-
- const updateChart = (data: any) => {
- if (data.datasets) {
- if (data.datasets.length === chart.current.data.datasets.length) {
- chart.current.data.datasets.forEach((dataset: { data: any }, index: string | number) => {
- if (data?.datasets[index]) {
- dataset.data = data?.datasets[index]?.data;
-
- if (chart.current.legend.legendItems[index]) {
- chart.current.legend.legendItems[index].text = data.datasets[index]?.label;
- }
- }
- });
- } else {
- chart.current.data.datasets = data.datasets;
- }
- }
-
- if (data.focusLabel !== null) {
- chart.current.data.datasets.forEach(ds => {
- ds.hidden = data.focusLabel ? ds.label !== data.focusLabel : false;
- });
- }
-
- chart.current.options = options;
-
- // Allow config changes before update
- onUpdate?.(chart.current);
-
- chart.current.update(updateMode);
-
- setLegendItems(chart.current.legend.legendItems);
- };
-
const handleLegendClick = (item: LegendItem) => {
if (type === 'bar') {
const { datasetIndex } = item;
@@ -132,30 +81,50 @@ export function Chart({
setLegendItems(chart.current.legend.legendItems);
};
+ // Create chart
useEffect(() => {
- if (data) {
- if (!chart.current) {
- createChart(data);
- } else {
- updateChart(data);
- }
+ if (canvas.current) {
+ chart.current = new ChartJS(canvas.current, {
+ type,
+ data: chartData,
+ options,
+ });
+
+ setLegendItems(chart.current.legend.legendItems);
}
- }, [data, options]);
+
+ return () => {
+ chart.current?.destroy();
+ };
+ }, []);
+
+ // Update chart
+ useEffect(() => {
+ if (chart.current && chartData) {
+ // Replace labels and datasets *in-place*
+ chart.current.data.labels = chartData.labels;
+ chart.current.data.datasets = chartData.datasets;
+
+ if (chartData.focusLabel !== null) {
+ chart.current.data.datasets.forEach((ds: { hidden: boolean; label: any }) => {
+ ds.hidden = chartData.focusLabel ? ds.label !== chartData.focusLabel : false;
+ });
+ }
+
+ chart.current.options = options;
+
+ chart.current.update(updateMode);
+
+ setLegendItems(chart.current.legend.legendItems);
+ }
+ }, [chartData, options, updateMode]);
return (
- <>
-
- {isLoading && }
+
+
-
+
- {tooltip && (
-
- {tooltip}
-
- )}
- >
+
);
}
-
-export default Chart;
diff --git a/src/components/charts/ChartTooltip.tsx b/src/components/charts/ChartTooltip.tsx
new file mode 100644
index 000000000..4389584ca
--- /dev/null
+++ b/src/components/charts/ChartTooltip.tsx
@@ -0,0 +1,30 @@
+import { Column, FloatingTooltip, Row, StatusLight, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+
+export function ChartTooltip({
+ title,
+ color,
+ value,
+}: {
+ title?: string;
+ color?: string;
+ value?: ReactNode;
+}) {
+ return (
+
+
+ {title && {title} }
+
+
+ {value}
+
+
+
+
+ );
+}
diff --git a/src/components/charts/PieChart.tsx b/src/components/charts/PieChart.tsx
index a98b97305..2470fe77e 100644
--- a/src/components/charts/PieChart.tsx
+++ b/src/components/charts/PieChart.tsx
@@ -1,27 +1,31 @@
-import { Chart, ChartProps } from '@/components/charts/Chart';
import { useState } from 'react';
-import { StatusLight } from 'react-basics';
-import { formatLongNumber } from '@/lib/format';
+import { Chart, type ChartProps } from '@/components/charts/Chart';
+import { ChartTooltip } from '@/components/charts/ChartTooltip';
export interface PieChartProps extends ChartProps {
type?: 'doughnut' | 'pie';
}
-export default function PieChart(props: PieChartProps) {
+export function PieChart({ type = 'pie', ...props }: PieChartProps) {
const [tooltip, setTooltip] = useState(null);
- const { type = 'pie' } = props;
const handleTooltip = ({ tooltip }) => {
- const { labelColors, dataPoints } = tooltip;
+ const { opacity, labelColors, title, dataPoints } = tooltip;
setTooltip(
- tooltip.opacity ? (
-
- {formatLongNumber(dataPoints?.[0]?.raw)} {dataPoints?.[0]?.label}
-
- ) : null,
+ opacity
+ ? {
+ color: labelColors?.[0]?.backgroundColor,
+ value: `${title}: ${dataPoints[0].raw}`,
+ }
+ : null,
);
};
- return ;
+ return (
+ <>
+
+ {tooltip && }
+ >
+ );
}
diff --git a/src/components/common/ActionForm.tsx b/src/components/common/ActionForm.tsx
new file mode 100644
index 000000000..c6f44e802
--- /dev/null
+++ b/src/components/common/ActionForm.tsx
@@ -0,0 +1,15 @@
+import { Column, Row, Text } from '@umami/react-zen';
+
+export function ActionForm({ label, description, children }) {
+ return (
+
+
+ {label}
+ {description}
+
+
+ {children}
+
+
+ );
+}
diff --git a/src/components/common/AnimatedDiv.tsx b/src/components/common/AnimatedDiv.tsx
new file mode 100644
index 000000000..f9948971a
--- /dev/null
+++ b/src/components/common/AnimatedDiv.tsx
@@ -0,0 +1,3 @@
+import { type AnimatedComponent, animated } from '@react-spring/web';
+
+export const AnimatedDiv: AnimatedComponent = animated.div;
diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx
index d0cae2479..9b198b30c 100644
--- a/src/components/common/Avatar.tsx
+++ b/src/components/common/Avatar.tsx
@@ -1,11 +1,11 @@
-import { useMemo } from 'react';
-import { createAvatar } from '@dicebear/core';
import { lorelei } from '@dicebear/collection';
+import { createAvatar } from '@dicebear/core';
+import { useMemo } from 'react';
import { getColor, getPastel } from '@/lib/colors';
const lib = lorelei;
-function Avatar({ seed, size = 128, ...props }: { seed: string; size?: number }) {
+export function Avatar({ seed, size = 128, ...props }: { seed: string; size?: number }) {
const backgroundColor = getPastel(getColor(seed), 4);
const avatar = useMemo(() => {
@@ -17,7 +17,5 @@ function Avatar({ seed, size = 128, ...props }: { seed: string; size?: number })
}).toDataUri();
}, []);
- return ;
+ return ;
}
-
-export default Avatar;
diff --git a/src/components/common/Badge.module.css b/src/components/common/Badge.module.css
new file mode 100644
index 000000000..216c9c2ae
--- /dev/null
+++ b/src/components/common/Badge.module.css
@@ -0,0 +1,82 @@
+.badge {
+ display: inline-flex;
+ align-items: center;
+ align-self: flex-start;
+ gap: 6px;
+ padding: 2px 8px;
+ border-radius: 6px;
+ font-size: 12px;
+ font-weight: 500;
+ line-height: 1.4;
+ white-space: nowrap;
+}
+
+.dot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+
+.good {
+ color: #15803d;
+ background: #dcfce7;
+}
+
+.good .dot {
+ background: #16a34a;
+}
+
+.warning {
+ color: #a16207;
+ background: #fef9c3;
+}
+
+.warning .dot {
+ background: #ca8a04;
+}
+
+.danger {
+ color: #b91c1c;
+ background: #fee2e2;
+}
+
+.danger .dot {
+ background: #dc2626;
+}
+
+.gray {
+ color: var(--text-muted);
+ background: var(--surface-sunken);
+}
+
+.gray .dot {
+ background: var(--text-muted);
+}
+
+:global([data-theme='dark']) .good {
+ color: #86efac;
+ background: rgba(22, 163, 74, 0.15);
+}
+
+:global([data-theme='dark']) .good .dot {
+ background: #4ade80;
+}
+
+:global([data-theme='dark']) .warning {
+ color: #fde047;
+ background: rgba(202, 138, 4, 0.15);
+}
+
+:global([data-theme='dark']) .warning .dot {
+ background: #facc15;
+}
+
+:global([data-theme='dark']) .danger {
+ color: #fca5a5;
+ background: rgba(220, 38, 38, 0.15);
+}
+
+:global([data-theme='dark']) .danger .dot {
+ background: #f87171;
+}
diff --git a/src/components/common/Badge.tsx b/src/components/common/Badge.tsx
new file mode 100644
index 000000000..44becfe73
--- /dev/null
+++ b/src/components/common/Badge.tsx
@@ -0,0 +1,16 @@
+import styles from './Badge.module.css';
+
+export interface BadgeProps {
+ variant: 'good' | 'warning' | 'danger' | 'gray';
+ children: React.ReactNode;
+ dot?: boolean;
+}
+
+export function Badge({ variant, children, dot = true }: BadgeProps) {
+ return (
+
+ {dot && }
+ {children}
+
+ );
+}
diff --git a/src/components/common/Breadcrumb.module.css b/src/components/common/Breadcrumb.module.css
deleted file mode 100644
index 81e7524fe..000000000
--- a/src/components/common/Breadcrumb.module.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.bar {
- font-size: 12px;
- font-weight: 700;
- text-transform: uppercase;
- color: var(--base600);
-}
-
-.link span {
- color: var(--base700) !important;
-}
diff --git a/src/components/common/Breadcrumb.tsx b/src/components/common/Breadcrumb.tsx
deleted file mode 100644
index ebdce4977..000000000
--- a/src/components/common/Breadcrumb.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import Link from 'next/link';
-import { Flexbox, Icon, Icons, Text } from 'react-basics';
-import styles from './Breadcrumb.module.css';
-import { Fragment } from 'react';
-
-export interface BreadcrumbProps {
- data: {
- url?: string;
- label: string;
- }[];
-}
-
-export function Breadcrumb({ data }: BreadcrumbProps) {
- return (
-
- {data.map((a, i) => {
- return (
-
- {a.url ? (
-
- {a.label}
-
- ) : (
- {a.label}
- )}
- {i !== data.length - 1 ? (
-
-
-
- ) : null}
-
- );
- })}
-
- );
-}
-
-export default Breadcrumb;
diff --git a/src/components/common/ConfirmationForm.tsx b/src/components/common/ConfirmationForm.tsx
index 3997bc4af..fd7663369 100644
--- a/src/components/common/ConfirmationForm.tsx
+++ b/src/components/common/ConfirmationForm.tsx
@@ -1,11 +1,11 @@
-import { ReactNode } from 'react';
-import { Button, LoadingButton, Form, FormButtons } from 'react-basics';
+import { Box, Button, Form, FormButtons, FormSubmitButton } from '@umami/react-zen';
+import type { ReactNode } from 'react';
import { useMessages } from '@/components/hooks';
export interface ConfirmationFormProps {
message: ReactNode;
buttonLabel?: ReactNode;
- buttonVariant?: 'none' | 'primary' | 'secondary' | 'quiet' | 'danger';
+ buttonVariant?: 'primary' | 'quiet' | 'danger';
isLoading?: boolean;
error?: string | Error;
onConfirm?: () => void;
@@ -21,24 +21,22 @@ export function ConfirmationForm({
onConfirm,
onClose,
}: ConfirmationFormProps) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels, getErrorMessage } = useMessages();
return (
-
);
}
-
-export default ConfirmationForm;
diff --git a/src/components/common/CopyButton.tsx b/src/components/common/CopyButton.tsx
new file mode 100644
index 000000000..d393cf77a
--- /dev/null
+++ b/src/components/common/CopyButton.tsx
@@ -0,0 +1,45 @@
+import { Button, Icon } from '@umami/react-zen';
+import { useEffect, useRef, useState } from 'react';
+import { Check, Copy } from '@/components/icons';
+
+export function CopyButton({
+ value,
+ label = 'Copy',
+}: {
+ value: string;
+ label?: string;
+}) {
+ const [copied, setCopied] = useState(false);
+ const timeoutRef = useRef(null);
+
+ useEffect(() => {
+ return () => {
+ if (timeoutRef.current) {
+ window.clearTimeout(timeoutRef.current);
+ }
+ };
+ }, []);
+
+ const handleCopy = async () => {
+ if (!navigator?.clipboard) {
+ return;
+ }
+
+ await navigator.clipboard.writeText(value);
+ setCopied(true);
+
+ if (timeoutRef.current) {
+ window.clearTimeout(timeoutRef.current);
+ }
+
+ timeoutRef.current = window.setTimeout(() => {
+ setCopied(false);
+ }, 1500);
+ };
+
+ return (
+
+ {copied ? : }
+
+ );
+}
diff --git a/src/components/common/DataGrid.tsx b/src/components/common/DataGrid.tsx
new file mode 100644
index 000000000..993929fd2
--- /dev/null
+++ b/src/components/common/DataGrid.tsx
@@ -0,0 +1,107 @@
+import type { UseQueryResult } from '@tanstack/react-query';
+import { Column, Row, SearchField } from '@umami/react-zen';
+import {
+ cloneElement,
+ isValidElement,
+ type ReactElement,
+ type ReactNode,
+ useCallback,
+ useState,
+} from 'react';
+import { Empty } from '@/components/common/Empty';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { Pager } from '@/components/common/Pager';
+import { useMessages, useMobile, useNavigation } from '@/components/hooks';
+import type { PageResult } from '@/lib/types';
+
+const DEFAULT_SEARCH_DELAY = 600;
+
+export interface DataGridProps {
+ query: UseQueryResult, any>;
+ searchDelay?: number;
+ allowSearch?: boolean;
+ allowPaging?: boolean;
+ autoFocus?: boolean;
+ renderActions?: () => ReactNode;
+ renderEmpty?: () => ReactNode;
+ children: ReactNode | ((data: any) => ReactNode);
+}
+
+export function DataGrid({
+ query,
+ searchDelay = 600,
+ allowSearch,
+ allowPaging = true,
+ autoFocus,
+ renderActions,
+ renderEmpty = () => ,
+ children,
+}: DataGridProps) {
+ const { t, labels } = useMessages();
+ 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 { isMobile } = useMobile();
+ const displayMode = isMobile ? 'cards' : undefined;
+
+ const handleSearch = (value: string) => {
+ if (value !== search) {
+ setSearch(value);
+ router.push(updateParams({ search: value, page: 1 }));
+ }
+ };
+
+ const handlePageChange = useCallback(
+ (page: number) => {
+ router.push(updateParams({ search, page }));
+ },
+ [search, updateParams],
+ );
+
+ const child = data ? (typeof children === 'function' ? children(data) : children) : null;
+
+ return (
+
+ {allowSearch && (
+
+
+ {renderActions?.()}
+
+ )}
+
+ {data && (
+ <>
+
+ {isValidElement(child)
+ ? cloneElement(child as ReactElement, { displayMode })
+ : child}
+
+ {showPager && (
+
+
+
+ )}
+ >
+ )}
+
+
+ );
+}
diff --git a/src/components/common/DataTable.module.css b/src/components/common/DataTable.module.css
deleted file mode 100644
index 9a7cffb76..000000000
--- a/src/components/common/DataTable.module.css
+++ /dev/null
@@ -1,34 +0,0 @@
-.search {
- max-width: 300px;
- margin: 20px 0;
-}
-
-.body {
- display: flex;
- flex-direction: column;
- position: relative;
- overflow-x: auto;
-}
-
-.body td {
- display: flex;
- gap: 10px;
- min-height: 70px;
- align-items: center;
-}
-
-.body > div > div > div {
- display: flex;
- gap: 10px;
-}
-
-.pager {
- margin: 20px 0;
-}
-
-.status {
- display: flex;
- align-items: center;
- justify-content: center;
- min-height: 200px;
-}
diff --git a/src/components/common/DataTable.tsx b/src/components/common/DataTable.tsx
deleted file mode 100644
index b19ddf91d..000000000
--- a/src/components/common/DataTable.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import { ReactNode } from 'react';
-import classNames from 'classnames';
-import { Loading, SearchField } from 'react-basics';
-import { useMessages, useNavigation } from '@/components/hooks';
-import Empty from '@/components/common/Empty';
-import Pager from '@/components/common/Pager';
-import { PagedQueryResult } from '@/lib/types';
-import styles from './DataTable.module.css';
-import { LoadingPanel } from '@/components/common/LoadingPanel';
-
-const DEFAULT_SEARCH_DELAY = 600;
-
-export interface DataTableProps {
- queryResult: PagedQueryResult;
- searchDelay?: number;
- allowSearch?: boolean;
- allowPaging?: boolean;
- autoFocus?: boolean;
- renderEmpty?: () => ReactNode;
- children: ReactNode | ((data: any) => ReactNode);
-}
-
-export function DataTable({
- queryResult,
- searchDelay = 600,
- allowSearch = true,
- allowPaging = true,
- autoFocus = true,
- renderEmpty,
- children,
-}: DataTableProps) {
- const { formatMessage, labels, messages } = useMessages();
- const {
- result,
- params,
- setParams,
- query: { error, isLoading, isFetched },
- } = queryResult || {};
- const { page, pageSize, count, data } = result || {};
- const { search } = params || {};
- const hasData = Boolean(!isLoading && data?.length);
- const noResults = Boolean(search && !hasData);
- const { router, renderUrl } = useNavigation();
-
- const handleSearch = (search: string) => {
- setParams({ ...params, search, page: params.page ? page : 1 });
- };
-
- const handlePageChange = (page: number) => {
- setParams({ ...params, search, page });
- router.push(renderUrl({ page }));
- };
-
- return (
- <>
- {allowSearch && (hasData || search) && (
-
- )}
-
-
- {hasData ? (typeof children === 'function' ? children(result) : children) : null}
- {isLoading && }
- {!isLoading && !hasData && !search && (renderEmpty ? renderEmpty() : )}
- {!isLoading && noResults && }
-
- {allowPaging && hasData && (
-
- )}
-
- >
- );
-}
-
-export default DataTable;
diff --git a/src/components/common/DateDisplay.tsx b/src/components/common/DateDisplay.tsx
new file mode 100644
index 000000000..0bece8aed
--- /dev/null
+++ b/src/components/common/DateDisplay.tsx
@@ -0,0 +1,28 @@
+import { Icon, Row, Text } from '@umami/react-zen';
+import { differenceInDays, isSameDay } from 'date-fns';
+import { useLocale } from '@/components/hooks';
+import { Calendar } from '@/components/icons';
+import { formatDate } from '@/lib/date';
+
+export function DateDisplay({ startDate, endDate }) {
+ const { locale } = useLocale();
+ const isSingleDate = differenceInDays(endDate, startDate) === 0;
+
+ return (
+
+
+
+
+
+ {isSingleDate ? (
+ formatDate(startDate, 'PP', locale)
+ ) : (
+ <>
+ {formatDate(startDate, 'PP', locale)}
+ {!isSameDay(startDate, endDate) && ` — ${formatDate(endDate, 'PP', locale)}`}
+ >
+ )}
+
+
+ );
+}
diff --git a/src/components/common/DateDistance.tsx b/src/components/common/DateDistance.tsx
new file mode 100644
index 000000000..e8bd27848
--- /dev/null
+++ b/src/components/common/DateDistance.tsx
@@ -0,0 +1,19 @@
+import { Text } from '@umami/react-zen';
+import { formatDistanceToNow } from 'date-fns';
+import { useLocale, useTimezone } from '@/components/hooks';
+import { isInvalidDate } from '@/lib/date';
+
+export function DateDistance({ date }: { date: Date }) {
+ const { formatTimezoneDate } = useTimezone();
+ const { dateLocale } = useLocale();
+
+ if (isInvalidDate(date)) {
+ return null;
+ }
+
+ return (
+
+ {formatDistanceToNow(date, { addSuffix: true, locale: dateLocale })}
+
+ );
+}
diff --git a/src/components/common/Empty.module.css b/src/components/common/Empty.module.css
deleted file mode 100644
index 3dccb68ed..000000000
--- a/src/components/common/Empty.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.container {
- color: var(--base500);
- font-size: var(--font-size-md);
- position: relative;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- width: 100%;
- height: 100%;
- min-height: 70px;
-}
diff --git a/src/components/common/Empty.tsx b/src/components/common/Empty.tsx
index cf6d11cc6..3f1374c7c 100644
--- a/src/components/common/Empty.tsx
+++ b/src/components/common/Empty.tsx
@@ -1,20 +1,24 @@
-import classNames from 'classnames';
+import { Row } from '@umami/react-zen';
import { useMessages } from '@/components/hooks';
-import styles from './Empty.module.css';
export interface EmptyProps {
message?: string;
- className?: string;
}
-export function Empty({ message, className }: EmptyProps) {
- const { formatMessage, messages } = useMessages();
+export function Empty({ message }: EmptyProps) {
+ const { t, messages } = useMessages();
return (
-
- {message || formatMessage(messages.noDataAvailable)}
-
+
+ {message || t(messages.noDataAvailable)}
+
);
}
-
-export default Empty;
diff --git a/src/components/common/EmptyPlaceholder.tsx b/src/components/common/EmptyPlaceholder.tsx
index 2fd606cdc..d7a88ff7a 100644
--- a/src/components/common/EmptyPlaceholder.tsx
+++ b/src/components/common/EmptyPlaceholder.tsx
@@ -1,22 +1,28 @@
-import { ReactNode } from 'react';
-import { Icon, Text, Flexbox } from 'react-basics';
-import Logo from '@/assets/logo.svg';
+import { Column, Icon, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
export interface EmptyPlaceholderProps {
- message?: string;
+ title?: string;
+ description?: string;
+ icon?: ReactNode;
children?: ReactNode;
}
-export function EmptyPlaceholder({ message, children }: EmptyPlaceholderProps) {
+export function EmptyPlaceholder({ title, description, icon, children }: EmptyPlaceholderProps) {
return (
-
-
-
-
- {message}
- {children}
-
+
+ {icon && (
+
+ {icon}
+
+ )}
+ {title && (
+
+ {title}
+
+ )}
+ {description && {description} }
+ {children}
+
);
}
-
-export default EmptyPlaceholder;
diff --git a/src/components/common/ErrorBoundary.module.css b/src/components/common/ErrorBoundary.module.css
deleted file mode 100644
index 915022c47..000000000
--- a/src/components/common/ErrorBoundary.module.css
+++ /dev/null
@@ -1,19 +0,0 @@
-.error {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- margin: auto;
- z-index: var(--z-index-overlay);
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- min-height: 600px;
- gap: 20px;
-}
-
-.error button {
- align-self: center;
-}
diff --git a/src/components/common/ErrorBoundary.tsx b/src/components/common/ErrorBoundary.tsx
index b9521bb4e..e70c193a3 100644
--- a/src/components/common/ErrorBoundary.tsx
+++ b/src/components/common/ErrorBoundary.tsx
@@ -1,8 +1,7 @@
-import { ErrorInfo, ReactNode } from 'react';
+import { Button, Column } from '@umami/react-zen';
+import type { ErrorInfo, ReactNode } from 'react';
import { ErrorBoundary as Boundary } from 'react-error-boundary';
-import { Button } from 'react-basics';
import { useMessages } from '@/components/hooks';
-import styles from './ErrorBoundary.module.css';
const logError = (error: Error, info: ErrorInfo) => {
// eslint-disable-next-line no-console
@@ -10,16 +9,24 @@ const logError = (error: Error, info: ErrorInfo) => {
};
export function ErrorBoundary({ children }: { children: ReactNode }) {
- const { formatMessage, messages } = useMessages();
+ const { t, messages } = useMessages();
const fallbackRender = ({ error, resetErrorBoundary }) => {
return (
-
-
{formatMessage(messages.error)}
+
+ {t(messages.error)}
{error.message}
{error.stack}
OK
-
+
);
};
@@ -29,5 +36,3 @@ export function ErrorBoundary({ children }: { children: ReactNode }) {
);
}
-
-export default ErrorBoundary;
diff --git a/src/components/common/ErrorMessage.module.css b/src/components/common/ErrorMessage.module.css
deleted file mode 100644
index fe9766132..000000000
--- a/src/components/common/ErrorMessage.module.css
+++ /dev/null
@@ -1,15 +0,0 @@
-.error {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- margin: auto;
- display: flex;
- background-color: var(--base50);
- padding: 10px;
- z-index: 1;
-}
-
-.icon {
- margin-inline-end: 10px;
-}
diff --git a/src/components/common/ErrorMessage.tsx b/src/components/common/ErrorMessage.tsx
index bf3eefb14..a1ff16bb8 100644
--- a/src/components/common/ErrorMessage.tsx
+++ b/src/components/common/ErrorMessage.tsx
@@ -1,18 +1,16 @@
-import { Icon, Icons, Text } from 'react-basics';
-import styles from './ErrorMessage.module.css';
+import { Icon, Row, Text } from '@umami/react-zen';
import { useMessages } from '@/components/hooks';
+import { AlertTriangle } from '@/components/icons';
export function ErrorMessage() {
- const { formatMessage, messages } = useMessages();
+ const { t, messages } = useMessages();
return (
-
-
-
+
+
+
- {formatMessage(messages.error)}
-
+ {t(messages.error)}
+
);
}
-
-export default ErrorMessage;
diff --git a/src/components/common/ExternalLink.tsx b/src/components/common/ExternalLink.tsx
new file mode 100644
index 000000000..dec0d16fe
--- /dev/null
+++ b/src/components/common/ExternalLink.tsx
@@ -0,0 +1,23 @@
+import { Icon, Row, Text } from '@umami/react-zen';
+import Link, { type LinkProps } from 'next/link';
+import type { ReactNode } from 'react';
+import { ExternalLink as LinkIcon } from '@/components/icons';
+
+export function ExternalLink({
+ href,
+ children,
+ ...props
+}: LinkProps & { href: string; children: ReactNode }) {
+ return (
+
+
+
+ {children}
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/common/Favicon.tsx b/src/components/common/Favicon.tsx
index ce2d0d57f..a6b5e5227 100644
--- a/src/components/common/Favicon.tsx
+++ b/src/components/common/Favicon.tsx
@@ -20,5 +20,3 @@ export function Favicon({ domain, ...props }) {
return hostName ? : null;
}
-
-export default Favicon;
diff --git a/src/components/common/FilterButtons.tsx b/src/components/common/FilterButtons.tsx
deleted file mode 100644
index a64a6482a..000000000
--- a/src/components/common/FilterButtons.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Key } from 'react';
-import { ButtonGroup, Button, Flexbox } from 'react-basics';
-
-export interface FilterButtonsProps {
- items: any[];
- selectedKey?: Key;
- onSelect: (key: any) => void;
-}
-
-export function FilterButtons({ items, selectedKey, onSelect }: FilterButtonsProps) {
- return (
-
-
- {({ key, label }) => {label} }
-
-
- );
-}
-
-export default FilterButtons;
diff --git a/src/components/common/FilterLink.module.css b/src/components/common/FilterLink.module.css
deleted file mode 100644
index 894d6e00b..000000000
--- a/src/components/common/FilterLink.module.css
+++ /dev/null
@@ -1,37 +0,0 @@
-.row {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.row.inactive {
- color: var(--base500);
-}
-
-.row.inactive img {
- opacity: 0.35;
-}
-
-.row.active {
- color: var(--base900);
- font-weight: 600;
-}
-
-.row .link {
- display: none;
- margin-inline-start: 20px;
-}
-
-.row .label {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.row:hover .link {
- display: block;
-}
-
-.icon {
- cursor: pointer;
-}
diff --git a/src/components/common/FilterLink.tsx b/src/components/common/FilterLink.tsx
index 9d726b58c..df9eab9b7 100644
--- a/src/components/common/FilterLink.tsx
+++ b/src/components/common/FilterLink.tsx
@@ -1,55 +1,49 @@
-import classNames from 'classnames';
-import { useMessages, useNavigation } from '@/components/hooks';
+import { Icon, Row, Text } from '@umami/react-zen';
import Link from 'next/link';
-import { ReactNode } from 'react';
-import { Icon, Icons } from 'react-basics';
-import styles from './FilterLink.module.css';
+import { type HTMLAttributes, type ReactNode, useState } from 'react';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { ExternalLink } from '@/components/icons';
-export interface FilterLinkProps {
- id: string;
+export interface FilterLinkProps extends HTMLAttributes {
+ type: string;
value: string;
label?: string;
+ icon?: ReactNode;
externalUrl?: string;
- className?: string;
- children?: ReactNode;
}
-export function FilterLink({
- id,
- value,
- label,
- externalUrl,
- children,
- className,
-}: FilterLinkProps) {
- const { formatMessage, labels } = useMessages();
- const { renderUrl, query } = useNavigation();
- const active = query[id] !== undefined;
- const selected = query[id] === value;
+export function FilterLink({ type, value, label, externalUrl, icon }: FilterLinkProps) {
+ const [showLink, setShowLink] = useState(false);
+ const { t, labels } = useMessages();
+ const { updateParams, query } = useNavigation();
+ const active = query[type] !== undefined;
+ const selected = query[type] === value;
return (
- setShowLink(true)}
+ onMouseOut={() => setShowLink(false)}
>
- {children}
- {!value && `(${label || formatMessage(labels.unknown)})`}
+ {icon}
+ {!value && `(${label || t(labels.unknown)})`}
{value && (
-
- {label || value}
-
+
+
+ {label || value}
+
+
)}
- {externalUrl && (
-
-
-
+ {externalUrl && showLink && (
+
+
+
)}
-
+
);
}
-
-export default FilterLink;
diff --git a/src/components/common/FilterRecord.tsx b/src/components/common/FilterRecord.tsx
new file mode 100644
index 000000000..251d29380
--- /dev/null
+++ b/src/components/common/FilterRecord.tsx
@@ -0,0 +1,128 @@
+import {
+ Button,
+ Column,
+ Grid,
+ Icon,
+ Label,
+ ListItem,
+ Loading,
+ Select,
+ TextField,
+} from '@umami/react-zen';
+import { useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { MultiSelect } from '@/components/common/MultiSelect';
+import { useFilters, useFormat, useWebsiteValuesQuery } from '@/components/hooks';
+import { X } from '@/components/icons';
+import { isSearchOperator } from '@/lib/params';
+
+export interface FilterRecordProps {
+ websiteId?: string;
+ type: string;
+ startDate: Date;
+ endDate: Date;
+ name: string;
+ operator: string;
+ value: string | string[];
+ onSelect?: (name: string, value: any) => void;
+ onRemove?: (name: string) => void;
+ onChange?: (name: string, value: string) => void;
+}
+
+export function FilterRecord({
+ websiteId,
+ type,
+ startDate,
+ endDate,
+ name,
+ operator,
+ value,
+ onSelect,
+ onRemove,
+ onChange,
+}: FilterRecordProps) {
+ const { fields, operators } = useFilters();
+ const initValues = Array.isArray(value) ? value : value ? value.split(',') : [];
+ const [selected, setSelected] = useState(initValues);
+ const [search, setSearch] = useState('');
+ const { formatValue } = useFormat();
+ const { data, isLoading } = useWebsiteValuesQuery({
+ websiteId,
+ type,
+ search,
+ startDate,
+ endDate,
+ });
+ const isSearch = isSearchOperator(operator);
+ const items = data?.filter(({ value }) => value) || [];
+
+ const handleSearch = (value: string) => {
+ setSearch(value);
+ };
+
+ const handleSelectOperator = (value: any) => {
+ onSelect?.(name, value);
+ };
+
+ const handleSelectValue = (value: string) => {
+ setSelected([value]);
+ onChange?.(name, value);
+ };
+
+ const handleMultiSelectValue = (values: string[]) => {
+ setSelected(values);
+ onChange?.(name, values.join(','));
+ };
+
+ return (
+
+ {fields.find(f => f.name === name)?.label}
+
+
+
+ {operators
+ .filter(({ type }) => type === 'string')
+ .map(({ name, label }: any) => (
+
+ {label}
+
+ ))}
+
+ {isSearch && (
+
+ )}
+ {!isSearch && (
+
+ values.length > 0 ? values.map(v => formatValue(v, type)).join(', ') : undefined
+ }
+ renderEmptyState={() => (isLoading ? : )}
+ allowSearch
+ >
+ {items.map(({ value }) => (
+
+ {formatValue(value, type)}
+
+ ))}
+
+ )}
+
+
+ onRemove?.(name)}>
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/common/GridRow.tsx b/src/components/common/GridRow.tsx
new file mode 100644
index 000000000..2fd01ed02
--- /dev/null
+++ b/src/components/common/GridRow.tsx
@@ -0,0 +1,32 @@
+import { Grid } from '@umami/react-zen';
+
+const LAYOUTS = {
+ one: { columns: '1fr' },
+ two: {
+ columns: {
+ base: '1fr',
+ md: 'repeat(auto-fill, minmax(560px, 1fr))',
+ },
+ },
+ three: {
+ columns: {
+ base: '1fr',
+ md: 'repeat(auto-fill, minmax(360px, 1fr))',
+ },
+ },
+ 'one-two': { columns: { base: '1fr', md: 'repeat(3, 1fr)' } },
+ 'two-one': { columns: { base: '1fr', md: 'repeat(3, 1fr)' } },
+};
+
+export function GridRow(props: {
+ layout?: 'one' | 'two' | 'three' | 'one-two' | 'two-one' | 'compare';
+ className?: string;
+ children?: any;
+}) {
+ const { layout = 'two', children, ...otherProps } = props;
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/common/HamburgerButton.module.css b/src/components/common/HamburgerButton.module.css
deleted file mode 100644
index 603985855..000000000
--- a/src/components/common/HamburgerButton.module.css
+++ /dev/null
@@ -1,9 +0,0 @@
-.button {
- display: none;
-}
-
-@media only screen and (max-width: 768px) {
- .button {
- display: flex;
- }
-}
diff --git a/src/components/common/HamburgerButton.tsx b/src/components/common/HamburgerButton.tsx
deleted file mode 100644
index 5a81f3a33..000000000
--- a/src/components/common/HamburgerButton.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Button, Icon, Icons } from 'react-basics';
-import { useState } from 'react';
-import MobileMenu from './MobileMenu';
-
-export function HamburgerButton({ menuItems }: { menuItems: any[] }) {
- const [active, setActive] = useState(false);
-
- const handleClick = () => setActive(state => !state);
- const handleClose = () => setActive(false);
-
- return (
- <>
-
- {active ? : }
-
- {active && }
- >
- );
-}
-
-export default HamburgerButton;
diff --git a/src/components/common/HoverTooltip.module.css b/src/components/common/HoverTooltip.module.css
deleted file mode 100644
index c4bb76ea9..000000000
--- a/src/components/common/HoverTooltip.module.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.tooltip {
- position: fixed;
- pointer-events: none;
- z-index: var(--z-index-popup);
- transform: translate(-50%, calc(-100% - 5px));
-}
diff --git a/src/components/common/HoverTooltip.tsx b/src/components/common/HoverTooltip.tsx
deleted file mode 100644
index e5e31219b..000000000
--- a/src/components/common/HoverTooltip.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { ReactNode, useEffect, useState } from 'react';
-import { Tooltip } from 'react-basics';
-import styles from './HoverTooltip.module.css';
-
-export function HoverTooltip({ children }: { children: ReactNode }) {
- const [position, setPosition] = useState({ x: -1000, y: -1000 });
-
- useEffect(() => {
- const handler = e => {
- setPosition({ x: e.clientX, y: e.clientY });
- };
-
- document.addEventListener('mousemove', handler);
-
- return () => {
- document.removeEventListener('mousemove', handler);
- };
- }, []);
-
- return (
-
- {children}
-
- );
-}
-
-export default HoverTooltip;
diff --git a/src/components/common/IconLabel.tsx b/src/components/common/IconLabel.tsx
new file mode 100644
index 000000000..db9462eae
--- /dev/null
+++ b/src/components/common/IconLabel.tsx
@@ -0,0 +1,32 @@
+import { Icon, type IconProps, Row, type RowProps, Text, type TextProps } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+
+interface IconLabelProps extends RowProps {
+ icon: ReactNode;
+ label?: ReactNode;
+ weight?: TextProps['weight'];
+ iconProps?: Partial;
+ labelProps?: Partial;
+}
+
+export function IconLabel({
+ icon,
+ label,
+ weight,
+ iconProps,
+ labelProps,
+ children,
+ ...props
+}: IconLabelProps) {
+ return (
+
+ {icon}
+ {label && (
+
+ {label}
+
+ )}
+ {children}
+
+ );
+}
diff --git a/src/components/common/LinkButton.module.css b/src/components/common/LinkButton.module.css
deleted file mode 100644
index 5561f536f..000000000
--- a/src/components/common/LinkButton.module.css
+++ /dev/null
@@ -1,107 +0,0 @@
-.button {
- display: flex;
- align-items: center;
- align-self: flex-start;
- white-space: nowrap;
- gap: var(--size200);
- font-family: inherit;
- color: var(--base900);
- background: var(--base100);
- border: 1px solid transparent;
- border-radius: var(--border-radius);
- min-height: var(--base-height);
- padding: 0 var(--size600);
- position: relative;
- cursor: pointer;
-}
-
-.button:hover {
- background: var(--base200);
-}
-
-.button:active {
- background: var(--base300);
-}
-
-.button:visited {
- color: var(--base900);
-}
-
-.button.disabled {
- color: var(--disabled-color) !important;
- background-color: var(--disabled-background) !important;
- border-color: transparent !important;
- pointer-events: none;
-}
-
-.button.primary {
- color: var(--light50);
- background: var(--primary400);
-}
-
-.button.primary:hover {
- color: var(--light50);
- background: var(--primary500);
-}
-
-.button.primary:active {
- color: var(--light50);
- background: var(--primary600);
-}
-
-.button.secondary {
- border: 1px solid var(--border-color);
- background: var(--base50);
-}
-
-.button.secondary:hover {
- background: var(--base75);
-}
-
-.button.secondary:active {
- background: var(--base100);
-}
-
-.button.quiet {
- color: var(--base900);
- background: transparent;
-}
-
-.button.quiet:hover {
- background: var(--base100);
-}
-
-.button.quiet:active {
- background: var(--base200);
-}
-
-.button.danger {
- color: var(--light50);
- background: var(--red800);
-}
-
-.button.danger:hover {
- color: var(--light50);
- background: var(--red900);
-}
-
-.button.danger:active {
- color: var(--light50);
- background: var(--red1000);
-}
-
-.button.size-sm {
- font-size: var(--font-size-sm);
- height: calc(var(--base-height) * 0.75);
- padding: 0 calc(var(--size600) * 0.75);
-}
-
-.button.size-md {
- font-size: var(--font-size-md);
-}
-
-.button.size-lg {
- font-size: var(--font-size-lg);
- height: calc(var(--base-height) * 1.25);
- padding: 0 calc(var(--size600) * 1.25);
-}
diff --git a/src/components/common/LinkButton.tsx b/src/components/common/LinkButton.tsx
index 3aa2a76a0..990feb1c8 100644
--- a/src/components/common/LinkButton.tsx
+++ b/src/components/common/LinkButton.tsx
@@ -1,30 +1,39 @@
-import { ReactNode } from 'react';
-import classNames from 'classnames';
+import { Button, type ButtonProps } from '@umami/react-zen';
import Link from 'next/link';
+import type { ReactNode } from 'react';
import { useLocale } from '@/components/hooks';
-import styles from './LinkButton.module.css';
-export interface LinkButtonProps {
+export interface LinkButtonProps extends ButtonProps {
href: string;
- className?: string;
- variant?: string;
+ target?: string;
scroll?: boolean;
+ variant?: any;
+ prefetch?: boolean;
+ asAnchor?: boolean;
children?: ReactNode;
}
-export function LinkButton({ href, className, variant, scroll = true, children }: LinkButtonProps) {
+export function LinkButton({
+ href,
+ variant,
+ scroll = true,
+ target,
+ prefetch,
+ children,
+ asAnchor,
+ ...props
+}: LinkButtonProps) {
const { dir } = useLocale();
- return (
-
+ const linkElement = asAnchor ? (
+
+ {children}
+
+ ) : (
+
{children}
);
-}
-export default LinkButton;
+ return ;
+}
diff --git a/src/components/common/LoadingPanel.module.css b/src/components/common/LoadingPanel.module.css
deleted file mode 100644
index 00d6cbb4f..000000000
--- a/src/components/common/LoadingPanel.module.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.panel {
- display: flex;
- flex-direction: column;
- position: relative;
- flex: 1;
- height: 100%;
-}
-
-.loading {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- margin: auto;
-}
diff --git a/src/components/common/LoadingPanel.tsx b/src/components/common/LoadingPanel.tsx
index 4d27618ac..fb37e1408 100644
--- a/src/components/common/LoadingPanel.tsx
+++ b/src/components/common/LoadingPanel.tsx
@@ -1,36 +1,71 @@
-import { ReactNode } from 'react';
-import classNames from 'classnames';
-import { Loading } from 'react-basics';
-import ErrorMessage from '@/components/common/ErrorMessage';
-import Empty from '@/components/common/Empty';
-import styles from './LoadingPanel.module.css';
+import { Column, type ColumnProps, Loading } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { ErrorMessage } from '@/components/common/ErrorMessage';
+
+export interface LoadingPanelProps extends ColumnProps {
+ data?: any;
+ error?: unknown;
+ isEmpty?: boolean;
+ isLoading?: boolean;
+ isFetching?: boolean;
+ loadingIcon?: 'dots' | 'spinner';
+ loadingPlacement?: 'center' | 'absolute' | 'inline';
+ renderEmpty?: () => ReactNode;
+ children: ReactNode;
+}
export function LoadingPanel({
data,
error,
- isFetched,
+ isEmpty,
isLoading,
+ isFetching,
loadingIcon = 'dots',
- className,
+ loadingPlacement = 'absolute',
+ renderEmpty = () => ,
children,
-}: {
- data?: any;
- error?: Error;
- isFetched?: boolean;
- isLoading?: boolean;
- loadingIcon?: 'dots' | 'spinner';
- isEmpty?: boolean;
- className?: string;
- children: ReactNode;
-}) {
- const isEmpty = !isLoading && isFetched && data && Array.isArray(data) && data.length === 0;
+ ...props
+}: LoadingPanelProps): ReactNode {
+ const empty = isEmpty ?? checkEmpty(data);
- return (
-
- {isLoading && !isFetched && }
- {error && }
- {!error && isEmpty && }
- {!error && !isEmpty && data && children}
-
- );
+ // Show loading spinner only if no data exists
+ if (isLoading || isFetching) {
+ return (
+
+
+
+ );
+ }
+
+ // Show error
+ if (error) {
+ return ;
+ }
+
+ // Show empty state (once loaded)
+ if (!error && !isLoading && !isFetching && empty) {
+ return renderEmpty();
+ }
+
+ // Show main content when data exists
+ if (!isLoading && !isFetching && !error && !empty) {
+ return children;
+ }
+
+ return null;
+}
+
+function checkEmpty(data: any) {
+ if (!data) return false;
+
+ if (Array.isArray(data)) {
+ return data.length <= 0;
+ }
+
+ if (typeof data === 'object') {
+ return Object.keys(data).length <= 0;
+ }
+
+ return !!data;
}
diff --git a/src/components/common/MobileMenu.module.css b/src/components/common/MobileMenu.module.css
deleted file mode 100644
index 63592bec8..000000000
--- a/src/components/common/MobileMenu.module.css
+++ /dev/null
@@ -1,39 +0,0 @@
-.menu {
- position: fixed;
- top: 60px;
- left: 0;
- right: 0;
- bottom: 0;
- margin: auto;
- display: flex;
- flex-direction: column;
- background-color: var(--base50);
- z-index: var(--z-index-popup);
- overflow: auto;
-}
-
-.items {
- display: flex;
- flex-direction: column;
-}
-
-.item {
- font-size: var(--font-size-lg);
- font-weight: 700;
- line-height: 80px;
- padding: 0 40px;
-}
-
-a.item {
- color: var(--base600);
-}
-
-a.item.selected,
-.submenu a.item.selected {
- color: var(--base900);
-}
-
-.submenu a.item {
- color: var(--base600);
- margin-inline-start: 40px;
-}
diff --git a/src/components/common/MobileMenu.tsx b/src/components/common/MobileMenu.tsx
deleted file mode 100644
index e14f0b837..000000000
--- a/src/components/common/MobileMenu.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { createPortal } from 'react-dom';
-import classNames from 'classnames';
-import { usePathname } from 'next/navigation';
-import Link from 'next/link';
-import styles from './MobileMenu.module.css';
-
-export function MobileMenu({
- items = [],
- onClose,
-}: {
- items: any[];
- className?: string;
- onClose: () => void;
-}): any {
- const pathname = usePathname();
-
- const Items = ({ items, className }: { items: any[]; className?: string }): any => (
-
- {items.map(({ label, url, children }: { label: string; url: string; children: any[] }) => {
- const selected = pathname.startsWith(url);
-
- return (
- <>
-
- {label}
-
- {children && }
- >
- );
- })}
-
- );
-
- return createPortal(
-
-
-
,
- document.body,
- );
-}
-
-export default MobileMenu;
diff --git a/src/components/common/MultiSelect.tsx b/src/components/common/MultiSelect.tsx
new file mode 100644
index 000000000..21782d7ae
--- /dev/null
+++ b/src/components/common/MultiSelect.tsx
@@ -0,0 +1,71 @@
+import { Button, Column, Icon, List, MenuTrigger, Popover, SearchField } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { ChevronRight } from '@/components/icons';
+
+interface MultiSelectProps {
+ value?: string[];
+ onChange?: (values: string[]) => void;
+ searchValue?: string;
+ onSearch?: (value: string) => void;
+ placeholder?: string;
+ allowSearch?: boolean;
+ renderEmptyState?: () => ReactNode;
+ renderValue?: (values: string[]) => ReactNode;
+ children: ReactNode;
+}
+
+export function MultiSelect({
+ value = [],
+ onChange,
+ searchValue,
+ onSearch,
+ placeholder = 'Select an item',
+ allowSearch,
+ renderEmptyState,
+ renderValue,
+ children,
+}: MultiSelectProps) {
+ const displayValue = renderValue
+ ? renderValue(value)
+ : value.length > 0
+ ? value.join(', ')
+ : null;
+
+ return (
+
+
+
+ {displayValue ?? placeholder}
+
+
+
+
+
+
+
+ {allowSearch && }
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/src/components/common/NavMenu.tsx b/src/components/common/NavMenu.tsx
new file mode 100644
index 000000000..f0ae91fe2
--- /dev/null
+++ b/src/components/common/NavMenu.tsx
@@ -0,0 +1,78 @@
+import { Column, Heading, Row, Text } from '@umami/react-zen';
+import Link from 'next/link';
+import { IconLabel } from '@/components/common/IconLabel';
+
+interface NavMenuData {
+ id: string;
+ label: string;
+ icon?: any;
+ path: string;
+}
+
+interface NavMenuItems {
+ label?: string;
+ items: NavMenuData[];
+}
+
+export interface NavMenuProps {
+ items: NavMenuItems[];
+ title?: string;
+ selectedKey?: string;
+ allowMinimize?: boolean;
+ onItemClick?: () => void;
+}
+
+export function NavMenu({
+ items = [],
+ title,
+ selectedKey,
+ allowMinimize,
+ onItemClick,
+ ...props
+}: NavMenuProps) {
+ const renderItems = (items: NavMenuData[]) => {
+ return items?.map(({ id, label, icon, path }) => {
+ const isSelected = selectedKey === id;
+
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ });
+ };
+
+ return (
+
+ {title && (
+
+ {title}
+
+ )}
+
+ {items?.map(({ label, items }, index) => {
+ if (label) {
+ return (
+
+
+ {label}
+
+ {renderItems(items)}
+
+ );
+ }
+ return null;
+ })}
+
+
+ );
+}
diff --git a/src/components/common/PageBody.tsx b/src/components/common/PageBody.tsx
new file mode 100644
index 000000000..45bfdc8bb
--- /dev/null
+++ b/src/components/common/PageBody.tsx
@@ -0,0 +1,43 @@
+'use client';
+import { AlertBanner, Column, type ColumnProps, Loading } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { useMessages } from '@/components/hooks';
+
+const DEFAULT_WIDTH = '1320px';
+
+export function PageBody({
+ maxWidth = DEFAULT_WIDTH,
+ error,
+ isLoading,
+ children,
+ ...props
+}: {
+ maxWidth?: string;
+ error?: unknown;
+ isLoading?: boolean;
+ children?: ReactNode;
+} & ColumnProps) {
+ const { t, messages } = useMessages();
+
+ if (error) {
+ return ;
+ }
+
+ if (isLoading) {
+ return ;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx
new file mode 100644
index 000000000..98bde3161
--- /dev/null
+++ b/src/components/common/PageHeader.tsx
@@ -0,0 +1,58 @@
+import { Column, Grid, Heading, Icon, Row, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { LinkButton } from './LinkButton';
+
+export function PageHeader({
+ title,
+ description,
+ label,
+ icon,
+ showBorder = true,
+ titleHref,
+ children,
+}: {
+ title: string;
+ description?: string;
+ label?: ReactNode;
+ icon?: ReactNode;
+ showBorder?: boolean;
+ titleHref?: string;
+ allowEdit?: boolean;
+ className?: string;
+ children?: ReactNode;
+}) {
+ return (
+
+
+ {label}
+
+ {icon && (
+
+ {icon}
+
+ )}
+ {title && titleHref ? (
+
+ {title}
+
+ ) : (
+ title && {title}
+ )}
+
+ {description && (
+
+ {description}
+
+ )}
+
+
+ {children}
+
+
+ );
+}
diff --git a/src/components/common/Pager.module.css b/src/components/common/Pager.module.css
deleted file mode 100644
index c9330c32d..000000000
--- a/src/components/common/Pager.module.css
+++ /dev/null
@@ -1,32 +0,0 @@
-.pager {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- align-items: center;
-}
-
-.nav {
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.text {
- font-size: var(--font-size-md);
- margin: 0 16px;
- justify-content: center;
-}
-
-.count {
- color: var(--base600);
- font-weight: 700;
-}
-
-@media only screen and (max-width: 992px) {
- .pager {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .nav {
- justify-content: flex-end;
- }
-}
diff --git a/src/components/common/Pager.tsx b/src/components/common/Pager.tsx
index b33d2236f..128d33e24 100644
--- a/src/components/common/Pager.tsx
+++ b/src/components/common/Pager.tsx
@@ -1,19 +1,18 @@
-import classNames from 'classnames';
-import { Button, Icon, Icons } from 'react-basics';
+import { Button, Icon, Row, Text } from '@umami/react-zen';
import { useMessages } from '@/components/hooks';
-import styles from './Pager.module.css';
+import { ChevronRight } from '@/components/icons';
export interface PagerProps {
- page: number;
- pageSize: number;
- count: number;
+ page: string | number;
+ pageSize: string | number;
+ count: string | number;
onPageChange: (nextPage: number) => void;
className?: string;
}
-export function Pager({ page, pageSize, count, onPageChange, className }: PagerProps) {
- const { formatMessage, labels } = useMessages();
- const maxPage = pageSize && count ? Math.ceil(count / pageSize) : 0;
+export function Pager({ page, pageSize, count, onPageChange }: PagerProps) {
+ const { t, labels } = useMessages();
+ const maxPage = pageSize && count ? Math.ceil(+count / +pageSize) : 0;
const lastPage = page === maxPage;
const firstPage = page === 1;
@@ -22,7 +21,7 @@ export function Pager({ page, pageSize, count, onPageChange, className }: PagerP
}
const handlePageChange = (value: number) => {
- const nextPage = page + value;
+ const nextPage = +page + +value;
if (nextPage > 0 && nextPage <= maxPage) {
onPageChange(nextPage);
@@ -34,26 +33,28 @@ export function Pager({ page, pageSize, count, onPageChange, className }: PagerP
}
return (
-
-
{formatMessage(labels.numberOfRecords, { x: count })}
-
-
handlePageChange(-1)} disabled={firstPage}>
-
-
-
-
-
- {formatMessage(labels.pageOf, { current: page, total: maxPage })}
-
-
handlePageChange(1)} disabled={lastPage}>
-
-
-
-
-
-
-
+
+ {t(labels.numberOfRecords, { x: count.toLocaleString() })}
+
+
+ {t(labels.pageOf, {
+ current: page.toLocaleString(),
+ total: maxPage.toLocaleString(),
+ })}
+
+
+ handlePageChange(-1)} isDisabled={firstPage}>
+
+
+
+
+ handlePageChange(1)} isDisabled={lastPage}>
+
+
+
+
+
+
+
);
}
-
-export default Pager;
diff --git a/src/components/common/Panel.tsx b/src/components/common/Panel.tsx
new file mode 100644
index 000000000..a02b7e108
--- /dev/null
+++ b/src/components/common/Panel.tsx
@@ -0,0 +1,81 @@
+import {
+ Button,
+ Column,
+ type ColumnProps,
+ Heading,
+ Icon,
+ Row,
+ Text,
+ Tooltip,
+ TooltipTrigger,
+} from '@umami/react-zen';
+import { type ReactNode, useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { Maximize, X } from '@/components/icons';
+
+export interface PanelProps extends ColumnProps {
+ title?: string;
+ description?: string;
+ allowFullscreen?: boolean;
+ toolbar?: ReactNode;
+}
+
+const fullscreenStyles = {
+ position: 'fixed',
+ width: '100vw',
+ height: '100vh',
+ top: 0,
+ left: 0,
+ border: 'none',
+ zIndex: 9999,
+} as any;
+
+export function Panel({
+ title,
+ description,
+ allowFullscreen,
+ toolbar,
+ style,
+ children,
+ height,
+ width,
+ ...props
+}: PanelProps) {
+ const { t, labels } = useMessages();
+ const [isFullscreen, setIsFullscreen] = useState(false);
+
+ const handleFullscreen = () => {
+ setIsFullscreen(!isFullscreen);
+ };
+
+ return (
+
+ {title && {title} }
+ {description && {description} }
+ {(allowFullscreen || toolbar) && (
+
+ {toolbar}
+ {allowFullscreen && (
+
+
+ {isFullscreen ? : }
+
+ {t(labels.maximize)}
+
+ )}
+
+ )}
+ {children}
+
+ );
+}
diff --git a/src/components/common/SectionHeader.tsx b/src/components/common/SectionHeader.tsx
new file mode 100644
index 000000000..f6642feaa
--- /dev/null
+++ b/src/components/common/SectionHeader.tsx
@@ -0,0 +1,28 @@
+import { Heading, Icon, Row, type RowProps, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+
+export function SectionHeader({
+ title,
+ description,
+ icon,
+ children,
+ ...props
+}: {
+ title?: string;
+ description?: string;
+ icon?: ReactNode;
+ allowEdit?: boolean;
+ className?: string;
+ children?: ReactNode;
+} & RowProps) {
+ return (
+
+
+ {icon && {icon} }
+ {title && {title} }
+ {description && {description} }
+
+ {children}
+
+ );
+}
diff --git a/src/components/common/TypeConfirmationForm.tsx b/src/components/common/TypeConfirmationForm.tsx
index 9ef5b30a0..3b6413cf0 100644
--- a/src/components/common/TypeConfirmationForm.tsx
+++ b/src/components/common/TypeConfirmationForm.tsx
@@ -2,11 +2,10 @@ import {
Button,
Form,
FormButtons,
- FormRow,
- FormInput,
+ FormField,
+ FormSubmitButton,
TextField,
- SubmitButton,
-} from 'react-basics';
+} from '@umami/react-zen';
import { useMessages } from '@/components/hooks';
export function TypeConfirmationForm({
@@ -20,38 +19,37 @@ export function TypeConfirmationForm({
}: {
confirmationValue: string;
buttonLabel?: string;
- buttonVariant?: 'none' | 'primary' | 'secondary' | 'quiet' | 'danger';
+ buttonVariant?: 'primary' | 'outline' | 'quiet' | 'danger' | 'zero';
isLoading?: boolean;
error?: string | Error;
onConfirm?: () => void;
onClose?: () => void;
}) {
- const { formatMessage, labels, messages } = useMessages();
-
+ const { t, labels, messages, getErrorMessage } = useMessages();
if (!confirmationValue) {
return null;
}
return (
-
);
}
-
-export default TypeConfirmationForm;
diff --git a/src/components/common/TypeIcon.tsx b/src/components/common/TypeIcon.tsx
index 2a180445f..8894b3a97 100644
--- a/src/components/common/TypeIcon.tsx
+++ b/src/components/common/TypeIcon.tsx
@@ -1,4 +1,5 @@
-import { ReactNode } from 'react';
+import { Row } from '@umami/react-zen';
+import type { ReactNode } from 'react';
export function TypeIcon({
type,
@@ -10,11 +11,11 @@ export function TypeIcon({
children?: ReactNode;
}) {
return (
- <>
+
{
e.currentTarget.src = `${process.env.basePath || ''}/images/${type}/unknown.png`;
}}
@@ -23,8 +24,6 @@ export function TypeIcon({
height={type === 'country' ? undefined : 16}
/>
{children}
- >
+
);
}
-
-export default TypeIcon;
diff --git a/src/components/declarations.d.ts b/src/components/declarations.d.ts
deleted file mode 100644
index ca55157ba..000000000
--- a/src/components/declarations.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.css';
-declare module '*.svg';
-declare module '*.json';
-declare module 'uuid';
diff --git a/src/components/hooks/context/useBoard.ts b/src/components/hooks/context/useBoard.ts
new file mode 100644
index 000000000..cb8b28d8a
--- /dev/null
+++ b/src/components/hooks/context/useBoard.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { BoardContext, type BoardContextValue } from '@/app/(main)/boards/BoardProvider';
+
+export function useBoard(): BoardContextValue {
+ return useContext(BoardContext);
+}
diff --git a/src/components/hooks/context/useLink.ts b/src/components/hooks/context/useLink.ts
new file mode 100644
index 000000000..8766bbb64
--- /dev/null
+++ b/src/components/hooks/context/useLink.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { LinkContext } from '@/app/(main)/links/LinkProvider';
+
+export function useLink() {
+ return useContext(LinkContext);
+}
diff --git a/src/components/hooks/context/usePixel.ts b/src/components/hooks/context/usePixel.ts
new file mode 100644
index 000000000..69cad6f59
--- /dev/null
+++ b/src/components/hooks/context/usePixel.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { PixelContext } from '@/app/(main)/pixels/PixelProvider';
+
+export function usePixel() {
+ return useContext(PixelContext);
+}
diff --git a/src/components/hooks/context/useShare.ts b/src/components/hooks/context/useShare.ts
new file mode 100644
index 000000000..c7493c667
--- /dev/null
+++ b/src/components/hooks/context/useShare.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { ShareContext } from '@/app/share/ShareProvider';
+
+export function useShare() {
+ return useContext(ShareContext);
+}
diff --git a/src/components/hooks/context/useTeam.ts b/src/components/hooks/context/useTeam.ts
new file mode 100644
index 000000000..95ff4bee4
--- /dev/null
+++ b/src/components/hooks/context/useTeam.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { TeamContext } from '@/app/(main)/teams/TeamProvider';
+
+export function useTeam() {
+ return useContext(TeamContext);
+}
diff --git a/src/components/hooks/context/useUser.ts b/src/components/hooks/context/useUser.ts
new file mode 100644
index 000000000..fa97ea9df
--- /dev/null
+++ b/src/components/hooks/context/useUser.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { UserContext } from '@/app/(main)/admin/users/[userId]/UserProvider';
+
+export function useUser() {
+ return useContext(UserContext);
+}
diff --git a/src/components/hooks/context/useWebsite.ts b/src/components/hooks/context/useWebsite.ts
new file mode 100644
index 000000000..3d4be27f4
--- /dev/null
+++ b/src/components/hooks/context/useWebsite.ts
@@ -0,0 +1,6 @@
+import { useContext } from 'react';
+import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider';
+
+export function useWebsite() {
+ return useContext(WebsiteContext);
+}
diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts
index 7c16eeee3..1b27b684a 100644
--- a/src/components/hooks/index.ts
+++ b/src/components/hooks/index.ts
@@ -1,48 +1,102 @@
-export * from './queries/useConfig';
-export * from './queries/useEventDataEvents';
-export * from './queries/useEventDataProperties';
-export * from './queries/useEventDataValues';
-export * from './queries/useLogin';
-export * from './queries/useRealtime';
-export * from './queries/useReport';
-export * from './queries/useReports';
-export * from './queries/useSessionActivity';
-export * from './queries/useSessionData';
-export * from './queries/useSessionDataProperties';
-export * from './queries/useSessionDataValues';
-export * from './queries/useWebsiteSession';
-export * from './queries/useWebsiteSessions';
-export * from './queries/useWebsiteSessionsWeekly';
-export * from './queries/useShareToken';
-export * from './queries/useTeam';
-export * from './queries/useTeams';
-export * from './queries/useTeamWebsites';
-export * from './queries/useTeamMembers';
-export * from './queries/useUser';
-export * from './queries/useUsers';
-export * from './queries/useWebsite';
-export * from './queries/useWebsites';
-export * from './queries/useWebsiteEvents';
-export * from './queries/useWebsiteEventsSeries';
-export * from './queries/useWebsiteMetrics';
-export * from './queries/useWebsiteValues';
+'use client';
+
+// Context hooks
+export * from './context/useBoard';
+export * from './context/useLink';
+export * from './context/usePixel';
+export * from './context/useShare';
+export * from './context/useTeam';
+export * from './context/useUser';
+export * from './context/useWebsite';
+
+// Query hooks
+export * from './queries/useActiveUsersQuery';
+export * from './queries/useBoardQuery';
+export * from './queries/useBoardSharesQuery';
+export * from './queries/useBoardsQuery';
+export * from './queries/useDashboardQuery';
+export * from './queries/useDateRangeQuery';
+export * from './queries/useDeleteQuery';
+export * from './queries/useEventDataEventsQuery';
+export * from './queries/useEventDataPropertiesQuery';
+export * from './queries/useEventDataQuery';
+export * from './queries/useEventDataValuesQuery';
+export * from './queries/useLinkQuery';
+export * from './queries/useLinkSharesQuery';
+export * from './queries/useLinksQuery';
+export * from './queries/useLoginQuery';
+export * from './queries/usePixelQuery';
+export * from './queries/usePixelSharesQuery';
+export * from './queries/usePixelsQuery';
+export * from './queries/useRealtimeQuery';
+export * from './queries/useReplayQuery';
+export * from './queries/useReplaySavedQuery';
+export * from './queries/useReplaysQuery';
+export * from './queries/useReportQuery';
+export * from './queries/useReportsQuery';
+export * from './queries/useResultQuery';
+export * from './queries/useRevenueSessionsQuery';
+export * from './queries/useSavedReplaysQuery';
+export * from './queries/useSessionActivityQuery';
+export * from './queries/useSessionDataPropertiesQuery';
+export * from './queries/useSessionDataQuery';
+export * from './queries/useSessionDataValuesQuery';
+export * from './queries/useSessionReplaysQuery';
+export * from './queries/useShareTokenQuery';
+export * from './queries/useTeamMembersQuery';
+export * from './queries/useTeamQuery';
+export * from './queries/useTeamsQuery';
+export * from './queries/useTeamWebsitesQuery';
+export * from './queries/useUpdateQuery';
+export * from './queries/useUserQuery';
+export * from './queries/useUsersQuery';
+export * from './queries/useUserTeamsQuery';
+export * from './queries/useUserWebsitesQuery';
+export * from './queries/useWebsiteCohortQuery';
+export * from './queries/useWebsiteCohortsQuery';
+export * from './queries/useWebsiteEventsQuery';
+export * from './queries/useWebsiteEventsSeriesQuery';
+export * from './queries/useWebsiteExpandedMetricsQuery';
+export * from './queries/useWebsiteMetricsQuery';
+export * from './queries/useWebsitePageviewsQuery';
+export * from './queries/useWebsiteQuery';
+export * from './queries/useWebsiteSegmentQuery';
+export * from './queries/useWebsiteSegmentsQuery';
+export * from './queries/useWebsiteSessionQuery';
+export * from './queries/useWebsiteSessionStatsQuery';
+export * from './queries/useWebsiteSessionsQuery';
+export * from './queries/useWebsiteSharesQuery';
+export * from './queries/useWebsiteStatsQuery';
+export * from './queries/useWebsitesQuery';
+export * from './queries/useWebsiteValuesQuery';
+export * from './queries/useWeeklyTrafficQuery';
+
+// Regular hooks
export * from './useApi';
+export * from './useConfig';
export * from './useCountryNames';
+export * from './useDateParameters';
export * from './useDateRange';
export * from './useDocumentClick';
export * from './useEscapeKey';
export * from './useFields';
+export * from './useFilterParameters';
export * from './useFilters';
export * from './useForceUpdate';
export * from './useFormat';
+export * from './useGlobalState';
export * from './useLanguageNames';
export * from './useLocale';
export * from './useMessages';
+export * from './useMobile';
export * from './useModified';
export * from './useNavigation';
+export * from './useOperatorLabels';
export * from './usePagedQuery';
+export * from './usePageParameters';
export * from './useRegionNames';
+export * from './useSlug';
export * from './useSticky';
-export * from './useTeamUrl';
-export * from './useTheme';
+export * from './useSubscription';
export * from './useTimezone';
+export * from './useWebsiteNavItems';
diff --git a/src/components/hooks/queries/useActiveUsersQuery.ts b/src/components/hooks/queries/useActiveUsersQuery.ts
new file mode 100644
index 000000000..42867c19d
--- /dev/null
+++ b/src/components/hooks/queries/useActiveUsersQuery.ts
@@ -0,0 +1,12 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+
+export function useActyiveUsersQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ return useQuery({
+ queryKey: ['websites:active', websiteId],
+ queryFn: () => get(`/websites/${websiteId}/active`),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useBoardQuery.ts b/src/components/hooks/queries/useBoardQuery.ts
new file mode 100644
index 000000000..83ca3038e
--- /dev/null
+++ b/src/components/hooks/queries/useBoardQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useBoardQuery(boardId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`board:${boardId}`);
+
+ return useQuery({
+ queryKey: ['boards', { boardId, modified }],
+ queryFn: () => get(`/boards/${boardId}`),
+ enabled: !!boardId && boardId !== 'create',
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useBoardSharesQuery.ts b/src/components/hooks/queries/useBoardSharesQuery.ts
new file mode 100644
index 000000000..16b751632
--- /dev/null
+++ b/src/components/hooks/queries/useBoardSharesQuery.ts
@@ -0,0 +1,17 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useBoardSharesQuery({ boardId }: { boardId: string }, options?: ReactQueryOptions) {
+ const { modified } = useModified('shares');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['boardShares', { boardId, modified }],
+ queryFn: pageParams => {
+ return get(`/boards/${boardId}/shares`, pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useBoardsQuery.ts b/src/components/hooks/queries/useBoardsQuery.ts
new file mode 100644
index 000000000..d570ccc47
--- /dev/null
+++ b/src/components/hooks/queries/useBoardsQuery.ts
@@ -0,0 +1,24 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useBoardsQuery(
+ { teamId }: { teamId?: string },
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('boards');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['boards', { teamId, modified, ...params }],
+ queryFn: pageParams => {
+ return get(teamId ? `/teams/${teamId}/boards` : '/boards', {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useConfig.ts b/src/components/hooks/queries/useConfig.ts
deleted file mode 100644
index 9533d6162..000000000
--- a/src/components/hooks/queries/useConfig.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { useEffect } from 'react';
-import useStore, { setConfig } from '@/store/app';
-import { getConfig, Config } from '@/app/actions/getConfig';
-
-export function useConfig(): Config {
- const { config } = useStore();
-
- async function loadConfig() {
- setConfig(await getConfig());
- }
-
- useEffect(() => {
- if (!config) {
- loadConfig();
- }
- }, []);
-
- return config;
-}
-
-export default useConfig;
diff --git a/src/components/hooks/queries/useDashboardQuery.ts b/src/components/hooks/queries/useDashboardQuery.ts
new file mode 100644
index 000000000..a5afd39b6
--- /dev/null
+++ b/src/components/hooks/queries/useDashboardQuery.ts
@@ -0,0 +1,16 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useDashboardQuery(options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified('dashboard');
+
+ return useQuery({
+ queryKey: ['dashboard', { modified }],
+ queryFn: () => get('/dashboard'),
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useDateRangeQuery.ts b/src/components/hooks/queries/useDateRangeQuery.ts
new file mode 100644
index 000000000..84b7eec7d
--- /dev/null
+++ b/src/components/hooks/queries/useDateRangeQuery.ts
@@ -0,0 +1,23 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+
+type DateRange = {
+ startDate?: string;
+ endDate?: string;
+};
+
+export function useDateRangeQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+
+ const { data } = useQuery({
+ queryKey: ['date-range', websiteId],
+ queryFn: () => get(`/websites/${websiteId}/daterange`),
+ enabled: !!websiteId,
+ ...options,
+ });
+
+ return {
+ startDate: data?.startDate ? new Date(data.startDate) : null,
+ endDate: data?.endDate ? new Date(data.endDate) : null,
+ };
+}
diff --git a/src/components/hooks/queries/useDeleteQuery.ts b/src/components/hooks/queries/useDeleteQuery.ts
new file mode 100644
index 000000000..556231a9a
--- /dev/null
+++ b/src/components/hooks/queries/useDeleteQuery.ts
@@ -0,0 +1,12 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useDeleteQuery(path: string, params?: Record) {
+ const { del, useMutation } = useApi();
+ const query = useMutation({
+ mutationFn: () => del(path, params),
+ });
+ const { touch } = useModified();
+
+ return { ...query, touch };
+}
diff --git a/src/components/hooks/queries/useEventDataEvents.ts b/src/components/hooks/queries/useEventDataEvents.ts
deleted file mode 100644
index 5cad99169..000000000
--- a/src/components/hooks/queries/useEventDataEvents.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { useApi } from '../useApi';
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useFilterParams } from '../useFilterParams';
-
-export function useEventDataEvents(
- websiteId: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:event-data:events', { websiteId, ...params }],
- queryFn: () => get(`/websites/${websiteId}/event-data/events`, { ...params }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useEventDataEvents;
diff --git a/src/components/hooks/queries/useEventDataEventsQuery.ts b/src/components/hooks/queries/useEventDataEventsQuery.ts
new file mode 100644
index 000000000..1401989f3
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataEventsQuery.ts
@@ -0,0 +1,27 @@
+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,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataProperties.ts b/src/components/hooks/queries/useEventDataProperties.ts
deleted file mode 100644
index b841a8f40..000000000
--- a/src/components/hooks/queries/useEventDataProperties.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-
-export function useEventDataProperties(
- websiteId: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:event-data:properties', { websiteId, ...params }],
- queryFn: () => get(`/websites/${websiteId}/event-data/properties`, { ...params }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useEventDataProperties;
diff --git a/src/components/hooks/queries/useEventDataPropertiesQuery.ts b/src/components/hooks/queries/useEventDataPropertiesQuery.ts
new file mode 100644
index 000000000..dfa6e9295
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataPropertiesQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:event-data:properties',
+ { websiteId, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/properties`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataQuery.ts b/src/components/hooks/queries/useEventDataQuery.ts
new file mode 100644
index 000000000..2ccbd634d
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataQuery(websiteId: string, eventId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const params = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:event-data',
+ { websiteId, eventId, startAt, endAt, unit, timezone, ...params },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/${eventId}`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...params,
+ }),
+ enabled: !!(websiteId && eventId),
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataValues.ts b/src/components/hooks/queries/useEventDataValues.ts
deleted file mode 100644
index de6783a0a..000000000
--- a/src/components/hooks/queries/useEventDataValues.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-
-export function useEventDataValues(
- websiteId: string,
- eventName: string,
- propertyName: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:event-data:values', { websiteId, eventName, propertyName, ...params }],
- queryFn: () =>
- get(`/websites/${websiteId}/event-data/values`, { ...params, eventName, propertyName }),
- enabled: !!(websiteId && propertyName),
- ...options,
- });
-}
-
-export default useEventDataValues;
diff --git a/src/components/hooks/queries/useEventDataValuesQuery.ts b/src/components/hooks/queries/useEventDataValuesQuery.ts
new file mode 100644
index 000000000..db2a2d7e0
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataValuesQuery.ts
@@ -0,0 +1,34 @@
+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({
+ 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,
+ });
+}
diff --git a/src/components/hooks/queries/useEventStatsQuery.ts b/src/components/hooks/queries/useEventStatsQuery.ts
new file mode 100644
index 000000000..b3ca60eaa
--- /dev/null
+++ b/src/components/hooks/queries/useEventStatsQuery.ts
@@ -0,0 +1,43 @@
+import type { UseQueryOptions } from '@tanstack/react-query';
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import { useApi } from '../useApi';
+import { useFilterParameters } from '../useFilterParameters';
+
+export interface EventStatsData {
+ events: number;
+ visitors: number;
+ visits: number;
+ uniqueEvents: number;
+ comparison: {
+ events: number;
+ visitors: number;
+ visits: number;
+ uniqueEvents: number;
+ };
+}
+
+type EventStatsApiResponse = {
+ data: EventStatsData;
+};
+
+export function useEventStatsQuery(
+ { websiteId }: { websiteId: string },
+ options?: UseQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['websites:events:stats', { websiteId, startAt, endAt, ...filters }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/events/stats`, {
+ startAt,
+ endAt,
+ ...filters,
+ }),
+ select: response => response.data,
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useLinkQuery.ts b/src/components/hooks/queries/useLinkQuery.ts
new file mode 100644
index 000000000..cab8d13b0
--- /dev/null
+++ b/src/components/hooks/queries/useLinkQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useLinkQuery(linkId?: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`link:${linkId}`);
+
+ return useQuery({
+ queryKey: ['link', { linkId, modified }],
+ queryFn: () => {
+ return get(`/links/${linkId}`);
+ },
+ enabled: !!linkId,
+ });
+}
diff --git a/src/components/hooks/queries/useLinkSharesQuery.ts b/src/components/hooks/queries/useLinkSharesQuery.ts
new file mode 100644
index 000000000..990952d05
--- /dev/null
+++ b/src/components/hooks/queries/useLinkSharesQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useLinkSharesQuery(
+ { linkId }: { linkId: string },
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('shares');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['linkShares', { linkId, modified }],
+ queryFn: pageParams => {
+ return get(`/links/${linkId}/shares`, pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useLinksQuery.ts b/src/components/hooks/queries/useLinksQuery.ts
new file mode 100644
index 000000000..8345fcfeb
--- /dev/null
+++ b/src/components/hooks/queries/useLinksQuery.ts
@@ -0,0 +1,24 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useLinksQuery(
+ { teamId }: { teamId?: string },
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('links');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['links', { teamId, modified, ...params }],
+ queryFn: pageParams => {
+ return get(teamId ? `/teams/${teamId}/links` : '/links', {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useLogin.ts b/src/components/hooks/queries/useLoginQuery.ts
similarity index 58%
rename from src/components/hooks/queries/useLogin.ts
rename to src/components/hooks/queries/useLoginQuery.ts
index 635c50006..a64b7844f 100644
--- a/src/components/hooks/queries/useLogin.ts
+++ b/src/components/hooks/queries/useLoginQuery.ts
@@ -1,15 +1,11 @@
-import { UseQueryResult } from '@tanstack/react-query';
-import useStore, { setUser } from '@/store/app';
+import { setUser, useApp } from '@/store/app';
import { useApi } from '../useApi';
const selector = (state: { user: any }) => state.user;
-export function useLogin(): {
- user: any;
- setUser: (data: any) => void;
-} & UseQueryResult {
+export function useLoginQuery() {
const { post, useQuery } = useApi();
- const user = useStore(selector);
+ const user = useApp(selector);
const query = useQuery({
queryKey: ['login'],
@@ -25,5 +21,3 @@ export function useLogin(): {
return { user, setUser, ...query };
}
-
-export default useLogin;
diff --git a/src/components/hooks/queries/usePixelQuery.ts b/src/components/hooks/queries/usePixelQuery.ts
new file mode 100644
index 000000000..03b1bea5e
--- /dev/null
+++ b/src/components/hooks/queries/usePixelQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function usePixelQuery(pixelId?: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`pixel:${pixelId}`);
+
+ return useQuery({
+ queryKey: ['pixel', { pixelId, modified }],
+ queryFn: () => {
+ return get(`/pixels/${pixelId}`);
+ },
+ enabled: !!pixelId,
+ });
+}
diff --git a/src/components/hooks/queries/usePixelSharesQuery.ts b/src/components/hooks/queries/usePixelSharesQuery.ts
new file mode 100644
index 000000000..aacd07a7a
--- /dev/null
+++ b/src/components/hooks/queries/usePixelSharesQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function usePixelSharesQuery(
+ { pixelId }: { pixelId: string },
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('shares');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['pixelShares', { pixelId, modified }],
+ queryFn: pageParams => {
+ return get(`/pixels/${pixelId}/shares`, pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/usePixelsQuery.ts b/src/components/hooks/queries/usePixelsQuery.ts
new file mode 100644
index 000000000..2eadcba98
--- /dev/null
+++ b/src/components/hooks/queries/usePixelsQuery.ts
@@ -0,0 +1,24 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function usePixelsQuery(
+ { teamId }: { teamId?: string },
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('pixels');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['pixels', { teamId, modified, ...params }],
+ queryFn: pageParams => {
+ return get(teamId ? `/teams/${teamId}/pixels` : '/pixels', {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useRealtime.ts b/src/components/hooks/queries/useRealtimeQuery.ts
similarity index 50%
rename from src/components/hooks/queries/useRealtime.ts
rename to src/components/hooks/queries/useRealtimeQuery.ts
index 670b23bea..1a5bd1c53 100644
--- a/src/components/hooks/queries/useRealtime.ts
+++ b/src/components/hooks/queries/useRealtimeQuery.ts
@@ -1,15 +1,13 @@
-import { useTimezone } from '@/components/hooks/useTimezone';
import { REALTIME_INTERVAL } from '@/lib/constants';
-import { RealtimeData } from '@/lib/types';
+import type { RealtimeData } from '@/lib/types';
import { useApi } from '../useApi';
-export function useRealtime(websiteId: string) {
+export function useRealtimeQuery(websiteId: string) {
const { get, useQuery } = useApi();
- const { timezone } = useTimezone();
const { data, isLoading, error } = useQuery({
- queryKey: ['realtime', { websiteId, timezone }],
+ queryKey: ['realtime', { websiteId }],
queryFn: async () => {
- return get(`/realtime/${websiteId}`, { timezone });
+ return get(`/realtime/${websiteId}`);
},
enabled: !!websiteId,
refetchInterval: REALTIME_INTERVAL,
@@ -17,5 +15,3 @@ export function useRealtime(websiteId: string) {
return { data, isLoading, error };
}
-
-export default useRealtime;
diff --git a/src/components/hooks/queries/useReplayQuery.ts b/src/components/hooks/queries/useReplayQuery.ts
new file mode 100644
index 000000000..03d2ab747
--- /dev/null
+++ b/src/components/hooks/queries/useReplayQuery.ts
@@ -0,0 +1,13 @@
+import { useApi } from '../useApi';
+
+export function useReplayQuery(websiteId: string, replayId: string) {
+ const { get, useQuery } = useApi();
+
+ return useQuery({
+ queryKey: ['replay', { websiteId, replayId }],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/replays/${replayId}`);
+ },
+ enabled: Boolean(websiteId && replayId),
+ });
+}
diff --git a/src/components/hooks/queries/useReplaySavedQuery.ts b/src/components/hooks/queries/useReplaySavedQuery.ts
new file mode 100644
index 000000000..93795821b
--- /dev/null
+++ b/src/components/hooks/queries/useReplaySavedQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useReplaySavedQuery(websiteId: string, replayId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified('replays');
+
+ return useQuery({
+ queryKey: ['replay:saved', { websiteId, replayId, modified }],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/replays/saved/${replayId}`);
+ },
+ enabled: Boolean(websiteId && replayId),
+ });
+}
diff --git a/src/components/hooks/queries/useReplaysQuery.ts b/src/components/hooks/queries/useReplaysQuery.ts
new file mode 100644
index 000000000..79c1a04bf
--- /dev/null
+++ b/src/components/hooks/queries/useReplaysQuery.ts
@@ -0,0 +1,31 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useReplaysQuery(websiteId: string, params?: Record) {
+ const { get } = useApi();
+ const { modified } = useModified('replays');
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'replays',
+ { websiteId, modified, startAt, endAt, unit, timezone, ...filters, ...params },
+ ],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/replays`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ ...params,
+ pageSize: 20,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useReport.ts b/src/components/hooks/queries/useReport.ts
deleted file mode 100644
index 7e9d81b0d..000000000
--- a/src/components/hooks/queries/useReport.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { produce } from 'immer';
-import { useCallback, useEffect, useState } from 'react';
-import { useApi } from '../useApi';
-import { useTimezone } from '../useTimezone';
-import { useMessages } from '../useMessages';
-import { parseDateRange } from '@/lib/date';
-
-export function useReport(
- reportId: string,
- defaultParameters?: { type: string; parameters: { [key: string]: any } },
-) {
- const [report, setReport] = useState(null);
- const [isRunning, setIsRunning] = useState(false);
- const { get, post } = useApi();
- const { timezone } = useTimezone();
- const { formatMessage, labels } = useMessages();
-
- const baseParameters = {
- name: formatMessage(labels.untitled),
- description: '',
- parameters: {},
- };
-
- const loadReport = async (id: string) => {
- const data: any = await get(`/reports/${id}`);
-
- const { dateRange } = data?.parameters || {};
-
- data.parameters = {
- ...defaultParameters?.parameters,
- ...data.parameters,
- dateRange: dateRange ? parseDateRange(dateRange?.value) : {},
- };
-
- setReport(data);
- };
-
- const runReport = useCallback(
- async (parameters: { [key: string]: any }) => {
- setIsRunning(true);
-
- const { type } = report;
-
- const data = await post(`/reports/${type}`, { ...parameters, timezone });
-
- setReport(
- produce((state: any) => {
- state.parameters = { ...defaultParameters?.parameters, ...parameters };
- state.data = data;
-
- return state;
- }),
- );
-
- setIsRunning(false);
- },
- [report, timezone],
- );
-
- const updateReport = useCallback(
- async (data: { [x: string]: any; parameters: any }) => {
- setReport(
- produce((state: any) => {
- const { parameters, ...rest } = data;
-
- if (parameters) {
- state.parameters = {
- ...defaultParameters?.parameters,
- ...state.parameters,
- ...parameters,
- };
- }
-
- for (const key in rest) {
- state[key] = rest[key];
- }
-
- return state;
- }),
- );
- },
- [report],
- );
-
- useEffect(() => {
- if (!reportId) {
- setReport({ ...baseParameters, ...defaultParameters });
- } else {
- loadReport(reportId);
- }
- }, [reportId]);
-
- return { report, runReport, updateReport, isRunning };
-}
-
-export default useReport;
diff --git a/src/components/hooks/queries/useReportQuery.ts b/src/components/hooks/queries/useReportQuery.ts
new file mode 100644
index 000000000..6973e2d34
--- /dev/null
+++ b/src/components/hooks/queries/useReportQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useReportQuery(reportId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`report:${reportId}`);
+
+ return useQuery({
+ queryKey: ['report', { reportId, modified }],
+ queryFn: () => {
+ return get(`/reports/${reportId}`);
+ },
+ enabled: !!reportId,
+ });
+}
diff --git a/src/components/hooks/queries/useReports.ts b/src/components/hooks/queries/useReports.ts
deleted file mode 100644
index 21db15368..000000000
--- a/src/components/hooks/queries/useReports.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import useApi from '../useApi';
-import usePagedQuery from '../usePagedQuery';
-import useModified from '../useModified';
-
-export function useReports({ websiteId, teamId }: { websiteId?: string; teamId?: string }) {
- const { modified } = useModified(`reports`);
- const { get, del, useMutation } = useApi();
- const queryResult = usePagedQuery({
- queryKey: ['reports', { websiteId, teamId, modified }],
- queryFn: (params: any) => {
- return get('/reports', { websiteId, teamId, ...params });
- },
- });
- const { mutate } = useMutation({ mutationFn: (reportId: string) => del(`/reports/${reportId}`) });
-
- const deleteReport = (reportId: any) => {
- mutate(reportId, {
- onSuccess: () => {},
- });
- };
-
- return {
- ...queryResult,
- deleteReport,
- };
-}
-
-export default useReports;
diff --git a/src/components/hooks/queries/useReportsQuery.ts b/src/components/hooks/queries/useReportsQuery.ts
new file mode 100644
index 000000000..ba1bdd4d5
--- /dev/null
+++ b/src/components/hooks/queries/useReportsQuery.ts
@@ -0,0 +1,19 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useReportsQuery(
+ { websiteId, type }: { websiteId: string; type?: string },
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified(`reports:${type}`);
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['reports', { websiteId, type, modified }],
+ queryFn: async () => get('/reports', { websiteId, type }),
+ enabled: !!websiteId && !!type,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useResultQuery.ts b/src/components/hooks/queries/useResultQuery.ts
new file mode 100644
index 000000000..1828e594a
--- /dev/null
+++ b/src/components/hooks/queries/useResultQuery.ts
@@ -0,0 +1,46 @@
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useResultQuery(
+ type: string,
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { websiteId, ...parameters } = params;
+ const { post, useQuery } = useApi();
+ const { startDate, endDate, timezone, unit } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'reports',
+ {
+ type,
+ websiteId,
+ startDate,
+ endDate,
+ timezone,
+ unit,
+ ...params,
+ ...filters,
+ },
+ ],
+ queryFn: () =>
+ post(`/reports/${type}`, {
+ websiteId,
+ type,
+ filters,
+ parameters: {
+ startDate,
+ endDate,
+ timezone,
+ unit,
+ ...parameters,
+ },
+ }),
+ enabled: !!type,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useRevenueSessionsQuery.ts b/src/components/hooks/queries/useRevenueSessionsQuery.ts
new file mode 100644
index 000000000..a1c12190d
--- /dev/null
+++ b/src/components/hooks/queries/useRevenueSessionsQuery.ts
@@ -0,0 +1,36 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useRevenueSessionsQuery(
+ websiteId: string,
+ currency: string,
+ params?: Record,
+) {
+ const { get } = useApi();
+ const { modified } = useModified(`revenue-sessions`);
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'revenue-sessions',
+ { websiteId, currency, modified, startAt, endAt, unit, timezone, ...params, ...filters },
+ ],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/revenue/sessions`, {
+ currency,
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ ...params,
+ pageSize: 20,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useRevenueValues.ts b/src/components/hooks/queries/useRevenueValues.ts
deleted file mode 100644
index 007ca3c53..000000000
--- a/src/components/hooks/queries/useRevenueValues.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useApi } from '../useApi';
-
-export function useRevenueValues(websiteId: string, startDate: Date, endDate: Date) {
- const { get, useQuery } = useApi();
-
- return useQuery({
- queryKey: ['revenue:values', { websiteId, startDate, endDate }],
- queryFn: () =>
- get(`/reports/revenue`, {
- websiteId,
- startDate,
- endDate,
- }),
- enabled: !!(websiteId && startDate && endDate),
- });
-}
-
-export default useRevenueValues;
diff --git a/src/components/hooks/queries/useSavedReplaysQuery.ts b/src/components/hooks/queries/useSavedReplaysQuery.ts
new file mode 100644
index 000000000..b6aef525c
--- /dev/null
+++ b/src/components/hooks/queries/useSavedReplaysQuery.ts
@@ -0,0 +1,18 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useSavedReplaysQuery(websiteId: string) {
+ const { get } = useApi();
+ const { modified } = useModified('replays');
+
+ return usePagedQuery({
+ queryKey: ['replays:saved', { websiteId, modified }],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/replays/saved`, {
+ ...pageParams,
+ pageSize: 20,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useSessionActivity.ts b/src/components/hooks/queries/useSessionActivityQuery.ts
similarity index 92%
rename from src/components/hooks/queries/useSessionActivity.ts
rename to src/components/hooks/queries/useSessionActivityQuery.ts
index 1c9c8f57d..d8d34aca6 100644
--- a/src/components/hooks/queries/useSessionActivity.ts
+++ b/src/components/hooks/queries/useSessionActivityQuery.ts
@@ -1,6 +1,6 @@
import { useApi } from '../useApi';
-export function useSessionActivity(
+export function useSessionActivityQuery(
websiteId: string,
sessionId: string,
startDate: Date,
diff --git a/src/components/hooks/queries/useSessionDataProperties.ts b/src/components/hooks/queries/useSessionDataProperties.ts
deleted file mode 100644
index ca3798f02..000000000
--- a/src/components/hooks/queries/useSessionDataProperties.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { useApi } from '../useApi';
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useFilterParams } from '../useFilterParams';
-
-export function useSessionDataProperties(
- websiteId: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:session-data:properties', { websiteId, ...params }],
- queryFn: () => get(`/websites/${websiteId}/session-data/properties`, { ...params }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useSessionDataProperties;
diff --git a/src/components/hooks/queries/useSessionDataPropertiesQuery.ts b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts
new file mode 100644
index 000000000..ac651bb96
--- /dev/null
+++ b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useSessionDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:session-data:properties',
+ { websiteId, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/session-data/properties`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useSessionData.ts b/src/components/hooks/queries/useSessionDataQuery.ts
similarity index 78%
rename from src/components/hooks/queries/useSessionData.ts
rename to src/components/hooks/queries/useSessionDataQuery.ts
index 521ba7d56..62b539832 100644
--- a/src/components/hooks/queries/useSessionData.ts
+++ b/src/components/hooks/queries/useSessionDataQuery.ts
@@ -1,6 +1,6 @@
import { useApi } from '../useApi';
-export function useSessionData(websiteId: string, sessionId: string) {
+export function useSessionDataQuery(websiteId: string, sessionId: string) {
const { get, useQuery } = useApi();
return useQuery({
diff --git a/src/components/hooks/queries/useSessionDataValues.ts b/src/components/hooks/queries/useSessionDataValues.ts
deleted file mode 100644
index 85529fc09..000000000
--- a/src/components/hooks/queries/useSessionDataValues.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { useApi } from '../useApi';
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useFilterParams } from '../useFilterParams';
-
-export function useSessionDataValues(
- websiteId: string,
- propertyName: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:session-data:values', { websiteId, propertyName, ...params }],
- queryFn: () => get(`/websites/${websiteId}/session-data/values`, { ...params, propertyName }),
- enabled: !!(websiteId && propertyName),
- ...options,
- });
-}
-
-export default useSessionDataValues;
diff --git a/src/components/hooks/queries/useSessionDataValuesQuery.ts b/src/components/hooks/queries/useSessionDataValuesQuery.ts
new file mode 100644
index 000000000..d5e180bbe
--- /dev/null
+++ b/src/components/hooks/queries/useSessionDataValuesQuery.ts
@@ -0,0 +1,32 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useSessionDataValuesQuery(
+ websiteId: string,
+ propertyName: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:session-data:values',
+ { websiteId, propertyName, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/session-data/values`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ propertyName,
+ }),
+ enabled: !!(websiteId && propertyName),
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useSessionReplaysQuery.ts b/src/components/hooks/queries/useSessionReplaysQuery.ts
new file mode 100644
index 000000000..df4613ed5
--- /dev/null
+++ b/src/components/hooks/queries/useSessionReplaysQuery.ts
@@ -0,0 +1,21 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useSessionReplaysQuery(websiteId: string, sessionId: string) {
+ const { get } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+
+ return usePagedQuery({
+ queryKey: ['session-replays', { websiteId, sessionId, startAt, endAt, unit, timezone }],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/sessions/${sessionId}/replays`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...pageParams,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useShareToken.ts b/src/components/hooks/queries/useShareToken.ts
deleted file mode 100644
index cf17c7562..000000000
--- a/src/components/hooks/queries/useShareToken.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import useStore, { setShareToken } from '@/store/app';
-import { useApi } from '../useApi';
-
-const selector = (state: { shareToken: string }) => state.shareToken;
-
-export function useShareToken(shareId: string): {
- shareToken: any;
- isLoading?: boolean;
- error?: Error;
-} {
- const shareToken = useStore(selector);
- const { get, useQuery } = useApi();
- const { isLoading, error } = useQuery({
- queryKey: ['share', shareId],
- queryFn: async () => {
- const data = await get(`/share/${shareId}`);
-
- setShareToken(data);
-
- return data;
- },
- });
-
- return { shareToken, isLoading, error };
-}
-
-export default useShareToken;
diff --git a/src/components/hooks/queries/useShareTokenQuery.ts b/src/components/hooks/queries/useShareTokenQuery.ts
new file mode 100644
index 000000000..17d9e885a
--- /dev/null
+++ b/src/components/hooks/queries/useShareTokenQuery.ts
@@ -0,0 +1,22 @@
+import { setShare, setShareToken, useApp } from '@/store/app';
+import { useApi } from '../useApi';
+
+const selector = state => state.share;
+
+export function useShareTokenQuery(slug: string) {
+ const share = useApp(selector);
+ const { get, useQuery } = useApi();
+ const query = useQuery({
+ queryKey: ['share', slug],
+ queryFn: async () => {
+ const data = await get(`/share/${slug}`);
+
+ setShare(data);
+ setShareToken({ token: data?.token });
+
+ return data;
+ },
+ });
+
+ return { share, ...query };
+}
diff --git a/src/components/hooks/queries/useTeam.ts b/src/components/hooks/queries/useTeam.ts
deleted file mode 100644
index d0ce7499c..000000000
--- a/src/components/hooks/queries/useTeam.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useApi } from '../useApi';
-
-export function useTeam(teamId: string) {
- const { get, useQuery } = useApi();
- return useQuery({
- queryKey: ['teams', teamId],
- queryFn: () => get(`/teams/${teamId}`),
- enabled: !!teamId,
- });
-}
-
-export default useTeam;
diff --git a/src/components/hooks/queries/useTeamMembers.ts b/src/components/hooks/queries/useTeamMembersQuery.ts
similarity index 65%
rename from src/components/hooks/queries/useTeamMembers.ts
rename to src/components/hooks/queries/useTeamMembersQuery.ts
index b6353afc1..6f6f815c1 100644
--- a/src/components/hooks/queries/useTeamMembers.ts
+++ b/src/components/hooks/queries/useTeamMembersQuery.ts
@@ -1,8 +1,8 @@
import { useApi } from '../useApi';
-import usePagedQuery from '../usePagedQuery';
-import useModified from '../useModified';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
-export function useTeamMembers(teamId: string) {
+export function useTeamMembersQuery(teamId: string) {
const { get } = useApi();
const { modified } = useModified(`teams:members`);
@@ -14,5 +14,3 @@ export function useTeamMembers(teamId: string) {
enabled: !!teamId,
});
}
-
-export default useTeamMembers;
diff --git a/src/components/hooks/queries/useTeamQuery.ts b/src/components/hooks/queries/useTeamQuery.ts
new file mode 100644
index 000000000..c076a6aa3
--- /dev/null
+++ b/src/components/hooks/queries/useTeamQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useTeamQuery(teamId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`teams:${teamId}`);
+
+ return useQuery({
+ queryKey: ['teams', { teamId, modified }],
+ queryFn: () => get(`/teams/${teamId}`),
+ enabled: !!teamId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useTeamWebsites.ts b/src/components/hooks/queries/useTeamWebsitesQuery.ts
similarity index 73%
rename from src/components/hooks/queries/useTeamWebsites.ts
rename to src/components/hooks/queries/useTeamWebsitesQuery.ts
index 5606407eb..ffe601bf2 100644
--- a/src/components/hooks/queries/useTeamWebsites.ts
+++ b/src/components/hooks/queries/useTeamWebsitesQuery.ts
@@ -1,8 +1,8 @@
import { useApi } from '../useApi';
+import { useModified } from '../useModified';
import { usePagedQuery } from '../usePagedQuery';
-import useModified from '../useModified';
-export function useTeamWebsites(teamId: string) {
+export function useTeamWebsitesQuery(teamId: string) {
const { get } = useApi();
const { modified } = useModified(`websites`);
@@ -13,5 +13,3 @@ export function useTeamWebsites(teamId: string) {
},
});
}
-
-export default useTeamWebsites;
diff --git a/src/components/hooks/queries/useTeams.ts b/src/components/hooks/queries/useTeams.ts
deleted file mode 100644
index d09e2f7d2..000000000
--- a/src/components/hooks/queries/useTeams.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useApi } from '../useApi';
-import { usePagedQuery } from '../usePagedQuery';
-import useModified from '../useModified';
-
-export function useTeams(userId: string) {
- const { get } = useApi();
- const { modified } = useModified(`teams`);
-
- return usePagedQuery({
- queryKey: ['teams', { userId, modified }],
- queryFn: (params: any) => {
- return get(`/users/${userId}/teams`, params);
- },
- enabled: !!userId,
- });
-}
-
-export default useTeams;
diff --git a/src/components/hooks/queries/useTeamsQuery.ts b/src/components/hooks/queries/useTeamsQuery.ts
new file mode 100644
index 000000000..f1a09f4da
--- /dev/null
+++ b/src/components/hooks/queries/useTeamsQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useTeamsQuery(params?: Record, options?: ReactQueryOptions) {
+ const { get } = useApi();
+ const { modified } = useModified(`teams`);
+
+ return usePagedQuery({
+ queryKey: ['teams:admin', { modified, ...params }],
+ queryFn: pageParams => {
+ return get(`/admin/teams`, {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUpdateQuery.ts b/src/components/hooks/queries/useUpdateQuery.ts
new file mode 100644
index 000000000..85a94425f
--- /dev/null
+++ b/src/components/hooks/queries/useUpdateQuery.ts
@@ -0,0 +1,15 @@
+import { useToast } from '@umami/react-zen';
+import type { ApiError } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUpdateQuery(path: string, params?: Record) {
+ const { post, useMutation } = useApi();
+ const query = useMutation>({
+ mutationFn: (data: Record) => post(path, { ...data, ...params }),
+ });
+ const { touch } = useModified();
+ const { toast } = useToast();
+
+ return { ...query, touch, toast };
+}
diff --git a/src/components/hooks/queries/useUser.ts b/src/components/hooks/queries/useUser.ts
deleted file mode 100644
index 8541a2207..000000000
--- a/src/components/hooks/queries/useUser.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useApi } from '../useApi';
-
-export function useUser(userId: string, options?: { [key: string]: any }) {
- const { get, useQuery } = useApi();
- return useQuery({
- queryKey: ['users', userId],
- queryFn: () => get(`/users/${userId}`),
- enabled: !!userId,
- ...options,
- });
-}
-
-export default useUser;
diff --git a/src/components/hooks/queries/useUserQuery.ts b/src/components/hooks/queries/useUserQuery.ts
new file mode 100644
index 000000000..07e23f08b
--- /dev/null
+++ b/src/components/hooks/queries/useUserQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUserQuery(userId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`user:${userId}`);
+
+ return useQuery({
+ queryKey: ['users', { userId, modified }],
+ queryFn: () => get(`/users/${userId}`),
+ enabled: !!userId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUserTeamsQuery.ts b/src/components/hooks/queries/useUserTeamsQuery.ts
new file mode 100644
index 000000000..82f65496b
--- /dev/null
+++ b/src/components/hooks/queries/useUserTeamsQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUserTeamsQuery(userId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`teams`);
+
+ return useQuery({
+ queryKey: ['teams', { userId, modified }],
+ queryFn: () => {
+ return get(`/users/${userId}/teams`);
+ },
+ enabled: !!userId,
+ });
+}
diff --git a/src/components/hooks/queries/useUserWebsitesQuery.ts b/src/components/hooks/queries/useUserWebsitesQuery.ts
new file mode 100644
index 000000000..f98eaffbc
--- /dev/null
+++ b/src/components/hooks/queries/useUserWebsitesQuery.ts
@@ -0,0 +1,31 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useUserWebsitesQuery(
+ { userId, teamId }: { userId?: string; teamId?: string },
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return usePagedQuery({
+ queryKey: ['websites', { userId, teamId, modified, ...params }],
+ queryFn: pageParams => {
+ return get(
+ teamId
+ ? `/teams/${teamId}/websites`
+ : userId
+ ? `/users/${userId}/websites`
+ : '/me/websites',
+ {
+ ...pageParams,
+ ...params,
+ },
+ );
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUsers.ts b/src/components/hooks/queries/useUsersQuery.ts
similarity index 56%
rename from src/components/hooks/queries/useUsers.ts
rename to src/components/hooks/queries/useUsersQuery.ts
index 3d70d262d..d87900bab 100644
--- a/src/components/hooks/queries/useUsers.ts
+++ b/src/components/hooks/queries/useUsersQuery.ts
@@ -1,19 +1,17 @@
import { useApi } from '../useApi';
+import { useModified } from '../useModified';
import { usePagedQuery } from '../usePagedQuery';
-import useModified from '../useModified';
-export function useUsers() {
+export function useUsersQuery() {
const { get } = useApi();
const { modified } = useModified(`users`);
return usePagedQuery({
- queryKey: ['users', { modified }],
- queryFn: (params: any) => {
+ queryKey: ['users:admin', { modified }],
+ queryFn: (pageParams: any) => {
return get('/admin/users', {
- ...params,
+ ...pageParams,
});
},
});
}
-
-export default useUsers;
diff --git a/src/components/hooks/queries/useWebsite.ts b/src/components/hooks/queries/useWebsite.ts
deleted file mode 100644
index 9151b55d7..000000000
--- a/src/components/hooks/queries/useWebsite.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { useApi } from '../useApi';
-
-export function useWebsite(websiteId: string, options?: { [key: string]: any }) {
- const { get, useQuery } = useApi();
-
- return useQuery({
- queryKey: ['website', { websiteId }],
- queryFn: () => get(`/websites/${websiteId}`),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsite;
diff --git a/src/components/hooks/queries/useWebsiteCohortQuery.ts b/src/components/hooks/queries/useWebsiteCohortQuery.ts
new file mode 100644
index 000000000..975766e91
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteCohortQuery.ts
@@ -0,0 +1,21 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteCohortQuery(
+ websiteId: string,
+ cohortId: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`cohorts`);
+
+ return useQuery({
+ queryKey: ['website:cohorts', { websiteId, cohortId, modified }],
+ queryFn: () => get(`/websites/${websiteId}/segments/${cohortId}`),
+ enabled: !!(websiteId && cohortId),
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteCohortsQuery.ts b/src/components/hooks/queries/useWebsiteCohortsQuery.ts
new file mode 100644
index 000000000..e0cbf4ce9
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteCohortsQuery.ts
@@ -0,0 +1,25 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteCohortsQuery(
+ websiteId: string,
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`cohorts`);
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['website:cohorts', { websiteId, modified, ...filters, ...params }],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params });
+ },
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteEvents.ts b/src/components/hooks/queries/useWebsiteEvents.ts
deleted file mode 100644
index 2a47c3eb2..000000000
--- a/src/components/hooks/queries/useWebsiteEvents.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { useApi } from '../useApi';
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useFilterParams } from '../useFilterParams';
-import { usePagedQuery } from '../usePagedQuery';
-
-export function useWebsiteEvents(
- websiteId: string,
- options?: Omit,
-) {
- const { get } = useApi();
- const params = useFilterParams(websiteId);
-
- return usePagedQuery({
- queryKey: ['websites:events', { websiteId, ...params }],
- queryFn: pageParams =>
- get(`/websites/${websiteId}/events`, { ...params, ...pageParams, pageSize: 20 }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsiteEvents;
diff --git a/src/components/hooks/queries/useWebsiteEventsQuery.ts b/src/components/hooks/queries/useWebsiteEventsQuery.ts
new file mode 100644
index 000000000..fc4dad5b1
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteEventsQuery.ts
@@ -0,0 +1,39 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { usePagedQuery } from '../usePagedQuery';
+
+const EVENT_TYPES = {
+ views: 1,
+ events: 2,
+};
+
+export function useWebsiteEventsQuery(
+ websiteId: string,
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { get } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'websites:events',
+ { websiteId, startAt, endAt, unit, timezone, ...filters, ...params },
+ ],
+ queryFn: pageParams =>
+ get(`/websites/${websiteId}/events`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ eventType: EVENT_TYPES[params.view],
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteEventsSeries.ts b/src/components/hooks/queries/useWebsiteEventsSeries.ts
deleted file mode 100644
index 91c50ffff..000000000
--- a/src/components/hooks/queries/useWebsiteEventsSeries.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { useApi } from '../useApi';
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useFilterParams } from '../useFilterParams';
-
-export function useWebsiteEventsSeries(
- websiteId: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:events:series', { websiteId, ...params }],
- queryFn: () => get(`/websites/${websiteId}/events/series`, { ...params }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsiteEventsSeries;
diff --git a/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts
new file mode 100644
index 000000000..5318d0d9e
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts
@@ -0,0 +1,32 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useWebsiteEventsSeriesQuery(
+ websiteId: string,
+ params?: { limit?: number },
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:events:series',
+ { websiteId, startAt, endAt, unit, timezone, ...filters, ...params },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/events/series`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...params,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts
new file mode 100644
index 000000000..1611c7f8a
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts
@@ -0,0 +1,47 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export type WebsiteExpandedMetricsData = {
+ name: string;
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+}[];
+
+export function useWebsiteExpandedMetricsQuery(
+ websiteId: string,
+ params: { type: string; limit?: number; search?: string },
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:metrics:expanded',
+ {
+ websiteId,
+ startAt,
+ endAt,
+ ...filters,
+ ...params,
+ },
+ ],
+ queryFn: async () =>
+ get(`/websites/${websiteId}/metrics/expanded`, {
+ startAt,
+ endAt,
+ ...filters,
+ ...params,
+ }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteMetrics.ts b/src/components/hooks/queries/useWebsiteMetrics.ts
deleted file mode 100644
index 1a4202e87..000000000
--- a/src/components/hooks/queries/useWebsiteMetrics.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-import { useSearchParams } from 'next/navigation';
-
-export function useWebsiteMetrics(
- websiteId: string,
- queryParams: { type: string; limit?: number; search?: string; startAt?: number; endAt?: number },
- options?: Omit void }, 'queryKey' | 'queryFn'>,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
- const searchParams = useSearchParams();
-
- return useQuery({
- queryKey: [
- 'websites:metrics',
- {
- websiteId,
- ...params,
- ...queryParams,
- },
- ],
- queryFn: async () => {
- const data = await get(`/websites/${websiteId}/metrics`, {
- ...params,
- [searchParams.get('view')]: undefined,
- ...queryParams,
- });
-
- options?.onDataLoad?.(data);
-
- return data;
- },
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsiteMetrics;
diff --git a/src/components/hooks/queries/useWebsiteMetricsQuery.ts b/src/components/hooks/queries/useWebsiteMetricsQuery.ts
new file mode 100644
index 000000000..cd064af68
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteMetricsQuery.ts
@@ -0,0 +1,43 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export type WebsiteMetricsData = {
+ x: string;
+ y: number;
+}[];
+
+export function useWebsiteMetricsQuery(
+ websiteId: string,
+ params: { type: string; limit?: number; search?: string },
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:metrics',
+ {
+ websiteId,
+ startAt,
+ endAt,
+ ...filters,
+ ...params,
+ },
+ ],
+ queryFn: async () =>
+ get(`/websites/${websiteId}/metrics`, {
+ startAt,
+ endAt,
+ ...filters,
+ ...params,
+ }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsitePageviews.ts b/src/components/hooks/queries/useWebsitePageviews.ts
deleted file mode 100644
index 43c51745e..000000000
--- a/src/components/hooks/queries/useWebsitePageviews.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-
-export function useWebsitePageviews(
- websiteId: string,
- compare?: string,
- options?: Omit,
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:pageviews', { websiteId, ...params, compare }],
- queryFn: () => get(`/websites/${websiteId}/pageviews`, { ...params, compare }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsitePageviews;
diff --git a/src/components/hooks/queries/useWebsitePageviewsQuery.ts b/src/components/hooks/queries/useWebsitePageviewsQuery.ts
new file mode 100644
index 000000000..b35c8200c
--- /dev/null
+++ b/src/components/hooks/queries/useWebsitePageviewsQuery.ts
@@ -0,0 +1,36 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export interface WebsitePageviewsData {
+ pageviews: { x: string; y: number }[];
+ sessions: { x: string; y: number }[];
+}
+
+export function useWebsitePageviewsQuery(
+ { websiteId, compare }: { websiteId: string; compare?: string },
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const queryParams = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:pageviews',
+ { websiteId, compare, startAt, endAt, unit, timezone, ...queryParams },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/pageviews`, {
+ compare,
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...queryParams,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteQuery.ts b/src/components/hooks/queries/useWebsiteQuery.ts
new file mode 100644
index 000000000..b4a60c495
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteQuery(websiteId?: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`website:${websiteId}`);
+
+ return useQuery({
+ queryKey: ['website', { websiteId, modified }],
+ queryFn: () => get(`/websites/${websiteId}`),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSegmentQuery.ts b/src/components/hooks/queries/useWebsiteSegmentQuery.ts
new file mode 100644
index 000000000..1923fbd86
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSegmentQuery.ts
@@ -0,0 +1,21 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteSegmentQuery(
+ websiteId: string,
+ segmentId: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`segments`);
+
+ return useQuery({
+ queryKey: ['website:segments', { websiteId, segmentId, modified }],
+ queryFn: () => get(`/websites/${websiteId}/segments/${segmentId}`),
+ enabled: !!(websiteId && segmentId),
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSegmentsQuery.ts b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts
new file mode 100644
index 000000000..8d3af9631
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts
@@ -0,0 +1,24 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteSegmentsQuery(
+ websiteId: string,
+ params?: Record,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`segments`);
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['website:segments', { websiteId, modified, ...filters, ...params }],
+ queryFn: pageParams =>
+ get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSession.ts b/src/components/hooks/queries/useWebsiteSessionQuery.ts
similarity index 64%
rename from src/components/hooks/queries/useWebsiteSession.ts
rename to src/components/hooks/queries/useWebsiteSessionQuery.ts
index 93e9057c6..b175662db 100644
--- a/src/components/hooks/queries/useWebsiteSession.ts
+++ b/src/components/hooks/queries/useWebsiteSessionQuery.ts
@@ -1,6 +1,6 @@
import { useApi } from '../useApi';
-export function useWebsiteSession(websiteId: string, sessionId: string) {
+export function useWebsiteSessionQuery(websiteId: string, sessionId: string | undefined) {
const { get, useQuery } = useApi();
return useQuery({
@@ -8,7 +8,6 @@ export function useWebsiteSession(websiteId: string, sessionId: string) {
queryFn: () => {
return get(`/websites/${websiteId}/sessions/${sessionId}`);
},
+ enabled: Boolean(websiteId && sessionId),
});
}
-
-export default useWebsiteSession;
diff --git a/src/components/hooks/queries/useWebsiteSessionStats.ts b/src/components/hooks/queries/useWebsiteSessionStats.ts
deleted file mode 100644
index 5c02cfdce..000000000
--- a/src/components/hooks/queries/useWebsiteSessionStats.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-
-export function useWebsiteSessionStats(websiteId: string, options?: { [key: string]: string }) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['sessions:stats', { websiteId, ...params }],
- queryFn: () => get(`/websites/${websiteId}/sessions/stats`, { ...params }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsiteSessionStats;
diff --git a/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts
new file mode 100644
index 000000000..bac9fc90e
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts
@@ -0,0 +1,17 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useWebsiteSessionStatsQuery(websiteId: string, options?: Record) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['sessions:stats', { websiteId, startAt, endAt, unit, timezone, ...filters }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/sessions/stats`, { startAt, endAt, unit, timezone, ...filters }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSessions.ts b/src/components/hooks/queries/useWebsiteSessions.ts
deleted file mode 100644
index 09e34a803..000000000
--- a/src/components/hooks/queries/useWebsiteSessions.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useApi } from '../useApi';
-import { usePagedQuery } from '../usePagedQuery';
-import useModified from '../useModified';
-import { useFilterParams } from '@/components/hooks/useFilterParams';
-
-export function useWebsiteSessions(websiteId: string, params?: { [key: string]: string | number }) {
- const { get } = useApi();
- const { modified } = useModified(`sessions`);
- const filters = useFilterParams(websiteId);
-
- return usePagedQuery({
- queryKey: ['sessions', { websiteId, modified, ...params, ...filters }],
- queryFn: (data: any) => {
- return get(`/websites/${websiteId}/sessions`, {
- ...data,
- ...params,
- ...filters,
- pageSize: 20,
- });
- },
- });
-}
-
-export default useWebsiteSessions;
diff --git a/src/components/hooks/queries/useWebsiteSessionsQuery.ts b/src/components/hooks/queries/useWebsiteSessionsQuery.ts
new file mode 100644
index 000000000..31906be90
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSessionsQuery.ts
@@ -0,0 +1,34 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useWebsiteSessionsQuery(
+ websiteId: string,
+ params?: Record,
+) {
+ const { get } = useApi();
+ const { modified } = useModified(`sessions`);
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'sessions',
+ { websiteId, modified, startAt, endAt, unit, timezone, ...params, ...filters },
+ ],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/sessions`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ ...params,
+ pageSize: 20,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSessionsWeekly.ts b/src/components/hooks/queries/useWebsiteSessionsWeekly.ts
deleted file mode 100644
index f3aa3b00b..000000000
--- a/src/components/hooks/queries/useWebsiteSessionsWeekly.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useApi } from '../useApi';
-import useModified from '../useModified';
-import { useFilterParams } from '@/components/hooks/useFilterParams';
-
-export function useWebsiteSessionsWeekly(
- websiteId: string,
- params?: { [key: string]: string | number },
-) {
- const { get, useQuery } = useApi();
- const { modified } = useModified(`sessions`);
- const filters = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['sessions', { websiteId, modified, ...params, ...filters }],
- queryFn: () => {
- return get(`/websites/${websiteId}/sessions/weekly`, {
- ...params,
- ...filters,
- });
- },
- });
-}
-
-export default useWebsiteSessionsWeekly;
diff --git a/src/components/hooks/queries/useWebsiteSharesQuery.ts b/src/components/hooks/queries/useWebsiteSharesQuery.ts
new file mode 100644
index 000000000..298e4d264
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSharesQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useWebsiteSharesQuery(
+ { websiteId }: { websiteId: string },
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified('shares');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['websiteShares', { websiteId, modified }],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/shares`, pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteStats.ts b/src/components/hooks/queries/useWebsiteStats.ts
deleted file mode 100644
index 6d42009ee..000000000
--- a/src/components/hooks/queries/useWebsiteStats.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { useApi } from '../useApi';
-import { useFilterParams } from '../useFilterParams';
-
-export function useWebsiteStats(
- websiteId: string,
- compare?: string,
- options?: { [key: string]: string },
-) {
- const { get, useQuery } = useApi();
- const params = useFilterParams(websiteId);
-
- return useQuery({
- queryKey: ['websites:stats', { websiteId, ...params, compare }],
- queryFn: () => get(`/websites/${websiteId}/stats`, { ...params, compare }),
- enabled: !!websiteId,
- ...options,
- });
-}
-
-export default useWebsiteStats;
diff --git a/src/components/hooks/queries/useWebsiteStatsQuery.ts b/src/components/hooks/queries/useWebsiteStatsQuery.ts
new file mode 100644
index 000000000..48484a07e
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteStatsQuery.ts
@@ -0,0 +1,35 @@
+import type { UseQueryOptions } from '@tanstack/react-query';
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import { useApi } from '../useApi';
+import { useFilterParameters } from '../useFilterParameters';
+
+export interface WebsiteStatsData {
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+ comparison: {
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+ };
+}
+
+export function useWebsiteStatsQuery(
+ { websiteId, compare }: { websiteId: string; compare?: string },
+ options?: UseQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['websites:stats', { websiteId, compare, startAt, endAt, ...filters }],
+ queryFn: () => get(`/websites/${websiteId}/stats`, { compare, startAt, endAt, ...filters }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteValues.ts b/src/components/hooks/queries/useWebsiteValuesQuery.ts
similarity index 93%
rename from src/components/hooks/queries/useWebsiteValues.ts
rename to src/components/hooks/queries/useWebsiteValuesQuery.ts
index 77f65fe58..1e097369e 100644
--- a/src/components/hooks/queries/useWebsiteValues.ts
+++ b/src/components/hooks/queries/useWebsiteValuesQuery.ts
@@ -1,9 +1,9 @@
-import { useApi } from '../useApi';
import { useCountryNames } from '@/components/hooks/useCountryNames';
import { useRegionNames } from '@/components/hooks/useRegionNames';
-import useLocale from '../useLocale';
+import { useApi } from '../useApi';
+import { useLocale } from '../useLocale';
-export function useWebsiteValues({
+export function useWebsiteValuesQuery({
websiteId,
type,
startDate,
@@ -60,5 +60,3 @@ export function useWebsiteValues({
enabled: !!(websiteId && type && startDate && endDate),
});
}
-
-export default useWebsiteValues;
diff --git a/src/components/hooks/queries/useWebsites.ts b/src/components/hooks/queries/useWebsites.ts
deleted file mode 100644
index 7a5004d75..000000000
--- a/src/components/hooks/queries/useWebsites.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { useApi } from '../useApi';
-import { usePagedQuery } from '../usePagedQuery';
-import { useLogin } from './useLogin';
-import useModified from '../useModified';
-
-export function useWebsites(
- { userId, teamId }: { userId?: string; teamId?: string },
- params?: { [key: string]: string | number },
-) {
- const { get } = useApi();
- const { user } = useLogin();
- const { modified } = useModified(`websites`);
-
- return usePagedQuery({
- queryKey: ['websites', { userId, teamId, modified, ...params }],
- queryFn: (data: any) => {
- return get(teamId ? `/teams/${teamId}/websites` : `/users/${userId || user.id}/websites`, {
- ...data,
- ...params,
- });
- },
- });
-}
-
-export default useWebsites;
diff --git a/src/components/hooks/queries/useWebsitesQuery.ts b/src/components/hooks/queries/useWebsitesQuery.ts
new file mode 100644
index 000000000..a7b661864
--- /dev/null
+++ b/src/components/hooks/queries/useWebsitesQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useWebsitesQuery(params?: Record, options?: ReactQueryOptions) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return usePagedQuery({
+ queryKey: ['websites:admin', { modified, ...params }],
+ queryFn: pageParams => {
+ return get(`/admin/websites`, {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWeeklyTrafficQuery.ts b/src/components/hooks/queries/useWeeklyTrafficQuery.ts
new file mode 100644
index 000000000..df729ffd9
--- /dev/null
+++ b/src/components/hooks/queries/useWeeklyTrafficQuery.ts
@@ -0,0 +1,27 @@
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useModified } from '../useModified';
+
+export function useWeeklyTrafficQuery(websiteId: string, params?: Record) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`sessions`);
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'sessions',
+ { websiteId, modified, startAt, endAt, timezone, ...params, ...filters },
+ ],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/sessions/weekly`, {
+ startAt,
+ endAt,
+ timezone,
+ ...params,
+ ...filters,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/useApi.ts b/src/components/hooks/useApi.ts
index dfa48e2ff..35cabd529 100644
--- a/src/components/hooks/useApi.ts
+++ b/src/components/hooks/useApi.ts
@@ -1,25 +1,23 @@
+import { useMutation, useQuery } from '@tanstack/react-query';
import { useCallback } from 'react';
-import * as reactQuery from '@tanstack/react-query';
import { getClientAuthToken } from '@/lib/client';
import { SHARE_TOKEN_HEADER } from '@/lib/constants';
-import { httpGet, httpPost, httpPut, httpDelete, FetchResponse } from '@/lib/fetch';
-import useStore from '@/store/app';
+import { type FetchResponse, httpDelete, httpGet, httpPost, httpPut } from '@/lib/fetch';
+import { useApp } from '@/store/app';
const selector = (state: { shareToken: { token?: string } }) => state.shareToken;
async function handleResponse(res: FetchResponse): Promise {
if (!res.ok) {
- return Promise.reject(new Error(res.error?.error || res.error || 'Unexpectd error.'));
+ const { message, code, status } = res?.data?.error || {};
+
+ return Promise.reject(Object.assign(new Error(message), { code, status }));
}
return Promise.resolve(res.data);
}
-function handleError(err: Error | string) {
- return Promise.reject((err as Error)?.message || err || null);
-}
-
export function useApi() {
- const shareToken = useStore(selector);
+ const shareToken = useApp(selector);
const defaultHeaders = {
authorization: `Bearer ${getClientAuthToken()}`,
@@ -38,41 +36,32 @@ export function useApi() {
return {
get: useCallback(
async (url: string, params: object = {}, headers: object = {}) => {
- return httpGet(getUrl(url), params, getHeaders(headers))
- .then(handleResponse)
- .catch(handleError);
+ return httpGet(getUrl(url), params, getHeaders(headers)).then(handleResponse);
},
[httpGet],
),
post: useCallback(
async (url: string, params: object = {}, headers: object = {}) => {
- return httpPost(getUrl(url), params, getHeaders(headers))
- .then(handleResponse)
- .catch(handleError);
+ return httpPost(getUrl(url), params, getHeaders(headers)).then(handleResponse);
},
[httpPost],
),
put: useCallback(
async (url: string, params: object = {}, headers: object = {}) => {
- return httpPut(getUrl(url), params, getHeaders(headers))
- .then(handleResponse)
- .catch(handleError);
+ return httpPut(getUrl(url), params, getHeaders(headers)).then(handleResponse);
},
[httpPut],
),
del: useCallback(
async (url: string, params: object = {}, headers: object = {}) => {
- return httpDelete(getUrl(url), params, getHeaders(headers))
- .then(handleResponse)
- .catch(handleError);
+ return httpDelete(getUrl(url), params, getHeaders(headers)).then(handleResponse);
},
[httpDelete],
),
- ...reactQuery,
+ useQuery,
+ useMutation,
};
}
-
-export default useApi;
diff --git a/src/components/hooks/useConfig.ts b/src/components/hooks/useConfig.ts
new file mode 100644
index 000000000..c1cdcaf67
--- /dev/null
+++ b/src/components/hooks/useConfig.ts
@@ -0,0 +1,33 @@
+import { useEffect } from 'react';
+import { useApi } from '@/components/hooks/useApi';
+import { setConfig, useApp } from '@/store/app';
+
+export type Config = {
+ cloudMode: boolean;
+ faviconUrl?: string;
+ linksUrl?: string;
+ pixelsUrl?: string;
+ privateMode: boolean;
+ telemetryDisabled: boolean;
+ trackerScriptName?: string;
+ updatesDisabled: boolean;
+};
+
+export function useConfig(): Config {
+ const { config } = useApp();
+ const { get } = useApi();
+
+ async function loadConfig() {
+ const data = await get(`/config`);
+
+ setConfig(data);
+ }
+
+ useEffect(() => {
+ if (!config) {
+ loadConfig();
+ }
+ }, []);
+
+ return config;
+}
diff --git a/src/components/hooks/useCountryNames.ts b/src/components/hooks/useCountryNames.ts
index 12f2f0dde..1ec9fc138 100644
--- a/src/components/hooks/useCountryNames.ts
+++ b/src/components/hooks/useCountryNames.ts
@@ -1,4 +1,4 @@
-import { useState, useEffect } from 'react';
+import { useEffect, useState } from 'react';
import { httpGet } from '@/lib/fetch';
import enUS from '../../../public/intl/country/en-US.json';
@@ -30,5 +30,3 @@ export function useCountryNames(locale: string) {
return { countryNames: list };
}
-
-export default useCountryNames;
diff --git a/src/components/hooks/useDateParameters.ts b/src/components/hooks/useDateParameters.ts
new file mode 100644
index 000000000..d84b4236a
--- /dev/null
+++ b/src/components/hooks/useDateParameters.ts
@@ -0,0 +1,18 @@
+import { useDateRange } from './useDateRange';
+import { useTimezone } from './useTimezone';
+
+export function useDateParameters() {
+ const {
+ dateRange: { startDate, endDate, unit },
+ } = useDateRange();
+ const { timezone, localToUtc, canonicalizeTimezone } = useTimezone();
+
+ return {
+ startAt: +localToUtc(startDate),
+ endAt: +localToUtc(endDate),
+ startDate: localToUtc(startDate).toISOString(),
+ endDate: localToUtc(endDate).toISOString(),
+ unit,
+ timezone: canonicalizeTimezone(timezone),
+ };
+}
diff --git a/src/components/hooks/useDateRange.ts b/src/components/hooks/useDateRange.ts
index 618389805..5090bd3d8 100644
--- a/src/components/hooks/useDateRange.ts
+++ b/src/components/hooks/useDateRange.ts
@@ -1,61 +1,38 @@
-import { getMinimumUnit, parseDateRange } from '@/lib/date';
-import { setItem } from '@/lib/storage';
-import { DATE_RANGE_CONFIG, DEFAULT_DATE_COMPARE, DEFAULT_DATE_RANGE } from '@/lib/constants';
-import websiteStore, { setWebsiteDateRange, setWebsiteDateCompare } from '@/store/websites';
-import appStore, { setDateRange } from '@/store/app';
-import { DateRange } from '@/lib/types';
-import { useLocale } from './useLocale';
-import { useApi } from './useApi';
+import { useMemo } from 'react';
+import { useLocale } from '@/components/hooks/useLocale';
+import { useNavigation } from '@/components/hooks/useNavigation';
+import { DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE } from '@/lib/constants';
+import { getCompareDate, getOffsetDateRange, parseDateRange } from '@/lib/date';
+import { getItem } from '@/lib/storage';
-export function useDateRange(websiteId?: string): {
- dateRange: DateRange;
- saveDateRange: (value: string | DateRange) => void;
- dateCompare: string;
- saveDateCompare: (value: string) => void;
-} {
- const { get } = useApi();
+export function useDateRange(options: { ignoreOffset?: boolean; timezone?: string } = {}) {
+ const {
+ query: { date = '', unit = '', offset = 0, compare = 'prev' },
+ } = useNavigation();
const { locale } = useLocale();
- const websiteConfig = websiteStore(state => state[websiteId]?.dateRange);
- const defaultConfig = DEFAULT_DATE_RANGE;
- const globalConfig = appStore(state => state.dateRange);
- const dateRange = parseDateRange(websiteConfig || globalConfig || defaultConfig, locale);
- const dateCompare = websiteStore(state => state[websiteId]?.dateCompare || DEFAULT_DATE_COMPARE);
+ const dateRange = useMemo(() => {
+ const dateRangeObject = parseDateRange(
+ date || getItem(DATE_RANGE_CONFIG) || DEFAULT_DATE_RANGE_VALUE,
+ unit,
+ locale,
+ options.timezone,
+ );
- const saveDateRange = async (value: DateRange | string) => {
- if (websiteId) {
- let dateRange: DateRange | string = value;
+ return !options.ignoreOffset && offset
+ ? getOffsetDateRange(dateRangeObject, +offset)
+ : dateRangeObject;
+ }, [date, unit, offset, options]);
- if (typeof value === 'string') {
- if (value === 'all') {
- const result: any = await get(`/websites/${websiteId}/daterange`);
- const { mindate, maxdate } = result;
+ const dateCompare = getCompareDate(compare, dateRange.startDate, dateRange.endDate);
- const startDate = new Date(mindate);
- const endDate = new Date(maxdate);
-
- dateRange = {
- startDate,
- endDate,
- unit: getMinimumUnit(startDate, endDate),
- value,
- };
- } else {
- dateRange = parseDateRange(value, locale);
- }
- }
-
- setWebsiteDateRange(websiteId, dateRange as DateRange);
- } else {
- setItem(DATE_RANGE_CONFIG, value);
- setDateRange(value);
- }
+ return {
+ date,
+ unit,
+ offset,
+ compare,
+ isAllTime: date.endsWith(`:all`),
+ isCustomRange: date.startsWith('range:'),
+ dateRange,
+ dateCompare,
};
-
- const saveDateCompare = (value: string) => {
- setWebsiteDateCompare(websiteId, value);
- };
-
- return { dateRange, saveDateRange, dateCompare, saveDateCompare };
}
-
-export default useDateRange;
diff --git a/src/components/hooks/useDocumentClick.ts b/src/components/hooks/useDocumentClick.ts
index eefd93669..611f6285b 100644
--- a/src/components/hooks/useDocumentClick.ts
+++ b/src/components/hooks/useDocumentClick.ts
@@ -11,5 +11,3 @@ export function useDocumentClick(handler: (event: MouseEvent) => any) {
return null;
}
-
-export default useDocumentClick;
diff --git a/src/components/hooks/useEscapeKey.ts b/src/components/hooks/useEscapeKey.ts
index 5c3350e73..cc1d30892 100644
--- a/src/components/hooks/useEscapeKey.ts
+++ b/src/components/hooks/useEscapeKey.ts
@@ -1,4 +1,4 @@
-import { useEffect, useCallback, KeyboardEvent } from 'react';
+import { type KeyboardEvent, useCallback, useEffect } from 'react';
export function useEscapeKey(handler: (event: KeyboardEvent) => void) {
const escFunction = useCallback((event: KeyboardEvent) => {
@@ -17,5 +17,3 @@ export function useEscapeKey(handler: (event: KeyboardEvent) => void) {
return null;
}
-
-export default useEscapeKey;
diff --git a/src/components/hooks/useFields.ts b/src/components/hooks/useFields.ts
index 08b5b1652..7b473cf89 100644
--- a/src/components/hooks/useFields.ts
+++ b/src/components/hooks/useFields.ts
@@ -1,26 +1,142 @@
import { useMessages } from './useMessages';
-export function useFields() {
- const { formatMessage, labels } = useMessages();
+export type FieldGroup = 'url' | 'sources' | 'location' | 'environment' | 'utm' | 'other';
- const fields = [
- // { name: 'cohort', type: 'string', label: formatMessage(labels.cohort) },
- // { name: 'segment', type: 'string', label: formatMessage(labels.segment) },
- { name: 'url', type: 'string', label: formatMessage(labels.url) },
- { name: 'title', type: 'string', label: formatMessage(labels.pageTitle) },
- { name: 'referrer', type: 'string', label: formatMessage(labels.referrer) },
- { name: 'query', type: 'string', label: formatMessage(labels.query) },
- { name: 'browser', type: 'string', label: formatMessage(labels.browser) },
- { name: 'os', type: 'string', label: formatMessage(labels.os) },
- { name: 'device', type: 'string', label: formatMessage(labels.device) },
- { name: 'country', type: 'string', label: formatMessage(labels.country) },
- { name: 'region', type: 'string', label: formatMessage(labels.region) },
- { name: 'city', type: 'string', label: formatMessage(labels.city) },
- { name: 'host', type: 'string', label: formatMessage(labels.host) },
- { name: 'tag', type: 'string', label: formatMessage(labels.tag) },
- ];
-
- return { fields };
+export interface Field {
+ name: string;
+ filterLabel: string;
+ label: string;
+ group: FieldGroup;
}
-export default useFields;
+export function useFields() {
+ const { t, labels } = useMessages();
+
+ const fields: Field[] = [
+ {
+ name: 'path',
+ filterLabel: t(labels.path),
+ label: t(labels.path),
+ group: 'url',
+ },
+ {
+ name: 'query',
+ filterLabel: t(labels.query),
+ label: t(labels.query),
+ group: 'url',
+ },
+ {
+ name: 'title',
+ filterLabel: t(labels.pageTitle),
+ label: t(labels.pageTitle),
+ group: 'url',
+ },
+ {
+ name: 'referrer',
+ filterLabel: t(labels.referrer),
+ label: t(labels.referrer),
+ group: 'sources',
+ },
+ {
+ name: 'country',
+ filterLabel: t(labels.country),
+ label: t(labels.country),
+ group: 'location',
+ },
+ {
+ name: 'region',
+ filterLabel: t(labels.region),
+ label: t(labels.region),
+ group: 'location',
+ },
+ {
+ name: 'city',
+ filterLabel: t(labels.city),
+ label: t(labels.city),
+ group: 'location',
+ },
+ {
+ name: 'browser',
+ filterLabel: t(labels.browser),
+ label: t(labels.browser),
+ group: 'environment',
+ },
+ {
+ name: 'os',
+ filterLabel: t(labels.os),
+ label: t(labels.os),
+ group: 'environment',
+ },
+ {
+ name: 'device',
+ filterLabel: t(labels.device),
+ label: t(labels.device),
+ group: 'environment',
+ },
+ {
+ name: 'utmSource',
+ filterLabel: t(labels.source),
+ label: t(labels.utmSource),
+ group: 'utm',
+ },
+ {
+ name: 'utmMedium',
+ filterLabel: t(labels.medium),
+ label: t(labels.utmMedium),
+ group: 'utm',
+ },
+ {
+ name: 'utmCampaign',
+ filterLabel: t(labels.campaign),
+ label: t(labels.utmCampaign),
+ group: 'utm',
+ },
+ {
+ name: 'utmContent',
+ filterLabel: t(labels.content),
+ label: t(labels.utmContent),
+ group: 'utm',
+ },
+ {
+ name: 'utmTerm',
+ filterLabel: t(labels.term),
+ label: t(labels.utmTerm),
+ group: 'utm',
+ },
+ {
+ name: 'hostname',
+ filterLabel: t(labels.hostname),
+ label: t(labels.hostname),
+ group: 'other',
+ },
+ {
+ name: 'distinctId',
+ filterLabel: t(labels.distinctId),
+ label: t(labels.distinctId),
+ group: 'other',
+ },
+ {
+ name: 'tag',
+ filterLabel: t(labels.tag),
+ label: t(labels.tag),
+ group: 'other',
+ },
+ {
+ name: 'event',
+ filterLabel: t(labels.event),
+ label: t(labels.event),
+ group: 'other',
+ },
+ ];
+
+ const groupLabels: { key: FieldGroup; label: string }[] = [
+ { key: 'url', label: t(labels.url) },
+ { key: 'sources', label: t(labels.sources) },
+ { key: 'location', label: t(labels.location) },
+ { key: 'environment', label: t(labels.environment) },
+ { key: 'utm', label: t(labels.utm) },
+ { key: 'other', label: t(labels.other) },
+ ];
+
+ return { fields, groupLabels };
+}
diff --git a/src/components/hooks/useFilterParameters.ts b/src/components/hooks/useFilterParameters.ts
new file mode 100644
index 000000000..3579bef95
--- /dev/null
+++ b/src/components/hooks/useFilterParameters.ts
@@ -0,0 +1,29 @@
+import { useMemo } from 'react';
+import { FILTER_COLUMNS } from '@/lib/constants';
+import { useNavigation } from './useNavigation';
+
+export function useFilterParameters() {
+ const { query } = useNavigation();
+
+ return useMemo(() => {
+ const filterParams: Record = {};
+
+ for (const key of Object.keys(query)) {
+ const baseName = key.replace(/\d+$/, '');
+ if (FILTER_COLUMNS[baseName]) {
+ filterParams[key] = query[key];
+ }
+ }
+
+ return {
+ ...filterParams,
+ search: query.search,
+ segment: query.segment,
+ cohort: query.cohort,
+ excludeBounce: query.excludeBounce,
+ match: query.match,
+ page: query.page,
+ pageSize: query.pageSize,
+ };
+ }, [query]);
+}
diff --git a/src/components/hooks/useFilterParams.ts b/src/components/hooks/useFilterParams.ts
deleted file mode 100644
index 89ae87bce..000000000
--- a/src/components/hooks/useFilterParams.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { useNavigation } from './useNavigation';
-import { useDateRange } from './useDateRange';
-import { useTimezone } from './useTimezone';
-
-export function useFilterParams(websiteId: string) {
- const { dateRange } = useDateRange(websiteId);
- const { startDate, endDate, unit } = dateRange;
- const { timezone, toUtc } = useTimezone();
- const {
- query: {
- url,
- referrer,
- title,
- query,
- host,
- os,
- browser,
- device,
- country,
- region,
- city,
- event,
- tag,
- segment,
- cohort,
- },
- } = useNavigation();
-
- return {
- startAt: +toUtc(startDate),
- endAt: +toUtc(endDate),
- unit,
- timezone,
- url,
- referrer,
- title,
- query,
- host,
- os,
- browser,
- device,
- country,
- region,
- city,
- event,
- tag,
- segment,
- cohort,
- };
-}
diff --git a/src/components/hooks/useFilters.ts b/src/components/hooks/useFilters.ts
index 2b99785a6..c50625deb 100644
--- a/src/components/hooks/useFilters.ts
+++ b/src/components/hooks/useFilters.ts
@@ -1,28 +1,47 @@
+import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants';
+import { safeDecodeURIComponent } from '@/lib/url';
+import { useFields } from './useFields';
import { useMessages } from './useMessages';
-import { OPERATORS } from '@/lib/constants';
+import { useNavigation } from './useNavigation';
+import { useOperatorLabels } from './useOperatorLabels';
export function useFilters() {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
+ const { query } = useNavigation();
+ const { fields } = useFields();
+ const operatorLabels = useOperatorLabels();
- const operatorLabels = {
- [OPERATORS.equals]: formatMessage(labels.is),
- [OPERATORS.notEquals]: formatMessage(labels.isNot),
- [OPERATORS.set]: formatMessage(labels.isSet),
- [OPERATORS.notSet]: formatMessage(labels.isNotSet),
- [OPERATORS.contains]: formatMessage(labels.contains),
- [OPERATORS.doesNotContain]: formatMessage(labels.doesNotContain),
- [OPERATORS.true]: formatMessage(labels.true),
- [OPERATORS.false]: formatMessage(labels.false),
- [OPERATORS.greaterThan]: formatMessage(labels.greaterThan),
- [OPERATORS.lessThan]: formatMessage(labels.lessThan),
- [OPERATORS.greaterThanEquals]: formatMessage(labels.greaterThanEquals),
- [OPERATORS.lessThanEquals]: formatMessage(labels.lessThanEquals),
- [OPERATORS.before]: formatMessage(labels.before),
- [OPERATORS.after]: formatMessage(labels.after),
- };
+ const operators = [
+ { name: 'eq', type: 'string', label: t(labels.is) },
+ { name: 'neq', type: 'string', label: t(labels.isNot) },
+ { name: 'c', type: 'string', label: t(labels.contains) },
+ { name: 'dnc', type: 'string', label: t(labels.doesNotContain) },
+ { name: 're', type: 'string', label: t(labels.regexMatch) },
+ { name: 'nre', type: 'string', label: t(labels.regexNotMatch) },
+ { name: 'i', type: 'array', label: t(labels.includes) },
+ { name: 'dni', type: 'array', label: t(labels.doesNotInclude) },
+ { name: 't', type: 'boolean', label: t(labels.isTrue) },
+ { name: 'f', type: 'boolean', label: t(labels.isFalse) },
+ { name: 'eq', type: 'number', label: t(labels.is) },
+ { name: 'neq', type: 'number', label: t(labels.isNot) },
+ { name: 'gt', type: 'number', label: t(labels.greaterThan) },
+ { name: 'lt', type: 'number', label: t(labels.lessThan) },
+ { name: 'gte', type: 'number', label: t(labels.greaterThanEquals) },
+ { name: 'lte', type: 'number', label: t(labels.lessThanEquals) },
+ { name: 'bf', type: 'date', label: t(labels.before) },
+ { name: 'af', type: 'date', label: t(labels.after) },
+ { name: 'eq', type: 'uuid', label: t(labels.is) },
+ ];
const typeFilters = {
- string: [OPERATORS.equals, OPERATORS.notEquals, OPERATORS.contains, OPERATORS.doesNotContain],
+ string: [
+ OPERATORS.equals,
+ OPERATORS.notEquals,
+ OPERATORS.contains,
+ OPERATORS.doesNotContain,
+ OPERATORS.regex,
+ OPERATORS.notRegex,
+ ],
array: [OPERATORS.contains, OPERATORS.doesNotContain],
boolean: [OPERATORS.true, OPERATORS.false],
number: [
@@ -37,17 +56,40 @@ export function useFilters() {
uuid: [OPERATORS.equals],
};
- const filters = Object.keys(typeFilters).flatMap(key => {
- return (
- typeFilters[key]?.map(value => ({ type: key, value, label: operatorLabels[value] })) ?? []
- );
- });
+ const filters = Object.keys(query).reduce((arr, key) => {
+ const baseName = key.replace(/\d+$/, '');
+ if (FILTER_COLUMNS[baseName]) {
+ let operator = 'eq';
+ let value = safeDecodeURIComponent(query[key]);
+ const label = fields.find(({ name }) => name === baseName)?.label;
- const getFilters = type => {
- return typeFilters[type]?.map(key => ({ type, value: key, label: operatorLabels[key] })) ?? [];
+ const match = value.match(/^([a-z]+)\.(.*)/);
+
+ if (match) {
+ operator = match[1];
+ value = match[2];
+ }
+
+ return arr.concat({
+ name: key,
+ type: baseName,
+ operator,
+ value,
+ label,
+ });
+ }
+ return arr;
+ }, []);
+
+ const getFilters = (type: string) => {
+ return (
+ typeFilters[type]?.map((key: string | number) => ({
+ type,
+ value: key,
+ label: operatorLabels[key],
+ })) ?? []
+ );
};
- return { filters, operatorLabels, typeFilters, getFilters };
+ return { fields, operators, filters, operatorLabels, typeFilters, getFilters };
}
-
-export default useFilters;
diff --git a/src/components/hooks/useForceUpdate.ts b/src/components/hooks/useForceUpdate.ts
index 35f7fe162..550cc5cda 100644
--- a/src/components/hooks/useForceUpdate.ts
+++ b/src/components/hooks/useForceUpdate.ts
@@ -7,5 +7,3 @@ export function useForceUpdate() {
update(Object.create(null));
}, [update]);
}
-
-export default useForceUpdate;
diff --git a/src/components/hooks/useFormat.ts b/src/components/hooks/useFormat.ts
index 43cba374e..998102c31 100644
--- a/src/components/hooks/useFormat.ts
+++ b/src/components/hooks/useFormat.ts
@@ -1,12 +1,12 @@
-import useMessages from './useMessages';
import { BROWSERS, OS_NAMES } from '@/lib/constants';
-import useLocale from './useLocale';
-import useCountryNames from './useCountryNames';
-import useLanguageNames from './useLanguageNames';
import regions from '../../../public/iso-3166-2.json';
+import { useCountryNames } from './useCountryNames';
+import { useLanguageNames } from './useLanguageNames';
+import { useLocale } from './useLocale';
+import { useMessages } from './useMessages';
export function useFormat() {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const { locale } = useLocale();
const { countryNames } = useCountryNames(locale);
const { languageNames } = useLanguageNames(locale);
@@ -20,7 +20,7 @@ export function useFormat() {
};
const formatDevice = (value: string): string => {
- return formatMessage(labels[value] || labels.unknown);
+ return t(labels[value] || labels.unknown);
};
const formatCountry = (value: string): string => {
@@ -40,7 +40,7 @@ export function useFormat() {
return languageNames[value?.split('-')[0]] || value;
};
- const formatValue = (value: string, type: string, data?: { [key: string]: any }): string => {
+ const formatValue = (value: string, type: string, data?: Record): string => {
switch (type) {
case 'os':
return formatOS(value);
@@ -57,7 +57,7 @@ export function useFormat() {
case 'language':
return formatLanguage(value);
default:
- return value;
+ return typeof value === 'string' ? value : undefined;
}
};
@@ -72,5 +72,3 @@ export function useFormat() {
formatValue,
};
}
-
-export default useFormat;
diff --git a/src/components/hooks/useGlobalState.ts b/src/components/hooks/useGlobalState.ts
new file mode 100644
index 000000000..6f21226b5
--- /dev/null
+++ b/src/components/hooks/useGlobalState.ts
@@ -0,0 +1,13 @@
+import { create } from 'zustand';
+
+const store = create(() => ({}));
+
+const useGlobalState = (key: string, value?: any) => {
+ if (value !== undefined && store.getState()[key] === undefined) {
+ store.setState({ [key]: value });
+ }
+
+ return [store(state => state[key]), (value: any) => store.setState({ [key]: value })];
+};
+
+export { useGlobalState };
diff --git a/src/components/hooks/useLanguageNames.ts b/src/components/hooks/useLanguageNames.ts
index 8c28d5606..0cc03d7c1 100644
--- a/src/components/hooks/useLanguageNames.ts
+++ b/src/components/hooks/useLanguageNames.ts
@@ -1,4 +1,4 @@
-import { useState, useEffect } from 'react';
+import { useEffect, useState } from 'react';
import { httpGet } from '@/lib/fetch';
import enUS from '../../../public/intl/language/en-US.json';
@@ -30,5 +30,3 @@ export function useLanguageNames(locale) {
return { languageNames: list };
}
-
-export default useLanguageNames;
diff --git a/src/components/hooks/useLocale.ts b/src/components/hooks/useLocale.ts
index 863b20a54..dc8d5d180 100644
--- a/src/components/hooks/useLocale.ts
+++ b/src/components/hooks/useLocale.ts
@@ -1,20 +1,20 @@
import { useEffect } from 'react';
-import { httpGet } from '@/lib/fetch';
-import { setItem } from '@/lib/storage';
import { LOCALE_CONFIG } from '@/lib/constants';
+import { httpGet } from '@/lib/fetch';
import { getDateLocale, getTextDirection } from '@/lib/lang';
-import useStore, { setLocale } from '@/store/app';
+import { setItem } from '@/lib/storage';
+import { setLocale, useApp } from '@/store/app';
+import enUS from '../../../public/intl/messages/en-US.json';
import { useForceUpdate } from './useForceUpdate';
-import enUS from '../../../public/intl/country/en-US.json';
const messages = {
'en-US': enUS,
};
-const selector = (state: { locale: any }) => state.locale;
+const selector = (state: { locale: string }) => state.locale;
export function useLocale() {
- const locale = useStore(selector);
+ const locale = useApp(selector);
const forceUpdate = useForceUpdate();
const dir = getTextDirection(locale);
const dateLocale = getDateLocale(locale);
@@ -58,5 +58,3 @@ export function useLocale() {
return { locale, saveLocale, messages, dir, dateLocale };
}
-
-export default useLocale;
diff --git a/src/components/hooks/useMessages.ts b/src/components/hooks/useMessages.ts
index fc73494f5..4519aefbd 100644
--- a/src/components/hooks/useMessages.ts
+++ b/src/components/hooks/useMessages.ts
@@ -1,27 +1,25 @@
-import { useIntl } from 'react-intl';
-import { messages, labels } from '@/components/messages';
+import { useTranslations } from 'next-intl';
+import { labels, messages } from '@/components/messages';
+import type { ApiError } from '@/lib/types';
-export function useMessages(): any {
- const intl = useIntl();
+export function useMessages() {
+ const t = useTranslations();
- const getMessage = (id: string) => {
- const message = Object.values(messages).find(value => value.id === id);
+ const getMessage = (id: string) => t(`message.${id}`);
- return message ? formatMessage(message) : id;
+ const getErrorMessage = (error: string | Error | undefined) => {
+ if (!error) {
+ return undefined;
+ }
+
+ if (typeof error === 'string') {
+ return error;
+ }
+
+ const code = (error as ApiError)?.code;
+
+ return code ? getMessage(code) : error?.message || 'Unknown error';
};
- const formatMessage = (
- descriptor: {
- id: string;
- defaultMessage: string;
- },
- values?: { [key: string]: string },
- opts?: any,
- ) => {
- return descriptor ? intl.formatMessage(descriptor, values, opts) : null;
- };
-
- return { formatMessage, messages, labels, getMessage };
+ return { t, messages, labels, getMessage, getErrorMessage };
}
-
-export default useMessages;
diff --git a/src/components/hooks/useMobile.ts b/src/components/hooks/useMobile.ts
new file mode 100644
index 000000000..c3b659720
--- /dev/null
+++ b/src/components/hooks/useMobile.ts
@@ -0,0 +1,9 @@
+import { useBreakpoint } from '@umami/react-zen';
+
+export function useMobile() {
+ const breakpoint = useBreakpoint();
+ const isMobile = ['base', 'sm', 'md'].includes(breakpoint);
+ const isPhone = ['base', 'sm'].includes(breakpoint);
+
+ return { breakpoint, isMobile, isPhone };
+}
diff --git a/src/components/hooks/useModified.ts b/src/components/hooks/useModified.ts
index fd8dc2e67..ea88888a5 100644
--- a/src/components/hooks/useModified.ts
+++ b/src/components/hooks/useModified.ts
@@ -1,15 +1,13 @@
-import useStore from '@/store/modified';
+import { create } from 'zustand';
+
+const store = create(() => ({}));
+
+export function touch(key: string) {
+ store.setState({ [key]: Date.now() });
+}
export function useModified(key?: string) {
- const modified = useStore(state => state?.[key]);
-
- const touch = (id?: string) => {
- if (id || key) {
- useStore.setState({ [id || key]: Date.now() });
- }
- };
+ const modified = store(state => state?.[key]);
return { modified, touch };
}
-
-export default useModified;
diff --git a/src/components/hooks/useNavigation.ts b/src/components/hooks/useNavigation.ts
index b727ee90a..f5eae008c 100644
--- a/src/components/hooks/useNavigation.ts
+++ b/src/components/hooks/useNavigation.ts
@@ -1,32 +1,58 @@
-import { useMemo } from 'react';
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
-import { buildUrl } from '@/lib/url';
+import { useCallback, useEffect, useState } from 'react';
+import { buildPath } from '@/lib/url';
-export function useNavigation(): {
- pathname: string;
- query: { [key: string]: string };
- router: any;
- renderUrl: (params: any, reset?: boolean) => string;
-} {
+export function useNavigation() {
const router = useRouter();
const pathname = usePathname();
- const params = useSearchParams();
+ const searchParams = useSearchParams();
+ const [, teamId] = pathname.match(/\/teams\/([a-f0-9-]+)/) || [];
+ const [, websiteId] = pathname.match(/\/websites\/([a-f0-9-]+)/) || [];
+ const [, linkId] = pathname.match(/\/links\/([a-f0-9-]+)/) || [];
+ const [, pixelId] = pathname.match(/\/pixels\/([a-f0-9-]+)/) || [];
+ const [, boardId] = pathname.match(/\/boards\/([a-f0-9-]+)/) || [];
+ const [queryParams, setQueryParams] = useState(Object.fromEntries(searchParams));
- const query = useMemo(() => {
- const obj = {};
+ const updateParams = useCallback(
+ (params?: Record) => {
+ return buildPath(pathname, { ...queryParams, ...params });
+ },
+ [pathname, queryParams],
+ );
- for (const [key, value] of params.entries()) {
- obj[key] = value;
- }
+ const replaceParams = useCallback(
+ (params?: Record) => {
+ return buildPath(pathname, params);
+ },
+ [pathname],
+ );
- return obj;
- }, [params]);
+ const renderUrl = useCallback(
+ (path: string, params?: Record | false) => {
+ return buildPath(
+ teamId ? `/teams/${teamId}${path}` : path,
+ params === false ? {} : { ...queryParams, ...params },
+ );
+ },
+ [teamId, queryParams],
+ );
- function renderUrl(params: any, reset?: boolean) {
- return reset ? pathname : buildUrl(pathname, { ...query, ...params });
- }
+ useEffect(() => {
+ setQueryParams(Object.fromEntries(searchParams));
+ }, [searchParams.toString()]);
- return { pathname, query, router, renderUrl };
+ return {
+ router,
+ pathname,
+ searchParams,
+ query: queryParams,
+ teamId,
+ websiteId,
+ linkId,
+ pixelId,
+ boardId,
+ updateParams,
+ replaceParams,
+ renderUrl,
+ };
}
-
-export default useNavigation;
diff --git a/src/components/hooks/useOperatorLabels.ts b/src/components/hooks/useOperatorLabels.ts
new file mode 100644
index 000000000..b92d92dff
--- /dev/null
+++ b/src/components/hooks/useOperatorLabels.ts
@@ -0,0 +1,23 @@
+import { OPERATORS } from '@/lib/constants';
+import { useMessages } from './useMessages';
+
+export function useOperatorLabels(): Record {
+ const { t, labels } = useMessages();
+
+ return {
+ [OPERATORS.equals]: t(labels.is),
+ [OPERATORS.notEquals]: t(labels.isNot),
+ [OPERATORS.set]: t(labels.isSet),
+ [OPERATORS.notSet]: t(labels.isNotSet),
+ [OPERATORS.contains]: t(labels.contains),
+ [OPERATORS.doesNotContain]: t(labels.doesNotContain),
+ [OPERATORS.true]: t(labels.true),
+ [OPERATORS.false]: t(labels.false),
+ [OPERATORS.greaterThan]: t(labels.greaterThan),
+ [OPERATORS.lessThan]: t(labels.lessThan),
+ [OPERATORS.greaterThanEquals]: t(labels.greaterThanEquals),
+ [OPERATORS.lessThanEquals]: t(labels.lessThanEquals),
+ [OPERATORS.before]: t(labels.before),
+ [OPERATORS.after]: t(labels.after),
+ };
+}
diff --git a/src/components/hooks/usePageParameters.ts b/src/components/hooks/usePageParameters.ts
new file mode 100644
index 000000000..42cf3911c
--- /dev/null
+++ b/src/components/hooks/usePageParameters.ts
@@ -0,0 +1,16 @@
+import { useMemo } from 'react';
+import { useNavigation } from './useNavigation';
+
+export function usePageParameters() {
+ const {
+ query: { page, pageSize, search },
+ } = useNavigation();
+
+ return useMemo(() => {
+ return {
+ page,
+ pageSize,
+ search,
+ };
+ }, [page, pageSize, search]);
+}
diff --git a/src/components/hooks/usePagedQuery.ts b/src/components/hooks/usePagedQuery.ts
index b6b06e1c8..c818de643 100644
--- a/src/components/hooks/usePagedQuery.ts
+++ b/src/components/hooks/usePagedQuery.ts
@@ -1,33 +1,27 @@
-import { UseQueryOptions } from '@tanstack/react-query';
-import { useState } from 'react';
-import { PageResult, PageParams, PagedQueryResult } from '@/lib/types';
+import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
+import type { PageResult } from '@/lib/types';
import { useApi } from './useApi';
import { useNavigation } from './useNavigation';
-export function usePagedQuery({
+export function usePagedQuery({
queryKey,
queryFn,
...options
-}: Omit & { queryFn: (params?: object) => any }): PagedQueryResult {
- const { query: queryParams } = useNavigation();
- const [params, setParams] = useState({
- search: '',
- page: +queryParams.page || 1,
- });
-
+}: Omit<
+ UseQueryOptions, TError, PageResult, readonly unknown[]>,
+ 'queryFn' | 'queryKey'
+> & {
+ queryKey: readonly unknown[];
+ queryFn: (params?: object) => Promise> | PageResult;
+}): UseQueryResult, TError> {
+ const {
+ query: { page, search },
+ } = useNavigation();
const { useQuery } = useApi();
- const { data, ...query } = useQuery({
- queryKey: [{ ...queryKey, ...params }],
- queryFn: () => queryFn(params as any),
+
+ return useQuery, TError>({
+ queryKey: [...queryKey, page, search] as const,
+ queryFn: () => queryFn({ page, search }),
...options,
});
-
- return {
- result: data as PageResult,
- query,
- params,
- setParams,
- };
}
-
-export default usePagedQuery;
diff --git a/src/components/hooks/useRegionNames.ts b/src/components/hooks/useRegionNames.ts
index 1ba7feaa7..57dcc416c 100644
--- a/src/components/hooks/useRegionNames.ts
+++ b/src/components/hooks/useRegionNames.ts
@@ -1,5 +1,5 @@
-import useCountryNames from './useCountryNames';
import regions from '../../../public/iso-3166-2.json';
+import { useCountryNames } from './useCountryNames';
export function useRegionNames(locale: string) {
const { countryNames } = useCountryNames(locale);
@@ -9,11 +9,14 @@ export function useRegionNames(locale: string) {
return regions[regionCode];
}
- const region = regionCode.includes('-') ? regionCode : `${countryCode}-${regionCode}`;
+ if (!regionCode) {
+ return null;
+ }
+
+ const region = regionCode?.includes('-') ? regionCode : `${countryCode}-${regionCode}`;
+
return regions[region] ? `${regions[region]}, ${countryNames[countryCode]}` : region;
};
return { regionNames: regions, getRegionName };
}
-
-export default useRegionNames;
diff --git a/src/components/hooks/useSlug.ts b/src/components/hooks/useSlug.ts
new file mode 100644
index 000000000..b4f585af0
--- /dev/null
+++ b/src/components/hooks/useSlug.ts
@@ -0,0 +1,16 @@
+import { useConfig } from '@/components/hooks/useConfig';
+import { LINKS_URL, PIXELS_URL } from '@/lib/constants';
+
+export function useSlug(type: 'link' | 'pixel') {
+ const config = useConfig();
+ const linksUrl = config?.linksUrl;
+ const pixelsUrl = config?.pixelsUrl;
+
+ const hostUrl = type === 'link' ? linksUrl || LINKS_URL : pixelsUrl || PIXELS_URL;
+
+ const getSlugUrl = (slug: string) => {
+ return `${hostUrl}/${slug}`;
+ };
+
+ return { getSlugUrl, hostUrl };
+}
diff --git a/src/components/hooks/useSticky.ts b/src/components/hooks/useSticky.ts
index 459c489ad..ef9fb36f3 100644
--- a/src/components/hooks/useSticky.ts
+++ b/src/components/hooks/useSticky.ts
@@ -1,4 +1,4 @@
-import { useState, useEffect, useRef } from 'react';
+import { useEffect, useRef, useState } from 'react';
export function useSticky({ enabled = true, threshold = 1 }) {
const [isSticky, setIsSticky] = useState(false);
@@ -6,6 +6,7 @@ export function useSticky({ enabled = true, threshold = 1 }) {
useEffect(() => {
let observer: IntersectionObserver | undefined;
+ // eslint-disable-next-line no-undef
const handler: IntersectionObserverCallback = ([entry]) =>
setIsSticky(entry.intersectionRatio < threshold);
@@ -22,5 +23,3 @@ export function useSticky({ enabled = true, threshold = 1 }) {
return { ref, isSticky };
}
-
-export default useSticky;
diff --git a/src/components/hooks/useSubscription.ts b/src/components/hooks/useSubscription.ts
new file mode 100644
index 000000000..e596b35c5
--- /dev/null
+++ b/src/components/hooks/useSubscription.ts
@@ -0,0 +1,50 @@
+import { useApp } from '@/store/app';
+import { useConfig } from './useConfig';
+
+export interface Subscription {
+ isPro: boolean;
+ isBusiness: boolean;
+ isNoBilling: boolean;
+ hasSubscription: boolean;
+}
+
+const FEATURES = {
+ replays: 'isBusiness',
+} as const;
+
+export type FeatureName = keyof typeof FEATURES;
+
+const defaultSubscription: Subscription = {
+ isPro: false,
+ isBusiness: false,
+ isNoBilling: false,
+ hasSubscription: false,
+};
+
+export function useSubscription(teamId?: string | null) {
+ const { user } = useApp();
+ const config = useConfig();
+
+ const ownSubscription: Subscription = user?.subscription || defaultSubscription;
+ const teamSubscription: Subscription | null = teamId
+ ? user?.teams?.find((t: any) => t.id === teamId)?.subscription ?? null
+ : null;
+
+ const subscription: Subscription = teamSubscription || ownSubscription;
+ const cloudMode = config?.cloudMode || false;
+
+ function hasFeature(feature: FeatureName): boolean {
+ if (!cloudMode || subscription.isNoBilling) {
+ return true;
+ }
+
+ const requiredFlag = FEATURES[feature];
+ return subscription[requiredFlag] || false;
+ }
+
+ return {
+ ...subscription,
+ cloudMode,
+ hasFeature,
+ };
+}
diff --git a/src/components/hooks/useTeamUrl.ts b/src/components/hooks/useTeamUrl.ts
deleted file mode 100644
index b2aa8ea7c..000000000
--- a/src/components/hooks/useTeamUrl.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { usePathname } from 'next/navigation';
-
-export function useTeamUrl(): {
- teamId?: string;
- renderTeamUrl: (url: string) => string;
-} {
- const pathname = usePathname();
- const [, teamId] = pathname.match(/^\/teams\/([a-f0-9-]+)/) || [];
-
- function renderTeamUrl(url: string) {
- return teamId ? `/teams/${teamId}${url}` : url;
- }
-
- return { teamId, renderTeamUrl };
-}
-
-export default useTeamUrl;
diff --git a/src/components/hooks/useTheme.ts b/src/components/hooks/useTheme.ts
deleted file mode 100644
index 9bbe063c7..000000000
--- a/src/components/hooks/useTheme.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { useEffect, useMemo } from 'react';
-import useStore, { setTheme } from '@/store/app';
-import { getItem, setItem } from '@/lib/storage';
-import { DEFAULT_THEME, THEME_COLORS, THEME_CONFIG } from '@/lib/constants';
-import { colord } from 'colord';
-
-const selector = (state: { theme: string }) => state.theme;
-
-export function useTheme() {
- const theme = useStore(selector) || getItem(THEME_CONFIG) || DEFAULT_THEME;
- const primaryColor = colord(THEME_COLORS[theme].primary);
-
- const colors = useMemo(() => {
- return {
- theme: {
- ...THEME_COLORS[theme],
- },
- chart: {
- text: THEME_COLORS[theme].gray700,
- line: THEME_COLORS[theme].gray200,
- views: {
- hoverBackgroundColor: primaryColor.alpha(0.7).toRgbString(),
- backgroundColor: primaryColor.alpha(0.4).toRgbString(),
- borderColor: primaryColor.alpha(0.7).toRgbString(),
- hoverBorderColor: primaryColor.toRgbString(),
- },
- visitors: {
- hoverBackgroundColor: primaryColor.alpha(0.9).toRgbString(),
- backgroundColor: primaryColor.alpha(0.6).toRgbString(),
- borderColor: primaryColor.alpha(0.9).toRgbString(),
- hoverBorderColor: primaryColor.toRgbString(),
- },
- },
- map: {
- baseColor: THEME_COLORS[theme].primary,
- fillColor: THEME_COLORS[theme].gray100,
- strokeColor: THEME_COLORS[theme].primary,
- hoverColor: THEME_COLORS[theme].primary,
- },
- };
- }, [theme]);
-
- const saveTheme = (value: string) => {
- setItem(THEME_CONFIG, value);
- setTheme(value);
- };
-
- useEffect(() => {
- document.body.setAttribute('data-theme', theme);
- }, [theme]);
-
- useEffect(() => {
- const url = new URL(window?.location?.href);
- const theme = url.searchParams.get('theme');
-
- if (['light', 'dark'].includes(theme)) {
- saveTheme(theme);
- }
- }, []);
-
- return { theme, saveTheme, colors };
-}
-
-export default useTheme;
diff --git a/src/components/hooks/useTimezone.ts b/src/components/hooks/useTimezone.ts
index 99c1f1152..ef2553902 100644
--- a/src/components/hooks/useTimezone.ts
+++ b/src/components/hooks/useTimezone.ts
@@ -1,13 +1,15 @@
+import { formatInTimeZone, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';
+import { TIMEZONE_CONFIG, TIMEZONE_LEGACY } from '@/lib/constants';
+import { getTimezone } from '@/lib/date';
import { setItem } from '@/lib/storage';
-import { TIMEZONE_CONFIG } from '@/lib/constants';
-import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz';
-import useStore, { setTimezone } from '@/store/app';
-import useLocale from './useLocale';
+import { setTimezone, useApp } from '@/store/app';
+import { useLocale } from './useLocale';
const selector = (state: { timezone: string }) => state.timezone;
export function useTimezone() {
- const timezone = useStore(selector);
+ const timezone = useApp(selector);
+ const localTimeZone = getTimezone();
const { dateLocale } = useLocale();
const saveTimezone = (value: string) => {
@@ -19,13 +21,45 @@ export function useTimezone() {
return formatInTimeZone(
/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{3})?Z$/.test(date)
? date
- : date.split(' ').join('T') + 'Z',
+ : `${date.split(' ').join('T')}Z`,
timezone,
pattern,
{ locale: dateLocale },
);
};
+ const formatSeriesTimezone = (data: any, column: string, timezone: string) => {
+ return data.map(item => {
+ const date = new Date(item[column]);
+
+ const format = new Intl.DateTimeFormat('en-US', {
+ timeZone: timezone,
+ hour12: false,
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit',
+ });
+
+ const parts = format.formatToParts(date);
+ const get = type => parts.find(p => p.type === type)?.value;
+
+ const year = get('year');
+ const month = get('month');
+ const day = get('day');
+ const hour = get('hour');
+ const minute = get('minute');
+ const second = get('second');
+
+ return {
+ ...item,
+ [column]: `${year}-${month}-${day} ${hour}:${minute}:${second}`,
+ };
+ });
+ };
+
const toUtc = (date: Date | string | number) => {
return zonedTimeToUtc(date, timezone);
};
@@ -34,7 +68,28 @@ export function useTimezone() {
return utcToZonedTime(date, timezone);
};
- return { timezone, saveTimezone, formatTimezoneDate, toUtc, fromUtc };
-}
+ const localToUtc = (date: Date | string | number) => {
+ return zonedTimeToUtc(date, localTimeZone);
+ };
-export default useTimezone;
+ const localFromUtc = (date: Date | string | number) => {
+ return utcToZonedTime(date, localTimeZone);
+ };
+
+ const canonicalizeTimezone = (timezone: string): string => {
+ return TIMEZONE_LEGACY[timezone] ?? timezone;
+ };
+
+ return {
+ timezone,
+ localTimeZone,
+ toUtc,
+ fromUtc,
+ localToUtc,
+ localFromUtc,
+ saveTimezone,
+ formatTimezoneDate,
+ formatSeriesTimezone,
+ canonicalizeTimezone,
+ };
+}
diff --git a/src/components/hooks/useWebsiteNavItems.tsx b/src/components/hooks/useWebsiteNavItems.tsx
new file mode 100644
index 000000000..11c5b8caf
--- /dev/null
+++ b/src/components/hooks/useWebsiteNavItems.tsx
@@ -0,0 +1,159 @@
+import {
+ AlignEndHorizontal,
+ ChartPie,
+ Clock,
+ Eye,
+ Sheet,
+ Tag,
+ User,
+ UserPlus,
+ Video,
+} from '@/components/icons';
+import { Funnel, Gauge, Lightning, Magnet, Money, Network, Path, Target } from '@/components/svg';
+import { useMessages } from './useMessages';
+import { useNavigation } from './useNavigation';
+
+export function useWebsiteNavItems(websiteId: string) {
+ const { t, labels } = useMessages();
+ const { pathname, renderUrl } = useNavigation();
+
+ const renderPath = (path: string) =>
+ renderUrl(`/websites/${websiteId}${path}`, {
+ event: undefined,
+ compare: undefined,
+ view: undefined,
+ unit: undefined,
+ excludeBounce: undefined,
+ });
+
+ const items = [
+ {
+ label: t(labels.traffic),
+ items: [
+ {
+ id: 'overview',
+ label: t(labels.overview),
+ icon: ,
+ path: renderPath(''),
+ },
+ {
+ id: 'events',
+ label: t(labels.events),
+ icon: ,
+ path: renderPath('/events'),
+ },
+ {
+ id: 'sessions',
+ label: t(labels.sessions),
+ icon: ,
+ path: renderPath('/sessions'),
+ },
+ {
+ id: 'realtime',
+ label: t(labels.realtime),
+ icon: ,
+ path: renderPath('/realtime'),
+ },
+ {
+ id: 'performance',
+ label: t(labels.performance),
+ icon: ,
+ path: renderPath('/performance'),
+ },
+ {
+ id: 'compare',
+ label: t(labels.compare),
+ icon: ,
+ path: renderPath('/compare'),
+ },
+ {
+ id: 'breakdown',
+ label: t(labels.breakdown),
+ icon: ,
+ path: renderPath('/breakdown'),
+ },
+ ],
+ },
+ {
+ label: t(labels.behavior),
+ items: [
+ {
+ id: 'goals',
+ label: t(labels.goals),
+ icon: ,
+ path: renderPath('/goals'),
+ },
+ {
+ id: 'funnel',
+ label: t(labels.funnels),
+ icon: ,
+ path: renderPath('/funnels'),
+ },
+ {
+ id: 'journeys',
+ label: t(labels.journeys),
+ icon: ,
+ path: renderPath('/journeys'),
+ },
+ {
+ id: 'retention',
+ label: t(labels.retention),
+ icon: ,
+ path: renderPath('/retention'),
+ },
+ {
+ id: 'replays',
+ label: t(labels.replays),
+ icon: ,
+ path: renderPath('/replays'),
+ },
+ ],
+ },
+ {
+ label: t(labels.audience),
+ items: [
+ {
+ id: 'segments',
+ label: t(labels.segments),
+ icon: ,
+ path: renderPath('/segments'),
+ },
+ {
+ id: 'cohorts',
+ label: t(labels.cohorts),
+ icon: ,
+ path: renderPath('/cohorts'),
+ },
+ ],
+ },
+ {
+ label: t(labels.growth),
+ items: [
+ {
+ id: 'utm',
+ label: t(labels.utm),
+ icon: ,
+ path: renderPath('/utm'),
+ },
+ {
+ id: 'revenue',
+ label: t(labels.revenue),
+ icon: ,
+ path: renderPath('/revenue'),
+ },
+ {
+ id: 'attribution',
+ label: t(labels.attribution),
+ icon: ,
+ path: renderPath('/attribution'),
+ },
+ ],
+ },
+ ];
+
+ const selectedKey = items
+ .flatMap(e => e.items)
+ .find(({ path }) => path && pathname.endsWith(path.split('?')[0]))?.id;
+
+ return { items, selectedKey, renderPath };
+}
diff --git a/src/components/icons.ts b/src/components/icons.ts
index 2667e70e9..fe433d5d2 100644
--- a/src/components/icons.ts
+++ b/src/components/icons.ts
@@ -1,63 +1 @@
-import { Icons } from 'react-basics';
-import AddUser from '@/assets/add-user.svg';
-import Bars from '@/assets/bars.svg';
-import BarChart from '@/assets/bar-chart.svg';
-import Bolt from '@/assets/bolt.svg';
-import Calendar from '@/assets/calendar.svg';
-import Change from '@/assets/change.svg';
-import Clock from '@/assets/clock.svg';
-import Compare from '@/assets/compare.svg';
-import Dashboard from '@/assets/dashboard.svg';
-import Download from '@/assets/download.svg';
-import Export from '@/assets/export.svg';
-import Eye from '@/assets/eye.svg';
-import Gear from '@/assets/gear.svg';
-import Globe from '@/assets/globe.svg';
-import Location from '@/assets/location.svg';
-import Lock from '@/assets/lock.svg';
-import Logo from '@/assets/logo.svg';
-import Magnet from '@/assets/magnet.svg';
-import Moon from '@/assets/moon.svg';
-import Nodes from '@/assets/nodes.svg';
-import Overview from '@/assets/overview.svg';
-import Profile from '@/assets/profile.svg';
-import PushPin from '@/assets/pushpin.svg';
-import Reports from '@/assets/reports.svg';
-import Sun from '@/assets/sun.svg';
-import User from '@/assets/user.svg';
-import Users from '@/assets/users.svg';
-import Visitor from '@/assets/visitor.svg';
-
-const icons = {
- ...Icons,
- AddUser,
- Bars,
- BarChart,
- Bolt,
- Calendar,
- Change,
- Clock,
- Compare,
- Dashboard,
- Download,
- Export,
- Eye,
- Gear,
- Globe,
- Location,
- Lock,
- Logo,
- Magnet,
- Moon,
- Nodes,
- Overview,
- Profile,
- PushPin,
- Reports,
- Sun,
- User,
- Users,
- Visitor,
-};
-
-export default icons;
+export * from 'lucide-react';
diff --git a/src/components/input/ActionSelect.tsx b/src/components/input/ActionSelect.tsx
new file mode 100644
index 000000000..79827ea0c
--- /dev/null
+++ b/src/components/input/ActionSelect.tsx
@@ -0,0 +1,18 @@
+import { ListItem, Select } from '@umami/react-zen';
+import { useMessages } from '@/components/hooks';
+
+export interface ActionSelectProps {
+ value?: string;
+ onChange?: (value: string) => void;
+}
+
+export function ActionSelect({ value = 'path', onChange }: ActionSelectProps) {
+ const { t, labels } = useMessages();
+
+ return (
+
+ {t(labels.viewedPage)}
+ {t(labels.triggeredEvent)}
+
+ );
+}
diff --git a/src/components/input/BoardSelect.tsx b/src/components/input/BoardSelect.tsx
new file mode 100644
index 000000000..b8fbf3a6a
--- /dev/null
+++ b/src/components/input/BoardSelect.tsx
@@ -0,0 +1,93 @@
+import { Icon, ListItem, Row, Select, type SelectProps, Text } from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { useBoardQuery, useBoardsQuery, useMessages } from '@/components/hooks';
+import { LayoutDashboard } from '@/components/icons';
+
+export function BoardSelect({
+ boardId,
+ teamId,
+ onChange,
+ isCollapsed,
+ buttonProps,
+ listProps,
+ ...props
+}: {
+ boardId?: string;
+ teamId?: string;
+ isCollapsed?: boolean;
+} & SelectProps) {
+ const { t, messages } = useMessages();
+ const { data: board } = useBoardQuery(boardId);
+ const [name, setName] = useState(board?.name);
+ const [search, setSearch] = useState('');
+ const { data, isLoading } = useBoardsQuery({ teamId }, { search, pageSize: 20 });
+ const listItems: { id: string; name: string }[] = data?.data || [];
+
+ useEffect(() => {
+ setName(board?.name);
+ }, [board?.name]);
+
+ const handleOpenChange = () => {
+ setSearch('');
+ };
+
+ const handleChange = (id: string) => {
+ setName(listItems.find(item => item.id === id)?.name);
+ onChange?.(id);
+ };
+
+ const renderValue = () => {
+ if (isCollapsed) {
+ return '';
+ }
+
+ return (
+
+
+
+
+ {name}
+
+ );
+ };
+
+ return (
+ ),
+ style: {
+ maxHeight: 'calc(42vh - 65px)',
+ width: 280,
+ ...listProps?.style,
+ },
+ }}
+ >
+ {listItems.map(({ id, name }) => (
+
+ {name}
+
+ ))}
+
+ );
+}
diff --git a/src/components/input/BounceFilter.tsx b/src/components/input/BounceFilter.tsx
new file mode 100644
index 000000000..2b5c45388
--- /dev/null
+++ b/src/components/input/BounceFilter.tsx
@@ -0,0 +1,26 @@
+'use client';
+import { Checkbox, Row } from '@umami/react-zen';
+import { useMessages } from '@/components/hooks/useMessages';
+import { useNavigation } from '@/components/hooks/useNavigation';
+
+export function BounceFilter() {
+ const { router, query, updateParams } = useNavigation();
+ const { t, labels } = useMessages();
+ const isSelected = query.excludeBounce === 'true';
+
+ const handleChange = (value: boolean) => {
+ if (value) {
+ router.push(updateParams({ excludeBounce: 'true' }));
+ } else {
+ router.push(updateParams({ excludeBounce: undefined }));
+ }
+ };
+
+ return (
+
+
+ {t(labels.excludeBounce)}
+
+
+ );
+}
diff --git a/src/components/input/CurrencySelect.tsx b/src/components/input/CurrencySelect.tsx
new file mode 100644
index 000000000..8bad9821c
--- /dev/null
+++ b/src/components/input/CurrencySelect.tsx
@@ -0,0 +1,33 @@
+import { ListItem, Select } from '@umami/react-zen';
+import { useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { CURRENCIES } from '@/lib/constants';
+
+export function CurrencySelect({ value, onChange }) {
+ const { t, labels } = useMessages();
+ const [search, setSearch] = useState('');
+
+ return (
+
+ {CURRENCIES.map(({ id, name }) => {
+ if (search && !`${id}${name}`.toLowerCase().includes(search)) {
+ return null;
+ }
+
+ return (
+
+ {id} — {name}
+
+ );
+ }).filter(n => n)}
+
+ );
+}
diff --git a/src/components/input/DateFilter.module.css b/src/components/input/DateFilter.module.css
deleted file mode 100644
index bd9ec1a8c..000000000
--- a/src/components/input/DateFilter.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.dropdown span {
- white-space: nowrap;
-}
diff --git a/src/components/input/DateFilter.tsx b/src/components/input/DateFilter.tsx
index 443827a0b..ca55bbefa 100644
--- a/src/components/input/DateFilter.tsx
+++ b/src/components/input/DateFilter.tsx
@@ -1,188 +1,141 @@
-import { useState } from 'react';
-import { Icon, Modal, Dropdown, Item, Text, Flexbox } from 'react-basics';
-import { endOfYear, isSameDay } from 'date-fns';
-import DatePickerForm from '@/components/metrics/DatePickerForm';
-import { useLocale, useMessages } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { formatDate, parseDateValue } from '@/lib/date';
-import styles from './DateFilter.module.css';
-import classNames from 'classnames';
+import { Dialog, ListItem, ListSeparator, Modal, Select, type SelectProps } from '@umami/react-zen';
+import { endOfYear } from 'date-fns';
+import { Fragment, type Key, useState } from 'react';
+import { DateDisplay } from '@/components/common/DateDisplay';
+import { useMessages, useMobile } from '@/components/hooks';
+import { DatePickerForm } from '@/components/metrics/DatePickerForm';
+import { parseDateRange } from '@/lib/date';
-export interface DateFilterProps {
- value: string;
- startDate: Date;
- endDate: Date;
- offset?: number;
- className?: string;
+export interface DateFilterProps extends SelectProps {
+ value?: string;
onChange?: (value: string) => void;
showAllTime?: boolean;
- alignment?: 'start' | 'center' | 'end';
+ renderDate?: boolean;
+ placement?: any;
}
export function DateFilter({
- startDate,
- endDate,
value,
- offset = 0,
- className,
onChange,
- showAllTime = false,
- alignment = 'end',
+ showAllTime,
+ renderDate,
+ placement = 'bottom',
+ ...props
}: DateFilterProps) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const [showPicker, setShowPicker] = useState(false);
- const { locale } = useLocale();
+ const { startDate, endDate } = parseDateRange(value) || {};
+ const { isMobile } = useMobile();
const options = [
- { label: formatMessage(labels.today), value: '0day' },
+ { label: t(labels.today), value: '0day' },
{
- label: formatMessage(labels.lastHours, { x: 24 }),
+ label: t(labels.lastHours, { x: '24' }),
value: '24hour',
},
{
- label: formatMessage(labels.thisWeek),
+ label: t(labels.thisWeek),
value: '0week',
divider: true,
},
{
- label: formatMessage(labels.lastDays, { x: 7 }),
+ label: t(labels.lastDays, { x: '7' }),
value: '7day',
},
{
- label: formatMessage(labels.thisMonth),
+ label: t(labels.thisMonth),
value: '0month',
divider: true,
},
{
- label: formatMessage(labels.lastDays, { x: 30 }),
+ label: t(labels.lastDays, { x: '30' }),
value: '30day',
},
{
- label: formatMessage(labels.lastDays, { x: 90 }),
+ label: t(labels.lastDays, { x: '90' }),
value: '90day',
},
- { label: formatMessage(labels.thisYear), value: '0year', divider: true },
+ { label: t(labels.thisYear), value: '0year' },
{
- label: formatMessage(labels.lastMonths, { x: 6 }),
+ label: t(labels.lastMonths, { x: '6' }),
value: '6month',
+ divider: true,
},
{
- label: formatMessage(labels.lastMonths, { x: 12 }),
+ label: t(labels.lastMonths, { x: '12' }),
value: '12month',
},
showAllTime && {
- label: formatMessage(labels.allTime),
+ label: t(labels.allTime),
value: 'all',
divider: true,
},
{
- label: formatMessage(labels.customRange),
+ label: t(labels.customRange),
value: 'custom',
divider: true,
},
- ].filter(n => n);
+ ]
+ .filter(n => n)
+ .map((a, id) => ({ ...a, id }));
- const handleChange = (value: string) => {
+ const handleChange = (value: Key) => {
if (value === 'custom') {
setShowPicker(true);
return;
}
- onChange(value);
+ onChange(value.toString());
};
const handlePickerChange = (value: string) => {
setShowPicker(false);
- onChange(value);
+ onChange(value.toString());
};
- const handleClose = () => setShowPicker(false);
-
- const renderValue = (value: string) => {
- const { unit } = parseDateValue(value) || {};
-
- if (offset && unit === 'year') {
- return formatDate(startDate, 'yyyy', locale);
- }
-
- if (offset && unit === 'month') {
- return formatDate(startDate, 'MMMM yyyy', locale);
- }
-
- if (value.startsWith('range') || offset) {
- return (
- handleChange('custom')}
- />
- );
- }
-
- return options.find(e => e.value === value)?.label;
+ const renderValue = ({ defaultChildren }) => {
+ return value?.startsWith('range') || renderDate ? (
+
+ ) : (
+ defaultChildren
+ );
};
+ const selectedValue = value.endsWith(':all') ? 'all' : value;
+
return (
<>
- handleChange(key as any)}
+ popoverProps={{ placement, style: { minWidth: 200 } }}
+ isFullscreen={isMobile}
>
- {({ label, value, divider }) => (
- -
- {label}
-
- )}
-
+ {options.map(({ label, value, divider }: any) => {
+ return (
+
+ {divider && }
+ {label}
+
+ );
+ })}
+
{showPicker && (
-
- setShowPicker(false)}
- />
+
+
+ setShowPicker(false)}
+ />
+
)}
>
);
}
-
-const CustomRange = ({ startDate, endDate, unit, onClick }) => {
- const { locale } = useLocale();
-
- const monthFormat = unit === 'month';
-
- function handleClick(e) {
- e.stopPropagation();
-
- onClick();
- }
-
- return (
-
-
-
-
-
- {monthFormat ? (
- <>{formatDate(startDate, 'MMMM yyyy', locale)}>
- ) : (
- <>
- {formatDate(startDate, 'd LLL y', locale)}
- {!isSameDay(startDate, endDate) && ` — ${formatDate(endDate, 'd LLL y', locale)}`}
- >
- )}
-
-
- );
-};
-
-export default DateFilter;
diff --git a/src/components/input/DialogButton.tsx b/src/components/input/DialogButton.tsx
new file mode 100644
index 000000000..6038d733b
--- /dev/null
+++ b/src/components/input/DialogButton.tsx
@@ -0,0 +1,87 @@
+import {
+ Button,
+ type ButtonProps,
+ Dialog,
+ type DialogProps,
+ DialogTrigger,
+ Modal,
+} from '@umami/react-zen';
+import type { CSSProperties, ReactNode } from 'react';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useMobile } from '@/components/hooks';
+
+export interface DialogButtonProps extends Omit {
+ icon?: ReactNode;
+ label?: ReactNode;
+ title?: ReactNode;
+ width?: string;
+ height?: string;
+ minWidth?: string;
+ minHeight?: string;
+ isOpen?: boolean;
+ onOpenChange?: (isOpen: boolean) => void;
+ children?: DialogProps['children'];
+}
+
+export function DialogButton({
+ icon,
+ label,
+ title,
+ width,
+ height,
+ minWidth,
+ minHeight,
+ isOpen,
+ onOpenChange,
+ children,
+ ...props
+}: DialogButtonProps) {
+ const { isMobile } = useMobile();
+ const style: CSSProperties = {
+ width,
+ height,
+ minWidth,
+ minHeight,
+ maxHeight: 'calc(100dvh - 40px)',
+ overflowY: 'auto',
+ padding: '32px',
+ };
+
+ if (isMobile) {
+ style.width = '100%';
+ style.height = '100%';
+ style.minWidth = undefined;
+ style.minHeight = undefined;
+ style.maxHeight = '100%';
+ style.overflowY = 'auto';
+ }
+
+ const dialog = (
+
+ {children}
+
+ );
+
+ if (isOpen !== undefined) {
+ return (
+
+ {dialog}
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ {dialog}
+
+
+ );
+}
diff --git a/src/components/input/DownloadButton.tsx b/src/components/input/DownloadButton.tsx
index 9a0e79943..cf961fa4c 100644
--- a/src/components/input/DownloadButton.tsx
+++ b/src/components/input/DownloadButton.tsx
@@ -1,7 +1,7 @@
+import { Button, Icon, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
import Papa from 'papaparse';
-import { Button, Icon, TooltipPopup } from 'react-basics';
-import Icons from '@/components/icons';
import { useMessages } from '@/components/hooks';
+import { Download } from '@/components/icons';
export function DownloadButton({
filename = 'data',
@@ -11,20 +11,23 @@ export function DownloadButton({
data?: any;
onClick?: () => void;
}) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const handleClick = async () => {
downloadCsv(`${filename}.csv`, Papa.unparse(data));
};
return (
-
-
+
+
-
+
-
+
+ {t(labels.download)}
+
+
);
}
diff --git a/src/components/input/ExportButton.tsx b/src/components/input/ExportButton.tsx
index 2b17a6299..04f2a59dc 100644
--- a/src/components/input/ExportButton.tsx
+++ b/src/components/input/ExportButton.tsx
@@ -1,47 +1,64 @@
-import { useState } from 'react';
-import { Icon, TooltipPopup, LoadingButton } from 'react-basics';
-import Icons from '@/components/icons';
-import { useMessages, useApi } from '@/components/hooks';
-import { useFilterParams } from '@/components/hooks/useFilterParams';
+import { Icon, LoadingButton, Tooltip, TooltipTrigger } from '@umami/react-zen';
import { useSearchParams } from 'next/navigation';
+import { useState } from 'react';
+import { useApi, useMessages } from '@/components/hooks';
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import { Download } from '@/components/icons';
export function ExportButton({ websiteId }: { websiteId: string }) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const [isLoading, setIsLoading] = useState(false);
- const params = useFilterParams(websiteId);
+ const date = useDateParameters();
+ const filters = useFilterParameters();
const searchParams = useSearchParams();
const { get } = useApi();
const handleClick = async () => {
setIsLoading(true);
- const { zip } = await get(`/websites/${websiteId}/export`, { ...params, ...searchParams });
+ const { zip } = await get(`/websites/${websiteId}/export`, {
+ ...date,
+ ...filters,
+ ...searchParams,
+ format: 'json',
+ });
- const binary = atob(zip);
- const bytes = new Uint8Array(binary.length);
- for (let i = 0; i < binary.length; i++) {
- bytes[i] = binary.charCodeAt(i);
- }
-
- const blob = new Blob([bytes], { type: 'application/zip' });
- const url = URL.createObjectURL(blob);
-
- const a = document.createElement('a');
- a.href = url;
- a.download = 'download.zip';
- a.click();
- URL.revokeObjectURL(url);
+ await loadZip(zip);
setIsLoading(false);
};
return (
-
-
+
+
-
+
-
+ {t(labels.download)}
+
);
}
+
+async function loadZip(zip: string) {
+ const binary = atob(zip);
+ const bytes = new Uint8Array(binary.length);
+ for (let i = 0; i < binary.length; i++) {
+ bytes[i] = binary.charCodeAt(i);
+ }
+
+ const blob = new Blob([bytes], { type: 'application/zip' });
+ const url = URL.createObjectURL(blob);
+
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = 'download.zip';
+ a.click();
+ URL.revokeObjectURL(url);
+}
diff --git a/src/components/input/FieldFilters.tsx b/src/components/input/FieldFilters.tsx
new file mode 100644
index 000000000..7107aeb2f
--- /dev/null
+++ b/src/components/input/FieldFilters.tsx
@@ -0,0 +1,171 @@
+import {
+ Button,
+ Column,
+ Grid,
+ Icon,
+ Label,
+ List,
+ ListItem,
+ ListSection,
+ Menu,
+ MenuItem,
+ MenuSection,
+ MenuTrigger,
+ Popover,
+ Row,
+ Select,
+} from '@umami/react-zen';
+import { endOfDay, subMonths } from 'date-fns';
+import type { Key } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { FilterRecord } from '@/components/common/FilterRecord';
+import { type FieldGroup, useFields, useMessages, useMobile } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+
+export interface FieldFiltersProps {
+ websiteId?: string;
+ value?: { name: string; operator: string; value: string }[];
+ exclude?: string[];
+ match?: string;
+ onChange?: (data: any) => void;
+ onMatchChange?: (match: string) => void;
+}
+
+export function FieldFilters({
+ websiteId,
+ value,
+ exclude = [],
+ match = 'all',
+ onChange,
+ onMatchChange,
+}: FieldFiltersProps) {
+ const { t, labels, messages } = useMessages();
+ const { fields, groupLabels } = useFields();
+ const startDate = subMonths(endOfDay(new Date()), 6);
+ const endDate = endOfDay(new Date());
+ const { isMobile } = useMobile();
+
+ const groupedFields = fields
+ .filter(({ name }) => !exclude.includes(name))
+ .reduce(
+ (acc, field) => {
+ const group = field.group;
+ if (!acc[group]) {
+ acc[group] = [];
+ }
+ acc[group].push(field);
+ return acc;
+ },
+ {} as Record,
+ );
+
+ const updateFilter = (index: number, props: Record) => {
+ onChange(value.map((filter, i) => (i === index ? { ...filter, ...props } : filter)));
+ };
+
+ const handleAdd = (name: Key) => {
+ onChange(value.concat({ name: name.toString(), operator: 'eq', value: '' }));
+ };
+
+ const handleChange = (index: number, val: Key) => {
+ updateFilter(index, { value: val });
+ };
+
+ const handleSelect = (index: number, operator: Key) => {
+ updateFilter(index, { operator });
+ };
+
+ const handleRemove = (index: number) => {
+ onChange(value.filter((_, i) => i !== index));
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {groupLabels.map(({ key: groupKey, label }) => {
+ const groupFields = groupedFields[groupKey];
+ if (!groupFields || groupFields.length === 0) return null;
+ return (
+
+ {groupFields.map(field => {
+ return (
+
+ {field.filterLabel}
+
+ );
+ })}
+
+ );
+ })}
+
+
+
+
+
+
+ {groupLabels.map(({ key: groupKey, label }) => {
+ const groupFields = groupedFields[groupKey];
+ if (!groupFields || groupFields.length === 0) return null;
+
+ return (
+
+ {groupFields.map(field => {
+ return (
+
+ {field.filterLabel}
+
+ );
+ })}
+
+ );
+ })}
+
+
+
+ {onMatchChange && (
+
+
+ {t(labels.match)}
+
+ {t(labels.matchAll)}
+ {t(labels.matchAny)}
+
+
+
+ )}
+ {value.map((filter, index) => {
+ return (
+ handleSelect(index, operator)}
+ onRemove={() => handleRemove(index)}
+ onChange={(_name, val) => handleChange(index, val)}
+ />
+ );
+ })}
+ {!value.length && }
+
+
+ );
+}
diff --git a/src/components/input/FilterBar.tsx b/src/components/input/FilterBar.tsx
new file mode 100644
index 000000000..90be256be
--- /dev/null
+++ b/src/components/input/FilterBar.tsx
@@ -0,0 +1,171 @@
+import {
+ Button,
+ Dialog,
+ DialogTrigger,
+ Icon,
+ Modal,
+ Row,
+ Text,
+ Tooltip,
+ TooltipTrigger,
+} from '@umami/react-zen';
+import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm';
+import {
+ useFilters,
+ useFormat,
+ useMessages,
+ useNavigation,
+ useWebsiteSegmentQuery,
+} from '@/components/hooks';
+import { Bookmark, X } from '@/components/icons';
+import { isSearchOperator } from '@/lib/params';
+
+export function FilterBar({ websiteId }: { websiteId?: string }) {
+ const { t, labels } = useMessages();
+ const { formatValue } = useFormat();
+ const {
+ router,
+ pathname,
+ updateParams,
+ replaceParams,
+ query: { segment, cohort },
+ } = useNavigation();
+ const { filters, operatorLabels } = useFilters();
+ const { data, isLoading } = useWebsiteSegmentQuery(websiteId, segment || cohort);
+ const canSaveSegment =
+ !!websiteId && filters.length > 0 && !segment && !cohort && !pathname.includes('/share');
+
+ const handleCloseFilter = (param: string) => {
+ router.push(updateParams({ [param]: undefined }));
+ };
+
+ const handleResetFilter = () => {
+ router.push(replaceParams());
+ };
+
+ const handleSegmentRemove = (type: string) => {
+ router.push(updateParams({ [type]: undefined }));
+ };
+
+ if (!filters.length && !segment && !cohort) {
+ return null;
+ }
+
+ return (
+
+
+ {segment && !isLoading && (
+ handleSegmentRemove('segment')}
+ />
+ )}
+ {cohort && !isLoading && (
+ handleSegmentRemove('cohort')}
+ />
+ )}
+ {filters.map(filter => {
+ const { name, type, label, operator, value } = filter;
+ const paramValue = isSearchOperator(operator)
+ ? value
+ : String(value)
+ .split(',')
+ .map(v => formatValue(v, type || name))
+ .join(', ');
+
+ return (
+ handleCloseFilter(name)}
+ />
+ );
+ })}
+
+
+
+ {canSaveSegment && (
+
+
+
+
+
+
+
+ {t(labels.saveSegment)}
+
+
+ )}
+
+
+ {({ close }) => {
+ return ;
+ }}
+
+
+
+
+
+
+
+
+
+
+ {t(labels.clearAll)}
+
+
+
+
+ );
+}
+
+const FilterItem = ({ name, label, operator, value, onRemove }) => {
+ return (
+
+
+
+
+ {label}
+
+ {operator}
+
+ {value}
+
+
+ onRemove(name)} size="xs" style={{ cursor: 'pointer' }}>
+
+
+
+
+ );
+};
diff --git a/src/components/input/FilterButtons.tsx b/src/components/input/FilterButtons.tsx
new file mode 100644
index 000000000..ff37fb197
--- /dev/null
+++ b/src/components/input/FilterButtons.tsx
@@ -0,0 +1,33 @@
+import { Box, ToggleGroup, ToggleGroupItem } from '@umami/react-zen';
+import { useState } from 'react';
+
+export interface FilterButtonsProps {
+ items: { id: string; label: string }[];
+ value: string;
+ onChange?: (value: string) => void;
+}
+
+export function FilterButtons({ items, value, onChange }: FilterButtonsProps) {
+ const [selected, setSelected] = useState(value);
+
+ const handleChange = (value: string) => {
+ setSelected(value);
+ onChange?.(value);
+ };
+
+ return (
+
+ handleChange(e[0])}
+ disallowEmptySelection={true}
+ >
+ {items.map(({ id, label }) => (
+
+ {label}
+
+ ))}
+
+
+ );
+}
diff --git a/src/components/input/FilterEditForm.tsx b/src/components/input/FilterEditForm.tsx
new file mode 100644
index 000000000..662be24a0
--- /dev/null
+++ b/src/components/input/FilterEditForm.tsx
@@ -0,0 +1,126 @@
+import { Button, Column, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen';
+import { useState } from 'react';
+import { useFilters, useMessages, useMobile, useNavigation } from '@/components/hooks';
+import { FieldFilters } from '@/components/input/FieldFilters';
+import { SegmentFilters } from '@/components/input/SegmentFilters';
+
+export interface FilterEditFormProps {
+ websiteId?: string;
+ onChange?: (params: {
+ filters: any[];
+ segment?: string;
+ cohort?: string;
+ match?: string;
+ }) => void;
+ onClose?: () => void;
+}
+
+export function FilterEditForm({ websiteId, onChange, onClose }: FilterEditFormProps) {
+ const {
+ query: { segment, cohort, match },
+ pathname,
+ } = useNavigation();
+ const { filters } = useFilters();
+ const { t, labels } = useMessages();
+ const [currentFilters, setCurrentFilters] = useState(filters);
+ const [currentSegment, setCurrentSegment] = useState(segment);
+ const [currentCohort, setCurrentCohort] = useState(cohort);
+ const [currentMatch, setCurrentMatch] = useState(match || 'all');
+ const { isMobile } = useMobile();
+ const isPixelLink = !websiteId || pathname.includes('/pixels') || pathname.includes('/links');
+ const excludeEvent = !pathname.endsWith('/events') && !pathname.endsWith('/replays');
+ const isPerformance = pathname.includes('/performance');
+
+ const excludedFields = isPixelLink
+ ? ['path', 'title', 'hostname', 'distinctId', 'tag', 'event']
+ : isPerformance
+ ? [
+ 'referrer',
+ 'query',
+ 'event',
+ 'tag',
+ 'distinctId',
+ 'utmSource',
+ 'utmMedium',
+ 'utmCampaign',
+ 'utmContent',
+ 'utmTerm',
+ ]
+ : excludeEvent
+ ? ['event']
+ : [];
+
+ const handleReset = () => {
+ setCurrentFilters([]);
+ setCurrentSegment(undefined);
+ setCurrentCohort(undefined);
+ setCurrentMatch('all');
+ };
+
+ const handleSave = () => {
+ onChange?.({
+ filters: currentFilters.filter(f => f.value),
+ segment: currentSegment,
+ cohort: currentCohort,
+ match: currentMatch !== 'all' ? currentMatch : undefined,
+ });
+ onClose?.();
+ };
+
+ const handleSegmentChange = (id: string, type: string) => {
+ setCurrentSegment(type === 'segment' ? id : undefined);
+ setCurrentCohort(type === 'cohort' ? id : undefined);
+ };
+
+ return (
+
+
+
+
+ {t(labels.fields)}
+ {!isPixelLink && (
+ <>
+ {t(labels.segments)}
+ {t(labels.cohorts)}
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.reset)}
+
+ {t(labels.cancel)}
+
+ {t(labels.apply)}
+
+
+
+
+ );
+}
diff --git a/src/components/input/LanguageButton.module.css b/src/components/input/LanguageButton.module.css
deleted file mode 100644
index dccb098d3..000000000
--- a/src/components/input/LanguageButton.module.css
+++ /dev/null
@@ -1,45 +0,0 @@
-.menu {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- padding: 10px;
- background: var(--base50);
- z-index: var(--z-index-popup);
- border-radius: 5px;
- border: 1px solid var(--border-color);
- margin-inline-start: 10px;
-}
-
-.item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- min-width: 200px;
- border-radius: 5px;
- padding: 5px 10px;
-}
-
-.item:hover {
- background: var(--base75);
- cursor: pointer;
-}
-
-.selected {
- font-weight: 700;
- background: var(--blue100);
-}
-
-.icon {
- color: var(--primary400);
-}
-
-@media screen and (max-width: 992px) {
- .menu {
- grid-template-columns: repeat(2, 1fr);
- }
-}
-
-@media screen and (max-width: 768px) {
- .menu {
- transform: translateX(40px);
- }
-}
diff --git a/src/components/input/LanguageButton.tsx b/src/components/input/LanguageButton.tsx
index 54ce55eb3..9ac2ec3fc 100644
--- a/src/components/input/LanguageButton.tsx
+++ b/src/components/input/LanguageButton.tsx
@@ -1,53 +1,41 @@
-import { Icon, Button, PopupTrigger, Popup } from 'react-basics';
-import classNames from 'classnames';
-import { languages } from '@/lib/lang';
+import { Button, Dialog, Grid, Icon, MenuTrigger, Popover, Text } from '@umami/react-zen';
+import { Globe } from 'lucide-react';
import { useLocale } from '@/components/hooks';
-import Icons from '@/components/icons';
-import styles from './LanguageButton.module.css';
+import { languages } from '@/lib/lang';
export function LanguageButton() {
- const { locale, saveLocale, dir } = useLocale();
+ const { locale, saveLocale } = useLocale();
const items = Object.keys(languages).map(key => ({ ...languages[key], value: key }));
- function handleSelect(value: string, close: () => void, e: MouseEvent) {
- e.stopPropagation();
+ function handleSelect(value: string) {
saveLocale(value);
- close();
}
return (
-
+
-
-
+
+
-
- {(close: () => void) => {
- return (
-
- {items.map(({ value, label }) => {
- return (
-
handleSelect(value, close, e)}
+
+
+
+ {items.map(({ value, label }) => {
+ return (
+ handleSelect(value)}>
+
- {label}
- {value === locale && (
-
-
-
- )}
-
- );
- })}
-
- );
- }}
-
-
+ {label}
+
+
+ );
+ })}
+
+
+
+
);
}
-
-export default LanguageButton;
diff --git a/src/components/input/LinkSelect.tsx b/src/components/input/LinkSelect.tsx
new file mode 100644
index 000000000..34c864e08
--- /dev/null
+++ b/src/components/input/LinkSelect.tsx
@@ -0,0 +1,97 @@
+import { Icon, ListItem, Row, Select, type SelectProps, Text } from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { useLinkQuery, useLinksQuery, useMessages } from '@/components/hooks';
+import { Link } from '@/components/icons';
+
+export function LinkSelect({
+ linkId,
+ teamId,
+ onChange,
+ isCollapsed,
+ buttonProps,
+ listProps,
+ ...props
+}: {
+ linkId?: string;
+ teamId?: string;
+ isCollapsed?: boolean;
+} & SelectProps) {
+ const { t, labels, messages } = useMessages();
+ const { data: link } = useLinkQuery(linkId);
+ const [name, setName] = useState(link?.name);
+ const [search, setSearch] = useState('');
+ const { data, isLoading } = useLinksQuery({ teamId }, { search, pageSize: 20 });
+ const listItems: { id: string; name: string }[] = data?.data || [];
+
+ useEffect(() => {
+ setName(link?.name);
+ }, [link?.name]);
+
+ const handleOpenChange = () => {
+ setSearch('');
+ };
+
+ const handleChange = (id: string) => {
+ setName(listItems.find(item => item.id === id)?.name);
+ onChange?.(id);
+ };
+
+ const renderValue = () => {
+ if (isCollapsed) {
+ return '';
+ }
+
+ const value = name || props.placeholder || t(labels.link);
+
+ return (
+
+
+
+
+
+ {value}
+
+
+ );
+ };
+
+ return (
+ ),
+ style: {
+ maxHeight: 'calc(42vh - 65px)',
+ width: 280,
+ ...listProps?.style,
+ },
+ }}
+ >
+ {listItems.map(({ id, name }) => (
+
+ {name}
+
+ ))}
+
+ );
+}
diff --git a/src/components/input/LogoutButton.tsx b/src/components/input/LogoutButton.tsx
deleted file mode 100644
index a1a34a003..000000000
--- a/src/components/input/LogoutButton.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Button, Icon, Icons, TooltipPopup } from 'react-basics';
-import Link from 'next/link';
-import { useMessages } from '@/components/hooks';
-
-export function LogoutButton({
- tooltipPosition = 'top',
-}: {
- tooltipPosition?: 'top' | 'bottom' | 'left' | 'right';
-}) {
- const { formatMessage, labels } = useMessages();
- return (
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default LogoutButton;
diff --git a/src/components/input/LookupField.tsx b/src/components/input/LookupField.tsx
new file mode 100644
index 000000000..daa95aa0c
--- /dev/null
+++ b/src/components/input/LookupField.tsx
@@ -0,0 +1,74 @@
+import { Empty } from '@/components/common/Empty';
+import { useMessages, useWebsiteValuesQuery } from '@/components/hooks';
+import { ComboBox, type ComboBoxProps, ListItem, Loading, useDebounce } from '@umami/react-zen';
+import { endOfDay, subMonths } from 'date-fns';
+import { type SetStateAction, useMemo, useState } from 'react';
+
+export interface LookupFieldProps extends Omit {
+ websiteId: string;
+ type: string;
+ value: string;
+ onChange: (value: string) => void;
+ onValueChange?: (value: string) => void;
+}
+
+export function LookupField({
+ websiteId,
+ type,
+ value,
+ onChange,
+ onValueChange,
+ ...props
+}: LookupFieldProps) {
+ const { t, messages } = useMessages();
+ const [search, setSearch] = useState(value);
+ const searchValue = useDebounce(search, 300);
+ const startDate = subMonths(endOfDay(new Date()), 6);
+ const endDate = endOfDay(new Date());
+
+ const { data, isLoading } = useWebsiteValuesQuery({
+ websiteId,
+ type,
+ search: searchValue,
+ startDate,
+ endDate,
+ });
+
+ const items: string[] = useMemo(() => {
+ return data?.map(({ value }) => value) || [];
+ }, [data]);
+
+ const handleSearch = (value: SetStateAction) => {
+ setSearch(value);
+ };
+
+ return (
+ {
+ handleSearch(value);
+ onChange?.(value);
+ onValueChange?.(value);
+ }}
+ formValue="text"
+ allowsEmptyCollection
+ allowsCustomValue
+ renderEmptyState={() =>
+ isLoading ? (
+
+ ) : (
+
+ )
+ }
+ >
+ {items.map(item => (
+
+ {item}
+
+ ))}
+
+ );
+}
diff --git a/src/components/input/MenuButton.tsx b/src/components/input/MenuButton.tsx
new file mode 100644
index 000000000..bac307fef
--- /dev/null
+++ b/src/components/input/MenuButton.tsx
@@ -0,0 +1,32 @@
+import { Button, DialogTrigger, Icon, Menu, Popover } from '@umami/react-zen';
+import type { Key, ReactNode } from 'react';
+import { Ellipsis } from '@/components/icons';
+
+export function MenuButton({
+ children,
+ onAction,
+ isDisabled,
+}: {
+ children: ReactNode;
+ onAction?: (action: string) => void;
+ isDisabled?: boolean;
+}) {
+ const handleAction = (key: Key) => {
+ onAction?.(key.toString());
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/components/input/MobileMenuButton.tsx b/src/components/input/MobileMenuButton.tsx
new file mode 100644
index 000000000..a4713ae08
--- /dev/null
+++ b/src/components/input/MobileMenuButton.tsx
@@ -0,0 +1,17 @@
+import { Button, Dialog, type DialogProps, DialogTrigger, Icon, Modal } from '@umami/react-zen';
+import { Menu } from '@/components/icons';
+
+export function MobileMenuButton(props: DialogProps) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/input/MonthFilter.tsx b/src/components/input/MonthFilter.tsx
new file mode 100644
index 000000000..dec64b0f1
--- /dev/null
+++ b/src/components/input/MonthFilter.tsx
@@ -0,0 +1,18 @@
+import { useDateRange, useNavigation } from '@/components/hooks';
+import { getMonthDateRangeValue } from '@/lib/date';
+import { MonthSelect } from './MonthSelect';
+
+export function MonthFilter() {
+ const { router, updateParams } = useNavigation();
+ const {
+ dateRange: { startDate },
+ } = useDateRange();
+
+ const handleMonthSelect = (date: Date) => {
+ const range = getMonthDateRangeValue(date);
+
+ router.push(updateParams({ date: range, offset: undefined }));
+ };
+
+ return ;
+}
diff --git a/src/components/input/MonthSelect.module.css b/src/components/input/MonthSelect.module.css
deleted file mode 100644
index 3b13bcc18..000000000
--- a/src/components/input/MonthSelect.module.css
+++ /dev/null
@@ -1,22 +0,0 @@
-.container {
- display: flex;
- align-items: center;
- justify-content: center;
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
-}
-
-.input {
- display: flex;
- align-items: center;
- gap: 10px;
- cursor: pointer;
-}
-
-.popup {
- border: 1px solid var(--base400);
- background: var(--base50);
- border-radius: var(--border-radius);
- padding: 20px;
- margin-top: 5px;
-}
diff --git a/src/components/input/MonthSelect.tsx b/src/components/input/MonthSelect.tsx
index 144f5bd80..241634edf 100644
--- a/src/components/input/MonthSelect.tsx
+++ b/src/components/input/MonthSelect.tsx
@@ -1,66 +1,47 @@
-import { useRef } from 'react';
-import {
- Text,
- Icon,
- CalendarMonthSelect,
- CalendarYearSelect,
- Button,
- PopupTrigger,
- Popup,
-} from 'react-basics';
-import { startOfMonth, endOfMonth } from 'date-fns';
-import Icons from '@/components/icons';
+import { ListItem, Row, Select } from '@umami/react-zen';
import { useLocale } from '@/components/hooks';
import { formatDate } from '@/lib/date';
-import styles from './MonthSelect.module.css';
export function MonthSelect({ date = new Date(), onChange }) {
- const { locale, dateLocale } = useLocale();
- const month = formatDate(date, 'MMMM', locale);
+ const { locale } = useLocale();
+ const month = date.getMonth();
const year = date.getFullYear();
- const ref = useRef();
+ const currentYear = new Date().getFullYear();
- const handleChange = (close: () => void, date: Date) => {
- onChange(`range:${startOfMonth(date).getTime()}:${endOfMonth(date).getTime()}`);
- close();
+ const months = [...Array(12)].map((_, i) => i);
+ const years = [...Array(10)].map((_, i) => currentYear - i);
+
+ const handleMonthChange = (month: number) => {
+ const d = new Date(date);
+ d.setMonth(month);
+ onChange?.(d);
+ };
+ const handleYearChange = (year: number) => {
+ const d = new Date(date);
+ d.setFullYear(year);
+ onChange?.(d);
};
return (
- <>
-
-
-
- {month}
-
-
-
-
-
- {close => (
-
- )}
-
-
-
-
- {year}
-
-
-
-
-
- {(close: any) => (
-
- )}
-
-
-
- >
+
+
+ {months.map(m => {
+ return (
+
+ {formatDate(new Date(year, m, 1), 'MMMM', locale)}
+
+ );
+ })}
+
+
+ {years.map(y => {
+ return (
+
+ {y}
+
+ );
+ })}
+
+
);
}
-
-export default MonthSelect;
diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx
new file mode 100644
index 000000000..e7c7504c6
--- /dev/null
+++ b/src/components/input/NavButton.tsx
@@ -0,0 +1,126 @@
+import {
+ Column,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSection,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+ Pressable,
+ Row,
+ SubmenuTrigger,
+ Text,
+} from '@umami/react-zen';
+import { ArrowRight } from 'lucide-react';
+import type { Key } from 'react';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useLoginQuery, useMessages, useMobile, useNavigation } from '@/components/hooks';
+import { ChevronRight, User, Users } from '@/components/icons';
+import { Switch } from '@/components/svg';
+import { LAST_TEAM_CONFIG } from '@/lib/constants';
+import { removeItem } from '@/lib/storage';
+
+export interface TeamsButtonProps {
+ showText?: boolean;
+ onAction?: (id: any) => void;
+}
+
+export function NavButton({ showText = true }: TeamsButtonProps) {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+ const { teamId, router } = useNavigation();
+ const { isMobile } = useMobile();
+ const team = user?.teams?.find(({ id }) => id === teamId);
+ const selectedKeys = new Set([teamId || 'user']);
+ const label = teamId ? team?.name : user.username;
+ const cloudMode = !!process.env.cloudMode;
+
+ const getUrl = (url: string) => {
+ return cloudMode ? `${process.env.cloudUrl}${url}` : url;
+ };
+
+ const handleAction = async (key: Key) => {
+ if (key === 'user') {
+ removeItem(LAST_TEAM_CONFIG);
+ if (cloudMode) {
+ window.location.href = '/';
+ } else {
+ router.push('/');
+ }
+ }
+ };
+
+ return (
+
+
+
+
+ {teamId ? : }
+ {showText && {label} }
+
+ {showText && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ } label={t(labels.switchAccount)} />
+
+
+
+
+
+
+ } label={user.username} />
+
+
+
+
+ {user?.teams?.map(({ id, name }) => (
+
+ }>
+ {name}
+
+
+ ))}
+ {user?.teams?.length === 0 && (
+
+
+
+ Manage teams
+
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/input/PanelButton.tsx b/src/components/input/PanelButton.tsx
new file mode 100644
index 000000000..500c40c4f
--- /dev/null
+++ b/src/components/input/PanelButton.tsx
@@ -0,0 +1,19 @@
+import { Button, type ButtonProps, Icon } from '@umami/react-zen';
+import { useGlobalState } from '@/components/hooks';
+import { PanelLeft } from '@/components/icons';
+
+export function PanelButton(props: ButtonProps) {
+ const [isCollapsed, setIsCollapsed] = useGlobalState('sidenav-collapsed');
+ return (
+ setIsCollapsed(!isCollapsed)}
+ variant="zero"
+ {...props}
+ style={{ padding: 0 }}
+ >
+
+
+
+
+ );
+}
diff --git a/src/components/input/PixelSelect.tsx b/src/components/input/PixelSelect.tsx
new file mode 100644
index 000000000..5ad68f307
--- /dev/null
+++ b/src/components/input/PixelSelect.tsx
@@ -0,0 +1,97 @@
+import { Icon, ListItem, Row, Select, type SelectProps, Text } from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { useMessages, usePixelQuery, usePixelsQuery } from '@/components/hooks';
+import { Grid2x2 } from '@/components/icons';
+
+export function PixelSelect({
+ pixelId,
+ teamId,
+ onChange,
+ isCollapsed,
+ buttonProps,
+ listProps,
+ ...props
+}: {
+ pixelId?: string;
+ teamId?: string;
+ isCollapsed?: boolean;
+} & SelectProps) {
+ const { t, labels, messages } = useMessages();
+ const { data: pixel } = usePixelQuery(pixelId);
+ const [name, setName] = useState(pixel?.name);
+ const [search, setSearch] = useState('');
+ const { data, isLoading } = usePixelsQuery({ teamId }, { search, pageSize: 20 });
+ const listItems: { id: string; name: string }[] = data?.data || [];
+
+ useEffect(() => {
+ setName(pixel?.name);
+ }, [pixel?.name]);
+
+ const handleOpenChange = () => {
+ setSearch('');
+ };
+
+ const handleChange = (id: string) => {
+ setName(listItems.find(item => item.id === id)?.name);
+ onChange?.(id);
+ };
+
+ const renderValue = () => {
+ if (isCollapsed) {
+ return '';
+ }
+
+ const value = name || props.placeholder || t(labels.pixel);
+
+ return (
+
+
+
+
+
+ {value}
+
+
+ );
+ };
+
+ return (
+ ),
+ style: {
+ maxHeight: 'calc(42vh - 65px)',
+ width: 280,
+ ...listProps?.style,
+ },
+ }}
+ >
+ {listItems.map(({ id, name }) => (
+
+ {name}
+
+ ))}
+
+ );
+}
diff --git a/src/components/input/PreferencesButton.tsx b/src/components/input/PreferencesButton.tsx
new file mode 100644
index 000000000..aa1550ea2
--- /dev/null
+++ b/src/components/input/PreferencesButton.tsx
@@ -0,0 +1,32 @@
+import { Button, Column, DialogTrigger, Icon, Label, Popover } from '@umami/react-zen';
+import { DateRangeSetting } from '@/app/(main)/settings/preferences/DateRangeSetting';
+import { TimezoneSetting } from '@/app/(main)/settings/preferences/TimezoneSetting';
+import { Panel } from '@/components/common/Panel';
+import { useMessages } from '@/components/hooks';
+import { Settings } from '@/components/icons';
+
+export function PreferencesButton() {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+
+
+
+
+ {t(labels.timezone)}
+
+
+
+ {t(labels.defaultDateRange)}
+
+
+
+
+
+ );
+}
diff --git a/src/components/input/ProfileButton.module.css b/src/components/input/ProfileButton.module.css
deleted file mode 100644
index 37f51f785..000000000
--- a/src/components/input/ProfileButton.module.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.menu {
- width: 200px;
- z-index: var(--z-index-popup);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- overflow: hidden;
- background: var(--base50);
-}
-
-.item {
- display: flex;
- gap: 12px;
- background: var(--base50);
-}
-
-.version {
- font-family: monospace;
- font-size: 11px;
- color: var(--base600);
- text-align: right;
- margin-inline-end: 10px;
-}
-
-.name {
- color: var(--font-color200);
- background: var(--base75);
- padding: var(--size300) var(--size600);
-}
diff --git a/src/components/input/ProfileButton.tsx b/src/components/input/ProfileButton.tsx
index 86a9d333d..114c7668c 100644
--- a/src/components/input/ProfileButton.tsx
+++ b/src/components/input/ProfileButton.tsx
@@ -1,59 +1,74 @@
-import { Key } from 'react';
-import { Icon, Button, PopupTrigger, Popup, Menu, Item, Text } from 'react-basics';
-import { useRouter } from 'next/navigation';
-import Icons from '@/components/icons';
-import { useMessages, useLogin, useLocale } from '@/components/hooks';
-import { CURRENT_VERSION } from '@/lib/constants';
-import styles from './ProfileButton.module.css';
+import {
+ Button,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSection,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+ Row,
+ Text,
+} from '@umami/react-zen';
+import { Fragment } from 'react';
+import { useLoginQuery, useMessages, useNavigation } from '@/components/hooks';
+import { LockKeyhole, LogOut, UserCircle } from '@/components/icons';
export function ProfileButton() {
- const { formatMessage, labels } = useMessages();
- const { user } = useLogin();
- const router = useRouter();
- const { dir } = useLocale();
- const cloudMode = !!process.env.cloudMode;
+ const { t, labels } = useMessages();
+ const { user } = useLoginQuery();
+ const { renderUrl } = useNavigation();
- const handleSelect = (key: Key, close: () => void) => {
- if (key === 'profile') {
- router.push('/profile');
- }
- if (key === 'logout') {
- router.push('/logout');
- }
- close();
- };
+ const items = [
+ {
+ id: 'settings',
+ label: t(labels.profile),
+ path: renderUrl('/settings/profile'),
+ icon: ,
+ },
+ user.isAdmin &&
+ !process.env.cloudMode && {
+ id: 'admin',
+ label: t(labels.admin),
+ path: '/admin',
+ icon: ,
+ },
+ {
+ id: 'logout',
+ label: t(labels.logout),
+ path: '/logout',
+ icon: ,
+ separator: true,
+ },
+ ].filter(n => n);
return (
-
+
-
+
-
- {(close: () => void) => (
- handleSelect(key, close)} className={styles.menu}>
- {user.username}
- -
-
-
-
- {formatMessage(labels.profile)}
-
- {!cloudMode && (
- -
-
-
-
- {formatMessage(labels.logout)}
-
- )}
- {`v${CURRENT_VERSION}`}
-
- )}
-
-
+
+
+
+
+ {items.map(({ id, path, label, icon, separator }) => {
+ return (
+
+ {separator && }
+
+
+ {icon}
+ {label}
+
+
+
+ );
+ })}
+
+
+
+
);
}
-
-export default ProfileButton;
diff --git a/src/components/input/RefreshButton.tsx b/src/components/input/RefreshButton.tsx
index 35bfbf3c5..6163fb7ee 100644
--- a/src/components/input/RefreshButton.tsx
+++ b/src/components/input/RefreshButton.tsx
@@ -1,8 +1,7 @@
-import { LoadingButton, Icon, TooltipPopup } from 'react-basics';
+import { Icon, LoadingButton, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import { useDateRange, useMessages } from '@/components/hooks';
+import { RefreshCw } from '@/components/icons';
import { setWebsiteDateRange } from '@/store/websites';
-import { useDateRange } from '@/components/hooks';
-import Icons from '@/components/icons';
-import { useMessages } from '@/components/hooks';
export function RefreshButton({
websiteId,
@@ -11,8 +10,8 @@ export function RefreshButton({
websiteId: string;
isLoading?: boolean;
}) {
- const { formatMessage, labels } = useMessages();
- const { dateRange } = useDateRange(websiteId);
+ const { t, labels } = useMessages();
+ const { dateRange } = useDateRange();
function handleClick() {
if (!isLoading && dateRange) {
@@ -21,14 +20,13 @@ export function RefreshButton({
}
return (
-
-
+
+
-
+
-
+ {t(labels.refresh)}
+
);
}
-
-export default RefreshButton;
diff --git a/src/components/input/ReportEditButton.tsx b/src/components/input/ReportEditButton.tsx
new file mode 100644
index 000000000..777b75d5f
--- /dev/null
+++ b/src/components/input/ReportEditButton.tsx
@@ -0,0 +1,118 @@
+import {
+ AlertDialog,
+ Button,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuTrigger,
+ Modal,
+ Popover,
+ Row,
+ Text,
+} from '@umami/react-zen';
+import { type ReactNode, useState } from 'react';
+import { useMessages } from '@/components/hooks';
+import { useDeleteQuery } from '@/components/hooks/queries/useDeleteQuery';
+import { Edit, MoreHorizontal, Trash } from '@/components/icons';
+import { DialogButton } from './DialogButton';
+
+export function ReportEditButton({
+ id,
+ name,
+ type,
+ title,
+ width,
+ height,
+ minWidth,
+ minHeight,
+ children,
+ onDelete,
+}: {
+ id: string;
+ name: string;
+ type: string;
+ title?: ReactNode;
+ width?: string;
+ height?: string;
+ minWidth?: string;
+ minHeight?: string;
+ onDelete?: () => void;
+ children: ({ close }: { close: () => void }) => ReactNode;
+}) {
+ const { t, labels, messages } = useMessages();
+ const [showEdit, setShowEdit] = useState(false);
+ const [showDelete, setShowDelete] = useState(false);
+ const { mutateAsync, touch } = useDeleteQuery(`/reports/${id}`);
+
+ const handleAction = (id: any) => {
+ if (id === 'edit') {
+ setShowEdit(true);
+ } else if (id === 'delete') {
+ setShowDelete(true);
+ }
+ };
+
+ const handleClose = () => {
+ setShowEdit(false);
+ setShowDelete(false);
+ };
+
+ const handleDelete = async () => {
+ await mutateAsync(null, {
+ onSuccess: async () => {
+ touch(`reports:${type}`);
+ setShowDelete(false);
+ onDelete?.();
+ },
+ });
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(labels.edit)}
+
+
+
+
+
+ {t(labels.delete)}
+
+
+
+
+ !open && handleClose()}
+ title={title}
+ width={width}
+ height={height}
+ minWidth={minWidth}
+ minHeight={minHeight}
+ >
+ {children}
+
+ !open && handleClose()}>
+
+ {t(messages.confirmDelete, { target: name })}
+
+
+ >
+ );
+}
diff --git a/src/components/input/SegmentFilters.tsx b/src/components/input/SegmentFilters.tsx
new file mode 100644
index 000000000..465161e48
--- /dev/null
+++ b/src/components/input/SegmentFilters.tsx
@@ -0,0 +1,43 @@
+import { List, ListItem } from '@umami/react-zen';
+import { Empty } from '@/components/common/Empty';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useWebsiteSegmentsQuery } from '@/components/hooks';
+import { ChartPie, UserPlus } from '@/components/icons';
+
+export interface SegmentFiltersProps {
+ websiteId?: string;
+ segmentId: string;
+ type?: string;
+ onChange?: (id: string, type: string) => void;
+}
+
+export function SegmentFilters({
+ websiteId,
+ segmentId,
+ type = 'segment',
+ onChange,
+}: SegmentFiltersProps) {
+ const { data, isLoading, isFetching } = useWebsiteSegmentsQuery(websiteId, { type });
+
+ const handleChange = (id: string) => {
+ onChange?.(id, type);
+ };
+
+ return (
+
+ {data?.data?.length === 0 && }
+ handleChange(id[0])}>
+ {data?.data?.map(item => {
+ return (
+
+ : }>
+ {item.name}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/components/input/SegmentSaveButton.tsx b/src/components/input/SegmentSaveButton.tsx
new file mode 100644
index 000000000..9acf3ded8
--- /dev/null
+++ b/src/components/input/SegmentSaveButton.tsx
@@ -0,0 +1,26 @@
+import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen';
+import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm';
+import { useMessages } from '@/components/hooks';
+import { Plus } from '@/components/icons';
+
+export function SegmentSaveButton({ websiteId }: { websiteId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+
+
+
+
+
+ {t(labels.segment)}
+
+
+
+ {({ close }) => {
+ return ;
+ }}
+
+
+
+ );
+}
diff --git a/src/components/input/SettingsButton.module.css b/src/components/input/SettingsButton.module.css
deleted file mode 100644
index 8ebd44831..000000000
--- a/src/components/input/SettingsButton.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.popup {
- background: var(--base50);
- border: 1px solid var(--base500);
- border-radius: 4px;
- display: flex;
- flex-direction: column;
- position: absolute;
- top: 100%;
- right: 0;
- padding: 20px;
-}
diff --git a/src/components/input/SettingsButton.tsx b/src/components/input/SettingsButton.tsx
index d3dc471fa..797d16314 100644
--- a/src/components/input/SettingsButton.tsx
+++ b/src/components/input/SettingsButton.tsx
@@ -1,32 +1,76 @@
-import { Button, Icon, PopupTrigger, Popup, Form, FormRow } from 'react-basics';
-import TimezoneSetting from '@/app/(main)/profile/TimezoneSetting';
-import DateRangeSetting from '@/app/(main)/profile/DateRangeSetting';
-import Icons from '@/components/icons';
-import { useMessages } from '@/components/hooks';
-import styles from './SettingsButton.module.css';
+import {
+ Button,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSection,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+} from '@umami/react-zen';
+import type { Key } from 'react';
+import { useConfig, useLoginQuery, useMessages, useNavigation } from '@/components/hooks';
+import {
+ BookText,
+ ExternalLink,
+ LifeBuoy,
+ LockKeyhole,
+ LogOut,
+ Settings,
+ UserCircle,
+} from '@/components/icons';
+import { DOCS_URL } from '@/lib/constants';
export function SettingsButton() {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
+ const { user } = useLoginQuery();
+ const { router } = useNavigation();
+ const { cloudMode } = useConfig();
+
+ const handleAction = (id: Key) => {
+ const url = id.toString();
+
+ if (cloudMode) {
+ if (url === '/docs') {
+ window.open(DOCS_URL, '_blank');
+ } else {
+ window.location.href = url;
+ }
+ } else {
+ router.push(url);
+ }
+ };
return (
-
-
+
+
-
+
-
-
-
-
+
+
+
+
+ } label={t(labels.settings)} />
+ {!cloudMode && user.isAdmin && (
+ } label={t(labels.admin)} />
+ )}
+ {cloudMode && (
+ <>
+ } label={t(labels.documentation)}>
+
+
+
+
+ } label={t(labels.support)} />
+ >
+ )}
+
+ } label={t(labels.logout)} />
+
+
+
+
);
}
-
-export default SettingsButton;
diff --git a/src/components/input/TeamsButton.module.css b/src/components/input/TeamsButton.module.css
deleted file mode 100644
index 2b1fd549f..000000000
--- a/src/components/input/TeamsButton.module.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.button {
- font-weight: 700;
-}
-
-.menu {
- background: var(--base50);
- min-width: 260px;
-}
-
-.heading {
- color: var(--base600);
- font-size: 10px;
- font-weight: 700;
- padding: 8px 16px;
- text-transform: uppercase;
- border-bottom: 1px solid var(--base300);
-}
-
-.selected {
- font-weight: bold;
-}
diff --git a/src/components/input/TeamsButton.tsx b/src/components/input/TeamsButton.tsx
index f967a64cf..f44ba83a5 100644
--- a/src/components/input/TeamsButton.tsx
+++ b/src/components/input/TeamsButton.tsx
@@ -1,71 +1,100 @@
-import { Key } from 'react';
-import { Text, Icon, Button, Popup, Menu, Item, PopupTrigger, Flexbox } from 'react-basics';
-import classNames from 'classnames';
-import Icons from '@/components/icons';
-import { useLogin, useMessages, useTeams, useTeamUrl } from '@/components/hooks';
-import styles from './TeamsButton.module.css';
+import {
+ Button,
+ Column,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSection,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+ Row,
+ Text,
+} from '@umami/react-zen';
+import { ArrowRight } from 'lucide-react';
+import type { Key } from 'react';
+import { IconLabel } from '@/components/common/IconLabel';
+import { useLoginQuery, useMessages, useMobile, useNavigation } from '@/components/hooks';
+import { ChevronRight, User, Users } from '@/components/icons';
+import { LAST_TEAM_CONFIG } from '@/lib/constants';
+import { removeItem } from '@/lib/storage';
-export function TeamsButton({
- className,
- showText = true,
- onChange,
-}: {
- className?: string;
- showText?: boolean;
- onChange?: (value: string) => void;
-}) {
- const { user } = useLogin();
- const { formatMessage, labels } = useMessages();
- const { result } = useTeams(user.id);
- const { teamId } = useTeamUrl();
- const team = result?.data?.find(({ id }) => id === teamId);
+export function TeamsButton() {
+ const { user } = useLoginQuery();
+ const { t, labels } = useMessages();
+ const { teamId, router } = useNavigation();
+ const { isPhone } = useMobile();
+ const team = user?.teams?.find(({ id }) => id === teamId);
+ const selectedKeys = new Set([teamId || 'user']);
+ const label = teamId ? team?.name : user.username;
- const handleSelect = (close: () => void, id: Key) => {
- onChange?.((id !== user.id ? id : '') as string);
- close();
+ const cloudMode = !!process.env.cloudMode;
+
+ const getUrl = (url: string) => {
+ return cloudMode ? `${process.env.cloudUrl}${url}` : url;
};
- if (!result?.count) {
- return null;
- }
+ const handleAction = async (key: Key) => {
+ if (key === 'user') {
+ removeItem(LAST_TEAM_CONFIG);
+ if (cloudMode) {
+ window.location.href = '/';
+ } else {
+ router.push('/');
+ }
+ }
+ };
return (
-
-
- {teamId ? : }
- {showText && {teamId ? team?.name : user.username} }
-
-
+
+
+
+ {teamId ? : }
+ {label}
+
+
+
-
- {(close: () => void) => (
-
- {formatMessage(labels.myAccount)}
- -
-
-
-
-
- {user.username}
-
-
- {formatMessage(labels.team)}
- {result?.data?.map(({ id, name }) => (
- -
-
-
-
-
- {name}
-
-
- ))}
+
+
+
+
+
+ } label={user.username} />
+
+
+
+
+ {user?.teams?.map(({ id, name }) => (
+
+ }>
+ {name}
+
+
+ ))}
+
+
+
+
+ Manage teams
+
+
+
+
+
+
+
- )}
-
-
+
+
+
);
}
-
-export default TeamsButton;
diff --git a/src/components/input/ThemeButton.module.css b/src/components/input/ThemeButton.module.css
deleted file mode 100644
index c64647eb9..000000000
--- a/src/components/input/ThemeButton.module.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.button {
- width: 50px;
- display: flex;
- justify-content: center;
- align-items: center;
- cursor: pointer;
-}
-
-.button > div {
- display: flex;
- justify-content: center;
- align-items: center;
- position: absolute;
-}
diff --git a/src/components/input/ThemeButton.tsx b/src/components/input/ThemeButton.tsx
deleted file mode 100644
index fd7d79a06..000000000
--- a/src/components/input/ThemeButton.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { useTransition, animated } from '@react-spring/web';
-import { Button, Icon } from 'react-basics';
-import { useTheme } from '@/components/hooks';
-import Icons from '@/components/icons';
-import styles from './ThemeButton.module.css';
-
-export function ThemeButton() {
- const { theme, saveTheme } = useTheme();
-
- const transitions = useTransition(theme, {
- initial: { opacity: 1 },
- from: {
- opacity: 0,
- transform: `translateY(${theme === 'light' ? '20px' : '-20px'}) scale(0.5)`,
- },
- enter: { opacity: 1, transform: 'translateY(0px) scale(1.0)' },
- leave: {
- opacity: 0,
- transform: `translateY(${theme === 'light' ? '-20px' : '20px'}) scale(0.5)`,
- },
- });
-
- function handleClick() {
- saveTheme(theme === 'light' ? 'dark' : 'light');
- }
-
- return (
-
- {transitions((style, item) => (
-
- {item === 'light' ? : }
-
- ))}
-
- );
-}
-
-export default ThemeButton;
diff --git a/src/components/input/UnitFilter.tsx b/src/components/input/UnitFilter.tsx
new file mode 100644
index 000000000..cabe87eaf
--- /dev/null
+++ b/src/components/input/UnitFilter.tsx
@@ -0,0 +1,71 @@
+import { ListItem, Row, Select } from '@umami/react-zen';
+import { useMessages, useNavigation } from '@/components/hooks';
+import { DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE } from '@/lib/constants';
+import { getItem } from '@/lib/storage';
+
+export function UnitFilter() {
+ const { t, labels } = useMessages();
+ const { router, query, updateParams } = useNavigation();
+
+ const DATE_RANGE_UNIT_CONFIG = {
+ '0week': {
+ defaultUnit: 'day',
+ availableUnits: ['day', 'hour'],
+ },
+ '7day': {
+ defaultUnit: 'day',
+ availableUnits: ['day', 'hour'],
+ },
+ '0month': {
+ defaultUnit: 'day',
+ availableUnits: ['day', 'hour'],
+ },
+ '30day': {
+ defaultUnit: 'day',
+ availableUnits: ['day', 'hour'],
+ },
+ '90day': {
+ defaultUnit: 'day',
+ availableUnits: ['day', 'month'],
+ },
+ '6month': {
+ defaultUnit: 'month',
+ availableUnits: ['month', 'day'],
+ },
+ };
+
+ const unitConfig =
+ DATE_RANGE_UNIT_CONFIG[query.date || getItem(DATE_RANGE_CONFIG) || DEFAULT_DATE_RANGE_VALUE];
+
+ if (!unitConfig) {
+ return null;
+ }
+
+ const handleChange = (value: string) => {
+ router.push(updateParams({ unit: value }));
+ };
+
+ const options = unitConfig.availableUnits.map(unit => ({
+ id: unit,
+ label: t(labels[unit]),
+ }));
+
+ const selectedUnit = query.unit ?? unitConfig.defaultUnit;
+
+ return (
+
+
+ {options.map(({ id, label }) => (
+
+ {label}
+
+ ))}
+
+
+ );
+}
diff --git a/src/components/input/UserButton.tsx b/src/components/input/UserButton.tsx
new file mode 100644
index 000000000..91080f344
--- /dev/null
+++ b/src/components/input/UserButton.tsx
@@ -0,0 +1,205 @@
+import {
+ Column,
+ Icon,
+ Menu,
+ MenuItem,
+ MenuSeparator,
+ MenuTrigger,
+ Popover,
+ Pressable,
+ Row,
+ SubmenuTrigger,
+ Text,
+ Tooltip,
+ TooltipTrigger,
+ useTheme,
+} from '@umami/react-zen';
+import { useConfig, useLocale, useLoginQuery, useMessages, useMobile } from '@/components/hooks';
+import {
+ BookText,
+ ExternalLink,
+ Globe,
+ LifeBuoy,
+ LockKeyhole,
+ LogOut,
+ Moon,
+ Settings,
+ Sun,
+ SunMoon,
+ UserCircle,
+} from '@/components/icons';
+import { DOCS_URL } from '@/lib/constants';
+import { languages } from '@/lib/lang';
+
+export interface UserButtonProps {
+ showText?: boolean;
+ onClose?: () => void;
+}
+
+export function UserButton({ showText = true, onClose }: UserButtonProps) {
+ const { user } = useLoginQuery();
+ const { cloudMode } = useConfig();
+ const { t, labels } = useMessages();
+ const { locale, saveLocale } = useLocale();
+ const { theme, setTheme } = useTheme();
+ const { isMobile } = useMobile();
+
+ const getUrl = (url: string) => {
+ return cloudMode ? `${process.env.cloudUrl}${url}` : url;
+ };
+
+ const languageItems = Object.keys(languages).map(key => ({
+ value: key,
+ label: languages[key].label,
+ }));
+
+ const items = [
+ cloudMode && {
+ id: 'docs',
+ label: t(labels.documentation),
+ path: DOCS_URL,
+ icon: ,
+ target: '_blank',
+ external: true,
+ },
+ cloudMode && {
+ id: 'support',
+ label: t(labels.support),
+ path: getUrl('/settings/support'),
+ icon: ,
+ },
+ !cloudMode &&
+ user.isAdmin && {
+ id: 'admin',
+ label: t(labels.admin),
+ path: '/admin',
+ icon: ,
+ },
+ {
+ id: 'separator',
+ separator: true,
+ },
+ {
+ id: 'logout',
+ label: t(labels.logout),
+ path: getUrl('/logout'),
+ icon: ,
+ },
+ ].filter(Boolean);
+
+ return (
+
+
+
+
+
+
+
+
+ {showText && {user.username} }
+
+
+
+ {user.username}
+
+
+
+
+
+
+
+
+
+ {t(labels.settings)}
+
+
+
+
+
+
+
+
+ {t(labels.language)}
+
+
+
+ saveLocale(key as string)}
+ style={{ maxHeight: 300, overflow: 'auto' }}
+ >
+ {languageItems.map(({ value, label }) => (
+
+ {label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ {t(labels.theme)}
+
+
+
+ setTheme(key as 'light' | 'dark')}
+ >
+
+
+
+
+
+ Light
+
+
+
+
+
+
+
+ Dark
+
+
+
+
+
+ {items.map(({ id, path, label, icon, separator, target, external }: any) => {
+ if (separator) {
+ return ;
+ }
+ return (
+
+
+ {icon}
+ {label}
+ {external && (
+
+
+
+ )}
+
+
+ );
+ })}
+
+
+
+
+ );
+}
diff --git a/src/components/input/UserSelect.tsx b/src/components/input/UserSelect.tsx
new file mode 100644
index 000000000..bd3a766a7
--- /dev/null
+++ b/src/components/input/UserSelect.tsx
@@ -0,0 +1,65 @@
+import { ListItem, Select, type SelectProps } from '@umami/react-zen';
+import { useMemo, useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import { useMessages, useTeamMembersQuery, useUsersQuery } from '@/components/hooks';
+
+export function UserSelect({
+ teamId,
+ onChange,
+ ...props
+}: {
+ teamId?: string;
+} & SelectProps) {
+ const { t, messages } = useMessages();
+ const { data: users, isLoading: usersLoading } = useUsersQuery();
+ const { data: teamMembers, isLoading: teamMembersLoading } = useTeamMembersQuery(teamId);
+ const [username, setUsername] = useState();
+ const [search, setSearch] = useState('');
+
+ const listItems = useMemo(() => {
+ if (!users) {
+ return [];
+ }
+ if (!teamId || !teamMembers) {
+ return users.data;
+ }
+ const teamMemberIds = teamMembers.data.map(({ userId }) => userId);
+ return users.data.filter(({ id }) => !teamMemberIds.includes(id));
+ }, [users, teamMembers, teamId]);
+
+ const handleSearch = (value: string) => {
+ setSearch(value);
+ };
+
+ const handleOpenChange = () => {
+ setSearch('');
+ };
+
+ const handleChange = (id: string) => {
+ setUsername(listItems.find(item => item.id === id)?.username);
+ onChange(id);
+ };
+
+ return (
+ ,
+ style: { maxHeight: 'calc(42vh - 65px)' },
+ }}
+ >
+ {listItems.map(({ id, username }) => (
+
+ {username}
+
+ ))}
+
+ );
+}
diff --git a/src/components/input/WebsiteDateFilter.module.css b/src/components/input/WebsiteDateFilter.module.css
deleted file mode 100644
index c0b94beec..000000000
--- a/src/components/input/WebsiteDateFilter.module.css
+++ /dev/null
@@ -1,24 +0,0 @@
-.container {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.dropdown {
- min-width: 200px;
-}
-
-.buttons {
- display: flex;
-}
-
-.buttons button:first-child {
- border-start-end-radius: 0;
- border-end-end-radius: 0;
- border-inline-end: 1px solid var(--base400);
-}
-
-.buttons button:last-child {
- border-start-start-radius: 0;
- border-end-start-radius: 0;
-}
diff --git a/src/components/input/WebsiteDateFilter.tsx b/src/components/input/WebsiteDateFilter.tsx
index 97beaf129..3908409cc 100644
--- a/src/components/input/WebsiteDateFilter.tsx
+++ b/src/components/input/WebsiteDateFilter.tsx
@@ -1,59 +1,105 @@
-import { useDateRange, useLocale } from '@/components/hooks';
+import { Button, Icon, ListItem, Row, Select, Text } from '@umami/react-zen';
import { isAfter } from 'date-fns';
-import { getOffsetDateRange } from '@/lib/date';
-import { Button, Icon, Icons } from 'react-basics';
-import DateFilter from './DateFilter';
-import styles from './WebsiteDateFilter.module.css';
-import { DateRange } from '@/lib/types';
+import { useMemo } from 'react';
+import { useDateRange, useDateRangeQuery, useMessages, useNavigation } from '@/components/hooks';
+import { ChevronRight } from '@/components/icons';
+import { getDateRangeValue } from '@/lib/date';
+import { DateFilter } from './DateFilter';
+
+export interface WebsiteDateFilterProps {
+ websiteId?: string;
+ compare?: string;
+ showAllTime?: boolean;
+ showButtons?: boolean;
+ allowCompare?: boolean;
+}
export function WebsiteDateFilter({
websiteId,
showAllTime = true,
-}: {
- websiteId: string;
- showAllTime?: boolean;
-}) {
- const { dir } = useLocale();
- const { dateRange, saveDateRange } = useDateRange(websiteId);
- const { value, startDate, endDate, offset } = dateRange;
- const disableForward =
- value === 'all' || isAfter(getOffsetDateRange(dateRange, 1).startDate, new Date());
+ showButtons = true,
+ allowCompare,
+}: WebsiteDateFilterProps) {
+ const { dateRange, isAllTime, isCustomRange } = useDateRange();
+ const { t, labels } = useMessages();
+ const {
+ router,
+ updateParams,
+ query: { compare = 'prev', offset = 0 },
+ } = useNavigation();
+ const disableForward = isAllTime || isAfter(dateRange.endDate, new Date());
+ const showCompare = allowCompare && !isAllTime;
- const handleChange = (value: string | DateRange) => {
- saveDateRange(value);
+ const websiteDateRange = useDateRangeQuery(websiteId);
+ const { startDate, endDate } = websiteDateRange;
+ const hasData = startDate && endDate;
+
+ const handleChange = (date: string) => {
+ if (date === 'all' && hasData) {
+ router.push(
+ updateParams({
+ date: `${getDateRangeValue(websiteDateRange.startDate, websiteDateRange.endDate)}:all`,
+ offset: undefined,
+ page: 1,
+ }),
+ );
+ } else {
+ router.push(updateParams({ date, offset: undefined, unit: undefined, page: 1 }));
+ }
};
- const handleIncrement = (increment: number) => {
- saveDateRange(getOffsetDateRange(dateRange, increment));
+ const handleIncrement = increment => {
+ router.push(updateParams({ offset: Number(offset) + increment }));
};
+ const handleSelect = (compare: any) => {
+ router.push(updateParams({ compare }));
+ };
+
+ const dateValue = useMemo(() => {
+ return offset !== 0
+ ? getDateRangeValue(dateRange.startDate, dateRange.endDate)
+ : dateRange.value;
+ }, [dateRange]);
return (
-
-
- {value !== 'all' && !value.startsWith('range') && (
-
- handleIncrement(-1)}>
-
-
+
+ {showButtons && !isAllTime && !isCustomRange && (
+
+ handleIncrement(-1)} variant="outline">
+
+
- handleIncrement(1)} disabled={disableForward}>
-
-
+ handleIncrement(1)} variant="outline" isDisabled={disableForward}>
+
+
-
+
)}
-
+
+ {showCompare && (
+
+ VS
+
+
+ {t(labels.previousPeriod)}
+ {t(labels.previousYear)}
+
+
+
+ )}
+
);
}
-
-export default WebsiteDateFilter;
diff --git a/src/components/input/WebsiteFilterButton.tsx b/src/components/input/WebsiteFilterButton.tsx
new file mode 100644
index 000000000..ef6f54361
--- /dev/null
+++ b/src/components/input/WebsiteFilterButton.tsx
@@ -0,0 +1,61 @@
+import { Checkbox, Row } from '@umami/react-zen';
+import { useState } from 'react';
+import { useFilters, useMessages, useNavigation } from '@/components/hooks';
+import { ListFilter } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { FilterEditForm } from '@/components/input/FilterEditForm';
+import { filtersArrayToObject } from '@/lib/params';
+
+export function WebsiteFilterButton({
+ websiteId,
+}: {
+ websiteId?: string;
+ position?: 'bottom' | 'top' | 'left' | 'right';
+ alignment?: 'end' | 'center' | 'start';
+}) {
+ const { t, labels } = useMessages();
+ const { updateParams, pathname, router, query } = useNavigation();
+ const { filters: currentFilters } = useFilters();
+ const [excludeBounce, setExcludeBounce] = useState(!!query.excludeBounce);
+ const isOverview =
+ /^\/teams\/[^/]+\/websites\/[^/]+$/.test(pathname) || /^\/share\/[^/]+$/.test(pathname);
+
+ const handleChange = ({ filters, segment, cohort, match }: any) => {
+ const params = filtersArrayToObject(filters);
+ const cleared = Object.fromEntries(currentFilters.map(f => [f.name, undefined]));
+
+ const url = updateParams({
+ ...cleared,
+ ...params,
+ segment,
+ cohort,
+ match,
+ excludeBounce: excludeBounce ? 'true' : undefined,
+ });
+
+ router.push(url);
+ };
+
+ return (
+ } label={t(labels.filter)} variant="outline">
+ {({ close }) => {
+ return (
+ <>
+ {isOverview && (
+
+
+ {t(labels.excludeBounce)}
+
+
+ )}
+
+ >
+ );
+ }}
+
+ );
+}
diff --git a/src/components/input/WebsiteSelect.module.css b/src/components/input/WebsiteSelect.module.css
deleted file mode 100644
index 42e2911a8..000000000
--- a/src/components/input/WebsiteSelect.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.dropdown {
- max-height: 400px;
- overflow-y: auto;
-}
diff --git a/src/components/input/WebsiteSelect.tsx b/src/components/input/WebsiteSelect.tsx
index 8a7e4ac08..3fd28cdd2 100644
--- a/src/components/input/WebsiteSelect.tsx
+++ b/src/components/input/WebsiteSelect.tsx
@@ -1,60 +1,112 @@
-import { useState, Key } from 'react';
-import { Dropdown, Item } from 'react-basics';
-import { useWebsite, useWebsites, useMessages } from '@/components/hooks';
-import Empty from '@/components/common/Empty';
-import styles from './WebsiteSelect.module.css';
+import { Icon, ListItem, Row, Select, type SelectProps, Text } from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { Empty } from '@/components/common/Empty';
+import {
+ useLoginQuery,
+ useMessages,
+ useUserWebsitesQuery,
+ useWebsiteQuery,
+} from '@/components/hooks';
+import { Globe } from '@/components/icons';
export function WebsiteSelect({
websiteId,
teamId,
- onSelect,
+ onChange,
+ includeTeams,
+ isCollapsed,
+ buttonProps,
+ listProps,
+ ...props
}: {
websiteId?: string;
teamId?: string;
- onSelect?: (key: any) => void;
-}) {
- const { formatMessage, labels, messages } = useMessages();
+ includeTeams?: boolean;
+ isCollapsed?: boolean;
+} & SelectProps) {
+ const { t, labels, messages } = useMessages();
+ const { data: website } = useWebsiteQuery(websiteId);
+ const [name, setName] = useState(website?.name);
const [search, setSearch] = useState('');
- const [selectedId, setSelectedId] = useState(websiteId);
+ const { user } = useLoginQuery();
+ const { data, isLoading } = useUserWebsitesQuery(
+ { userId: user?.id, teamId },
+ { search, pageSize: 20, includeTeams },
+ );
+ const listItems: { id: string; name: string }[] = data?.data || [];
- const { data: website } = useWebsite(selectedId as string);
-
- const queryResult = useWebsites({ teamId }, { search, pageSize: 5 });
-
- const renderValue = () => {
- return website?.name;
- };
-
- const renderEmpty = () => {
- return ;
- };
-
- const handleSelect = (value: any) => {
- setSelectedId(value);
- onSelect?.(value);
- };
+ useEffect(() => {
+ setName(website?.name);
+ }, [website?.name]);
const handleSearch = (value: string) => {
setSearch(value);
};
+ const handleOpenChange = () => {
+ setSearch('');
+ };
+
+ const handleChange = (id: string) => {
+ setName(listItems.find(item => item.id === id)?.name);
+ onChange(id);
+ };
+
+ const renderValue = () => {
+ if (isCollapsed) {
+ return '';
+ }
+
+ const value = name || props.placeholder || t(labels.selectWebsite);
+
+ return (
+
+
+
+
+
+ {value}
+
+
+ );
+ };
+
return (
- ),
+ style: {
+ maxHeight: 'calc(42vh - 65px)',
+ width: 280,
+ ...listProps?.style,
+ },
+ }}
>
- {({ id, name }) => - {name}
}
-
+ {listItems.map(({ id, name }) => (
+
+ {name}
+
+ ))}
+
);
}
-
-export default WebsiteSelect;
diff --git a/src/components/layout/Grid.module.css b/src/components/layout/Grid.module.css
deleted file mode 100644
index 7a2b7124a..000000000
--- a/src/components/layout/Grid.module.css
+++ /dev/null
@@ -1,76 +0,0 @@
-.grid {
- display: grid;
-}
-
-.row {
- display: grid;
- grid-template-columns: repeat(6, 1fr);
- border-top: 1px solid var(--base300);
-}
-
-.row.compare {
- grid-template-columns: max-content 1fr 1fr;
-}
-
-.col {
- padding: 20px;
- min-height: 430px;
- border-inline-start: 1px solid var(--base300);
-}
-
-.col:first-child {
- border-inline-start: 0;
- padding-inline-start: 0;
-}
-
-.col:last-child {
- padding-inline-end: 0;
-}
-
-.col.one {
- grid-column: span 6;
-}
-
-.col.two {
- grid-column: span 3;
-}
-
-.col.three {
- grid-column: span 2;
-}
-
-.col.two-one:first-child {
- grid-column: span 4;
-}
-
-.col.two-one:last-child {
- grid-column: span 2;
-}
-
-.col.one-two:first-child {
- grid-column: span 2;
-}
-
-.col.one-two:last-child {
- grid-column: span 4;
-}
-
-@media only screen and (max-width: 992px) {
- .row {
- border: 0;
- }
-
- .row > .col {
- border-top: 1px solid var(--base300);
- border-inline-start: 0;
- border-inline-end: 0;
- padding: 20px 0;
- }
-
- .col.two,
- .col.three,
- .col.one-two,
- .col.two-one {
- grid-column: span 6 !important;
- }
-}
diff --git a/src/components/layout/Grid.tsx b/src/components/layout/Grid.tsx
deleted file mode 100644
index ec7f4fda1..000000000
--- a/src/components/layout/Grid.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { CSSProperties } from 'react';
-import classNames from 'classnames';
-import { mapChildren } from 'react-basics';
-// eslint-disable-next-line css-modules/no-unused-class
-import styles from './Grid.module.css';
-
-export interface GridProps {
- className?: string;
- style?: CSSProperties;
- children?: any;
-}
-
-export function Grid({ className, style, children }: GridProps) {
- return (
-
- {children}
-
- );
-}
-
-export function GridRow(props: {
- [x: string]: any;
- columns?: 'one' | 'two' | 'three' | 'one-two' | 'two-one' | 'compare';
- className?: string;
- children?: any;
-}) {
- const { columns = 'two', className, children, ...otherProps } = props;
- return (
-
- {mapChildren(children, child => {
- return
{child}
;
- })}
-
- );
-}
diff --git a/src/components/layout/MenuLayout.module.css b/src/components/layout/MenuLayout.module.css
deleted file mode 100644
index d2d1b1655..000000000
--- a/src/components/layout/MenuLayout.module.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.layout {
- display: grid;
- grid-template-columns: max-content 1fr;
- gap: 20px;
-}
-
-.menu {
- width: 240px;
- padding-top: 34px;
- padding-inline-end: 20px;
-}
-
-.content {
- display: flex;
- flex-direction: column;
- min-height: 50vh;
-}
-
-@media only screen and (max-width: 992px) {
- .layout {
- grid-template-columns: 1fr;
- }
-
- .menu {
- display: none;
- }
-
- .content {
- margin-top: 20px;
- }
-}
diff --git a/src/components/layout/MenuLayout.tsx b/src/components/layout/MenuLayout.tsx
deleted file mode 100644
index 1465c0625..000000000
--- a/src/components/layout/MenuLayout.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { ReactNode } from 'react';
-import { usePathname } from 'next/navigation';
-import SideNav from '@/components/layout/SideNav';
-import styles from './MenuLayout.module.css';
-
-export function MenuLayout({ items = [], children }: { items: any[]; children: ReactNode }) {
- const pathname = usePathname();
- const cloudMode = !!process.env.cloudMode;
-
- const getKey = () => items.find(({ url }) => pathname === url)?.key;
-
- return (
-
- {!cloudMode && (
-
-
-
- )}
-
{children}
-
- );
-}
-
-export default MenuLayout;
diff --git a/src/components/layout/NavGroup.module.css b/src/components/layout/NavGroup.module.css
deleted file mode 100644
index 4979210aa..000000000
--- a/src/components/layout/NavGroup.module.css
+++ /dev/null
@@ -1,80 +0,0 @@
-.group {
- display: flex;
- flex-direction: column;
- width: 100%;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- color: var(--base600);
- font-size: 11px;
- font-weight: 600;
- padding: 10px 20px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-.body {
- display: none;
-}
-
-.expanded .body {
- display: block;
-}
-
-.item {
- position: relative;
- display: flex;
- flex-direction: row;
- align-items: center;
- border-inline-end: 2px solid var(--base200);
- padding: 1rem 2rem;
- gap: var(--size500);
- font-weight: 600;
- width: 200px;
- margin-inline-end: -2px;
-}
-
-a.item {
- color: var(--base700);
-}
-
-.item.selected {
- color: var(--base900);
- border-inline-end-color: var(--primary400);
- background: var(--blue100);
-}
-
-.item:hover {
- color: var(--base900);
-}
-
-.minimized .text,
-.minimized .header {
- display: none;
-}
-
-.minimized .item {
- width: 60px;
- padding: 20px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.divider:before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- margin: auto;
- border-top: 1px solid var(--base300);
- width: 160px;
-}
-
-.minimized .divider:before {
- width: 60px;
-}
diff --git a/src/components/layout/NavGroup.tsx b/src/components/layout/NavGroup.tsx
deleted file mode 100644
index 723f9a7ea..000000000
--- a/src/components/layout/NavGroup.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { useState } from 'react';
-import { Icon, Text, TooltipPopup } from 'react-basics';
-import classNames from 'classnames';
-import { usePathname } from 'next/navigation';
-import Link from 'next/link';
-import Icons from '@/components/icons';
-import styles from './NavGroup.module.css';
-
-export interface NavGroupProps {
- title: string;
- items: any[];
- defaultExpanded?: boolean;
- allowExpand?: boolean;
- minimized?: boolean;
-}
-
-export function NavGroup({
- title,
- items,
- defaultExpanded = true,
- allowExpand = true,
- minimized = false,
-}: NavGroupProps) {
- const pathname = usePathname();
- const [expanded, setExpanded] = useState(defaultExpanded);
-
- const handleExpand = () => setExpanded(state => !state);
-
- return (
-
- {title && (
-
- {title}
-
-
-
-
- )}
-
- {items.map(({ label, url, icon, divider }) => {
- return (
-
-
- {icon}
- {label}
-
-
- );
- })}
-
-
- );
-}
-
-export default NavGroup;
diff --git a/src/components/layout/Page.module.css b/src/components/layout/Page.module.css
deleted file mode 100644
index 3b9a4581b..000000000
--- a/src/components/layout/Page.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.page {
- flex: 1;
- display: flex;
- flex-direction: column;
- position: relative;
- width: 100%;
- max-width: 1320px;
- margin: 0 auto;
- padding: 0 20px;
- min-height: calc(100vh - 60px);
- min-height: calc(100dvh - 60px);
-}
diff --git a/src/components/layout/Page.tsx b/src/components/layout/Page.tsx
deleted file mode 100644
index c06054b4f..000000000
--- a/src/components/layout/Page.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-'use client';
-import { ReactNode } from 'react';
-import classNames from 'classnames';
-import { Banner, Loading } from 'react-basics';
-import { useMessages } from '@/components/hooks';
-import styles from './Page.module.css';
-
-export function Page({
- className,
- error,
- isLoading,
- children,
-}: {
- className?: string;
- error?: unknown;
- isLoading?: boolean;
- children?: ReactNode;
-}) {
- const { formatMessage, messages } = useMessages();
-
- if (error) {
- return {formatMessage(messages.error)} ;
- }
-
- if (isLoading) {
- return ;
- }
-
- return {children}
;
-}
-
-export default Page;
diff --git a/src/components/layout/PageHeader.module.css b/src/components/layout/PageHeader.module.css
deleted file mode 100644
index b92bb1db9..000000000
--- a/src/components/layout/PageHeader.module.css
+++ /dev/null
@@ -1,48 +0,0 @@
-.header {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- align-items: center;
- align-content: center;
- align-self: stretch;
- flex-wrap: wrap;
- height: 100px;
-}
-
-.header a {
- color: var(--base600);
-}
-
-.header a:hover {
- color: var(--base900);
-}
-
-.title {
- display: flex;
- align-items: center;
- font-size: 24px;
- font-weight: 700;
- gap: 20px;
- height: 60px;
- flex: 1;
-}
-
-.breadcrumb {
- padding-top: 20px;
-}
-
-.icon {
- color: var(--base700);
- margin-inline-end: 1rem;
-}
-
-.actions {
- display: flex;
- justify-content: flex-end;
-}
-
-@media only screen and (max-width: 992px) {
- .header {
- margin-bottom: 10px;
- }
-}
diff --git a/src/components/layout/PageHeader.tsx b/src/components/layout/PageHeader.tsx
deleted file mode 100644
index 53f1db9f2..000000000
--- a/src/components/layout/PageHeader.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import classNames from 'classnames';
-import React, { ReactNode } from 'react';
-import { Icon } from 'react-basics';
-import styles from './PageHeader.module.css';
-
-export function PageHeader({
- title,
- icon,
- className,
- breadcrumb,
- children,
-}: {
- title?: ReactNode;
- icon?: ReactNode;
- className?: string;
- breadcrumb?: ReactNode;
- children?: ReactNode;
-}) {
- return (
- <>
- {breadcrumb}
-
- {icon && (
-
- {icon}
-
- )}
-
- {title &&
{title}
}
-
{children}
-
- >
- );
-}
-
-export default PageHeader;
diff --git a/src/components/layout/SideNav.module.css b/src/components/layout/SideNav.module.css
deleted file mode 100644
index 5d9af9155..000000000
--- a/src/components/layout/SideNav.module.css
+++ /dev/null
@@ -1,20 +0,0 @@
-.menu {
- display: flex;
- flex-direction: column;
- gap: 4px;
-}
-
-.item a {
- color: var(--font-color100);
- flex: 1;
- padding: var(--size300) var(--size600);
-}
-
-.item {
- padding: 0;
- border-radius: var(--border-radius);
-}
-
-.selected {
- font-weight: 700;
-}
diff --git a/src/components/layout/SideNav.tsx b/src/components/layout/SideNav.tsx
deleted file mode 100644
index 0b5c98562..000000000
--- a/src/components/layout/SideNav.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import classNames from 'classnames';
-import { Menu, Item } from 'react-basics';
-import { usePathname } from 'next/navigation';
-import Link from 'next/link';
-import styles from './SideNav.module.css';
-
-export interface SideNavProps {
- selectedKey: string;
- items: any[];
- shallow?: boolean;
- scroll?: boolean;
- className?: string;
- onSelect?: () => void;
-}
-
-export function SideNav({
- selectedKey,
- items,
- shallow = true,
- scroll = false,
- className,
- onSelect = () => {},
-}: SideNavProps) {
- const pathname = usePathname();
- return (
-
- {({ key, label, url }) => (
- -
-
- {label}
-
-
- )}
-
- );
-}
-
-export default SideNav;
diff --git a/src/components/messages.ts b/src/components/messages.ts
index 27086b49d..5046f1904 100644
--- a/src/components/messages.ts
+++ b/src/components/messages.ts
@@ -1,451 +1,433 @@
-import { defineMessages } from 'react-intl';
+export const labels: Record = {
+ ok: 'label.ok',
+ unknown: 'label.unknown',
+ required: 'label.required',
+ save: 'label.save',
+ cancel: 'label.cancel',
+ continue: 'label.continue',
+ delete: 'label.delete',
+ leave: 'label.leave',
+ users: 'label.users',
+ createUser: 'label.create-user',
+ deleteUser: 'label.delete-user',
+ username: 'label.username',
+ password: 'label.password',
+ role: 'label.role',
+ user: 'label.user',
+ viewOnly: 'label.view-only',
+ manage: 'label.manage',
+ admin: 'label.admin',
+ confirm: 'label.confirm',
+ details: 'label.details',
+ boardType: 'label.board-type',
+ website: 'label.website',
+ websites: 'label.websites',
+ myWebsites: 'label.my-websites',
+ teamWebsites: 'label.team-websites',
+ created: 'label.created',
+ createdBy: 'label.created-by',
+ edit: 'label.edit',
+ name: 'label.name',
+ manager: 'label.manager',
+ member: 'label.member',
+ members: 'label.members',
+ accessCode: 'label.access-code',
+ teamId: 'label.team-id',
+ team: 'label.team',
+ teamName: 'label.team-name',
+ regenerate: 'label.regenerate',
+ remove: 'label.remove',
+ join: 'label.join',
+ createTeam: 'label.create-team',
+ joinTeam: 'label.join-team',
+ settings: 'label.settings',
+ owner: 'label.owner',
+ url: 'label.url',
+ teamOwner: 'label.team-owner',
+ teamManager: 'label.team-manager',
+ teamMember: 'label.team-member',
+ teamViewOnly: 'label.team-view-only',
+ enableShareUrl: 'label.enable-share-url',
+ data: 'label.data',
+ trackingCode: 'label.tracking-code',
+ shareUrl: 'label.share-url',
+ action: 'label.action',
+ actions: 'label.actions',
+ domain: 'label.domain',
+ websiteId: 'label.website-id',
+ resetWebsite: 'label.reset-website',
+ deleteWebsite: 'label.delete-website',
+ transferWebsite: 'label.transfer-website',
+ deleteReport: 'label.delete-report',
+ reset: 'label.reset',
+ addWebsite: 'label.add-website',
+ addMember: 'label.add-member',
+ editMember: 'label.edit-member',
+ removeMember: 'label.remove-member',
+ addDescription: 'label.add-description',
+ changePassword: 'label.change-password',
+ currentPassword: 'label.current-password',
+ newPassword: 'label.new-password',
+ confirmPassword: 'label.confirm-password',
+ timezone: 'label.timezone',
+ defaultDateRange: 'label.default-date-range',
+ language: 'label.language',
+ theme: 'label.theme',
+ profile: 'label.profile',
+ profiles: 'label.profiles',
+ dashboard: 'label.dashboard',
+ open: 'label.open',
+ more: 'label.more',
+ realtime: 'label.realtime',
+ queries: 'label.queries',
+ teams: 'label.teams',
+ teamSettings: 'label.team-settings',
+ analytics: 'label.analytics',
+ login: 'label.login',
+ logout: 'label.logout',
+ singleDay: 'label.single-day',
+ dateRange: 'label.date-range',
+ viewDetails: 'label.view-details',
+ deleteTeam: 'label.delete-team',
+ leaveTeam: 'label.leave-team',
+ refresh: 'label.refresh',
+ page: 'label.page',
+ pages: 'label.pages',
+ entry: 'label.entry',
+ exit: 'label.exit',
+ referrers: 'label.referrers',
+ screen: 'label.screen',
+ screens: 'label.screens',
+ browsers: 'label.browsers',
+ os: 'label.os',
+ devices: 'label.devices',
+ countries: 'label.countries',
+ languages: 'label.languages',
+ tags: 'label.tags',
+ segments: 'label.segments',
+ cohorts: 'label.cohorts',
+ count: 'label.count',
+ average: 'label.average',
+ sum: 'label.sum',
+ event: 'label.event',
+ events: 'label.events',
+ eventName: 'label.event-name',
+ excludeBounce: 'label.exclude-bounce',
+ query: 'label.query',
+ queryParameters: 'label.query-parameters',
+ back: 'label.back',
+ visitors: 'label.visitors',
+ visits: 'label.visits',
+ filterCombined: 'label.filter-combined',
+ filterRaw: 'label.filter-raw',
+ views: 'label.views',
+ none: 'label.none',
+ clearAll: 'label.clear-all',
+ property: 'label.property',
+ today: 'label.today',
+ lastHours: 'label.last-hours',
+ yesterday: 'label.yesterday',
+ thisWeek: 'label.this-week',
+ lastDays: 'label.last-days',
+ lastMonths: 'label.last-months',
+ thisMonth: 'label.this-month',
+ thisYear: 'label.this-year',
+ allTime: 'label.all-time',
+ customRange: 'label.custom-range',
+ selectWebsite: 'label.select-website',
+ selectLink: 'label.select-link',
+ selectPixel: 'label.select-pixel',
+ selectRole: 'label.select-role',
+ selectDate: 'label.select-date',
+ selectFilter: 'label.select-filter',
+ all: 'label.all',
+ session: 'label.session',
+ sessions: 'label.sessions',
+ distinctId: 'label.distinct-id',
+ pageNotFound: 'message.page-not-found',
+ activity: 'label.activity',
+ dismiss: 'label.dismiss',
+ poweredBy: 'label.powered-by',
+ pageViews: 'label.page-views',
+ uniqueVisitors: 'label.unique-visitors',
+ uniqueEvents: 'label.unique-events',
+ bounceRate: 'label.bounce-rate',
+ viewsPerVisit: 'label.views-per-visit',
+ visitDuration: 'label.visit-duration',
+ desktop: 'label.desktop',
+ laptop: 'label.laptop',
+ tablet: 'label.tablet',
+ mobile: 'label.mobile',
+ toggleCharts: 'label.toggle-charts',
+ title: 'label.title',
+ view: 'label.view',
+ cities: 'label.cities',
+ regions: 'label.regions',
+ reports: 'label.reports',
+ eventData: 'label.event-data',
+ sessionData: 'label.session-data',
+ funnel: 'label.funnel',
+ funnels: 'label.funnels',
+ funnelDescription: 'label.funnel-description',
+ revenue: 'label.revenue',
+ revenueDescription: 'label.revenue-description',
+ attribution: 'label.attribution',
+ attributionDescription: 'label.attribution-description',
+ currency: 'label.currency',
+ model: 'label.model',
+ path: 'label.path',
+ paths: 'label.paths',
+ add: 'label.add',
+ update: 'label.update',
+ window: 'label.window',
+ runQuery: 'label.run-query',
+ field: 'label.field',
+ fields: 'label.fields',
+ createReport: 'label.create-report',
+ description: 'label.description',
+ untitled: 'label.untitled',
+ type: 'label.type',
+ filter: 'label.filter',
+ filters: 'label.filters',
+ breakdown: 'label.breakdown',
+ true: 'label.true',
+ false: 'label.false',
+ is: 'label.is',
+ isNot: 'label.is-not',
+ isSet: 'label.is-set',
+ isNotSet: 'label.is-not-set',
+ greaterThan: 'label.greater-than',
+ lessThan: 'label.less-than',
+ greaterThanEquals: 'label.greater-than-equals',
+ lessThanEquals: 'label.less-than-equals',
+ contains: 'label.contains',
+ doesNotContain: 'label.does-not-contain',
+ regexMatch: 'label.regex-match',
+ regexNotMatch: 'label.regex-not-match',
+ includes: 'label.includes',
+ doesNotInclude: 'label.does-not-include',
+ before: 'label.before',
+ after: 'label.after',
+ isTrue: 'label.is-true',
+ isFalse: 'label.is-false',
+ exists: 'label.exists',
+ doesNotExist: 'label.doest-not-exist',
+ total: 'label.total',
+ min: 'label.min',
+ max: 'label.max',
+ unique: 'label.unique',
+ value: 'label.value',
+ overview: 'label.overview',
+ totalRecords: 'label.total-records',
+ insight: 'label.insight',
+ insights: 'label.insights',
+ insightsDescription: 'label.insights-description',
+ retention: 'label.retention',
+ retentionDescription: 'label.retention-description',
+ dropoff: 'label.dropoff',
+ referrer: 'label.referrer',
+ hostname: 'label.hostname',
+ country: 'label.country',
+ region: 'label.region',
+ city: 'label.city',
+ browser: 'label.browser',
+ device: 'label.device',
+ pageTitle: 'label.pageTitle',
+ tag: 'label.tag',
+ source: 'label.source',
+ medium: 'label.medium',
+ campaign: 'label.campaign',
+ content: 'label.content',
+ term: 'label.term',
+ utmSource: 'label.utm-source',
+ utmMedium: 'label.utm-medium',
+ utmCampaign: 'label.utm-campaign',
+ utmContent: 'label.utm-content',
+ utmTerm: 'label.utm-term',
+ segment: 'label.segment',
+ cohort: 'label.cohort',
+ minute: 'label.minute',
+ hour: 'label.hour',
+ day: 'label.day',
+ month: 'label.month',
+ date: 'label.date',
+ pageOf: 'label.page-of',
+ create: 'label.create',
+ search: 'label.search',
+ numberOfRecords: 'label.number-of-records',
+ select: 'label.select',
+ myAccount: 'label.my-account',
+ transfer: 'label.transfer',
+ transactions: 'label.transactions',
+ aov: 'label.aov',
+ arpu: 'label.arpu',
+ uniqueCustomers: 'label.uniqueCustomers',
+ customers: 'label.customers',
+ orders: 'label.orders',
+ viewedPage: 'message.viewed-page',
+ collectedData: 'message.collected-data',
+ triggeredEvent: 'message.triggered-event',
+ utm: 'label.utm',
+ utmDescription: 'label.utm-description',
+ conversionStep: 'label.conversion-step',
+ conversionRate: 'label.conversion-rate',
+ steps: 'label.steps',
+ startStep: 'label.start-step',
+ endStep: 'label.end-step',
+ addStep: 'label.add-step',
+ goal: 'label.goal',
+ goals: 'label.goals',
+ goalsDescription: 'label.goals-description',
+ journey: 'label.journey',
+ journeys: 'label.journeys',
+ journeyDescription: 'label.journey-description',
+ compareDates: 'label.compare-dates',
+ compare: 'label.compare',
+ current: 'label.current',
+ previous: 'label.previous',
+ previousPeriod: 'label.previous-period',
+ previousYear: 'label.previous-year',
+ lastSeen: 'label.last-seen',
+ firstSeen: 'label.first-seen',
+ properties: 'label.properties',
+ channel: 'label.channel',
+ channels: 'label.channels',
+ sources: 'label.sources',
+ campaigns: 'label.campaigns',
+ terms: 'label.terms',
+ direct: 'label.direct',
+ referral: 'label.referral',
+ affiliate: 'label.affiliate',
+ email: 'label.email',
+ sms: 'label.sms',
+ organicSearch: 'label.organic-search',
+ organicSocial: 'label.organic-social',
+ organicShopping: 'label.organic-shopping',
+ organicVideo: 'label.organic-video',
+ paidAds: 'label.paid-ads',
+ paidSearch: 'label.paid-search',
+ paidSocial: 'label.paid-social',
+ paidShopping: 'label.paid-shopping',
+ paidVideo: 'label.paid-video',
+ grouped: 'label.grouped',
+ other: 'label.other',
+ boards: 'label.boards',
+ apply: 'label.apply',
+ match: 'label.match',
+ matchAll: 'label.match-all',
+ matchAny: 'label.match-any',
+ link: 'label.link',
+ links: 'label.links',
+ pixel: 'label.pixel',
+ pixels: 'label.pixels',
+ addBoard: 'label.add-board',
+ selectComponent: 'label.select-component',
+ addLink: 'label.add-link',
+ addPixel: 'label.add-pixel',
+ maximize: 'label.maximize',
+ remaining: 'label.remaining',
+ conversion: 'label.conversion',
+ firstClick: 'label.first-click',
+ lastClick: 'label.last-click',
+ online: 'label.online',
+ preferences: 'label.preferences',
+ location: 'label.location',
+ chart: 'label.chart',
+ table: 'label.table',
+ download: 'label.download',
+ traffic: 'label.traffic',
+ behavior: 'label.behavior',
+ growth: 'label.growth',
+ account: 'label.account',
+ application: 'label.application',
+ version: 'label.version',
+ saveSegment: 'label.save-segment',
+ saveCohort: 'label.save-cohort',
+ saveReplay: 'label.save-replay',
+ analysis: 'label.analysis',
+ destinationUrl: 'label.destination-url',
+ slug: 'label.slug',
+ audience: 'label.audience',
+ invalidUrl: 'label.invalid-url',
+ environment: 'label.environment',
+ criteria: 'label.criteria',
+ share: 'label.share',
+ support: 'label.support',
+ documentation: 'label.documentation',
+ switchAccount: 'label.switch-account',
+ performance: 'label.performance',
+ lcp: 'label.lcp',
+ inp: 'label.inp',
+ cls: 'label.cls',
+ fcp: 'label.fcp',
+ ttfb: 'label.ttfb',
+ good: 'label.good',
+ needsImprovement: 'label.needs-improvement',
+ poor: 'label.poor',
+ sampleSize: 'label.sample-size',
+ play: 'label.play',
+ replays: 'label.replays',
+ saved: 'label.saved',
+ replay: 'label.replay',
+ replayId: 'label.replay-id',
+ replayEnabled: 'label.replay-enabled',
+ replayCode: 'label.replay-code',
+ sampleRate: 'label.sample-rate',
+ maskLevel: 'label.mask-level',
+ maxDuration: 'label.max-duration',
+ blockSelector: 'label.block-selector',
+ retentionDays: 'label.retention-days',
+ duration: 'label.duration',
+ recorded: 'label.recorded',
+ upgrade: 'label.upgrade',
+};
-export const labels = defineMessages({
- ok: { id: 'label.ok', defaultMessage: 'OK' },
- unknown: { id: 'label.unknown', defaultMessage: 'Unknown' },
- required: { id: 'label.required', defaultMessage: 'Required' },
- save: { id: 'label.save', defaultMessage: 'Save' },
- cancel: { id: 'label.cancel', defaultMessage: 'Cancel' },
- continue: { id: 'label.continue', defaultMessage: 'Continue' },
- delete: { id: 'label.delete', defaultMessage: 'Delete' },
- leave: { id: 'label.leave', defaultMessage: 'Leave' },
- users: { id: 'label.users', defaultMessage: 'Users' },
- createUser: { id: 'label.create-user', defaultMessage: 'Create user' },
- deleteUser: { id: 'label.delete-user', defaultMessage: 'Delete user' },
- username: { id: 'label.username', defaultMessage: 'Username' },
- password: { id: 'label.password', defaultMessage: 'Password' },
- role: { id: 'label.role', defaultMessage: 'Role' },
- user: { id: 'label.user', defaultMessage: 'User' },
- viewOnly: { id: 'label.view-only', defaultMessage: 'View only' },
- manage: { id: 'label.manage', defaultMessage: 'Manage' },
- admin: { id: 'label.admin', defaultMessage: 'Administrator' },
- confirm: { id: 'label.confirm', defaultMessage: 'Confirm' },
- details: { id: 'label.details', defaultMessage: 'Details' },
- website: { id: 'label.website', defaultMessage: 'Website' },
- websites: { id: 'label.websites', defaultMessage: 'Websites' },
- myWebsites: { id: 'label.my-websites', defaultMessage: 'My websites' },
- teamWebsites: { id: 'label.team-websites', defaultMessage: 'Team websites' },
- created: { id: 'label.created', defaultMessage: 'Created' },
- createdBy: { id: 'label.created-by', defaultMessage: 'Created By' },
- edit: { id: 'label.edit', defaultMessage: 'Edit' },
- name: { id: 'label.name', defaultMessage: 'Name' },
- manager: { id: 'label.manager', defaultMessage: 'Manager' },
- member: { id: 'label.member', defaultMessage: 'Member' },
- members: { id: 'label.members', defaultMessage: 'Members' },
- accessCode: { id: 'label.access-code', defaultMessage: 'Access code' },
- teamId: { id: 'label.team-id', defaultMessage: 'Team ID' },
- team: { id: 'label.team', defaultMessage: 'Team' },
- teamName: { id: 'label.team-name', defaultMessage: 'Team name' },
- regenerate: { id: 'label.regenerate', defaultMessage: 'Regenerate' },
- remove: { id: 'label.remove', defaultMessage: 'Remove' },
- join: { id: 'label.join', defaultMessage: 'Join' },
- createTeam: { id: 'label.create-team', defaultMessage: 'Create team' },
- joinTeam: { id: 'label.join-team', defaultMessage: 'Join team' },
- settings: { id: 'label.settings', defaultMessage: 'Settings' },
- owner: { id: 'label.owner', defaultMessage: 'Owner' },
- teamOwner: { id: 'label.team-owner', defaultMessage: 'Team owner' },
- teamManager: { id: 'label.team-manager', defaultMessage: 'Team manager' },
- teamMember: { id: 'label.team-member', defaultMessage: 'Team member' },
- teamViewOnly: { id: 'label.team-view-only', defaultMessage: 'Team view only' },
- enableShareUrl: { id: 'label.enable-share-url', defaultMessage: 'Enable share URL' },
- data: { id: 'label.data', defaultMessage: 'Data' },
- trackingCode: { id: 'label.tracking-code', defaultMessage: 'Tracking code' },
- shareUrl: { id: 'label.share-url', defaultMessage: 'Share URL' },
- actions: { id: 'label.actions', defaultMessage: 'Actions' },
- domain: { id: 'label.domain', defaultMessage: 'Domain' },
- websiteId: { id: 'label.website-id', defaultMessage: 'Website ID' },
- resetWebsite: { id: 'label.reset-website', defaultMessage: 'Reset website' },
- deleteWebsite: { id: 'label.delete-website', defaultMessage: 'Delete website' },
- transferWebsite: { id: 'label.transfer-website', defaultMessage: 'Transfer website' },
- deleteReport: { id: 'label.delete-report', defaultMessage: 'Delete report' },
- reset: { id: 'label.reset', defaultMessage: 'Reset' },
- addWebsite: { id: 'label.add-website', defaultMessage: 'Add website' },
- addMember: { id: 'label.add-member', defaultMessage: 'Add member' },
- editMember: { id: 'label.edit-member', defaultMessage: 'Edit member' },
- removeMember: { id: 'label.remove-member', defaultMessage: 'Remove member' },
- addDescription: { id: 'label.add-description', defaultMessage: 'Add description' },
- changePassword: { id: 'label.change-password', defaultMessage: 'Change password' },
- currentPassword: { id: 'label.current-password', defaultMessage: 'Current password' },
- newPassword: { id: 'label.new-password', defaultMessage: 'New password' },
- confirmPassword: { id: 'label.confirm-password', defaultMessage: 'Confirm password' },
- timezone: { id: 'label.timezone', defaultMessage: 'Timezone' },
- defaultDateRange: { id: 'label.default-date-range', defaultMessage: 'Default date range' },
- language: { id: 'label.language', defaultMessage: 'Language' },
- theme: { id: 'label.theme', defaultMessage: 'Theme' },
- profile: { id: 'label.profile', defaultMessage: 'Profile' },
- dashboard: { id: 'label.dashboard', defaultMessage: 'Dashboard' },
- more: { id: 'label.more', defaultMessage: 'More' },
- realtime: { id: 'label.realtime', defaultMessage: 'Realtime' },
- queries: { id: 'label.queries', defaultMessage: 'Queries' },
- teams: { id: 'label.teams', defaultMessage: 'Teams' },
- analytics: { id: 'label.analytics', defaultMessage: 'Analytics' },
- login: { id: 'label.login', defaultMessage: 'Login' },
- logout: { id: 'label.logout', defaultMessage: 'Logout' },
- singleDay: { id: 'label.single-day', defaultMessage: 'Single day' },
- dateRange: { id: 'label.date-range', defaultMessage: 'Date range' },
- viewDetails: { id: 'label.view-details', defaultMessage: 'View details' },
- deleteTeam: { id: 'label.delete-team', defaultMessage: 'Delete team' },
- leaveTeam: { id: 'label.leave-team', defaultMessage: 'Leave team' },
- refresh: { id: 'label.refresh', defaultMessage: 'Refresh' },
- pages: { id: 'label.pages', defaultMessage: 'Pages' },
- entry: { id: 'label.entry', defaultMessage: 'Entry path' },
- exit: { id: 'label.exit', defaultMessage: 'Exit path' },
- referrers: { id: 'label.referrers', defaultMessage: 'Referrers' },
- hosts: { id: 'label.hosts', defaultMessage: 'Hosts' },
- screens: { id: 'label.screens', defaultMessage: 'Screens' },
- browsers: { id: 'label.browsers', defaultMessage: 'Browsers' },
- os: { id: 'label.os', defaultMessage: 'OS' },
- devices: { id: 'label.devices', defaultMessage: 'Devices' },
- countries: { id: 'label.countries', defaultMessage: 'Countries' },
- languages: { id: 'label.languages', defaultMessage: 'Languages' },
- tags: { id: 'label.tags', defaultMessage: 'Tags' },
- segments: { id: 'label.segments', defaultMessage: 'Segments' },
- cohorts: { id: 'label.cohorts', defaultMessage: 'Cohorts' },
- count: { id: 'label.count', defaultMessage: 'Count' },
- average: { id: 'label.average', defaultMessage: 'Average' },
- sum: { id: 'label.sum', defaultMessage: 'Sum' },
- event: { id: 'label.event', defaultMessage: 'Event' },
- events: { id: 'label.events', defaultMessage: 'Events' },
- query: { id: 'label.query', defaultMessage: 'Query' },
- queryParameters: { id: 'label.query-parameters', defaultMessage: 'Query parameters' },
- back: { id: 'label.back', defaultMessage: 'Back' },
- visitors: { id: 'label.visitors', defaultMessage: 'Visitors' },
- visits: { id: 'label.visits', defaultMessage: 'Visits' },
- filterCombined: { id: 'label.filter-combined', defaultMessage: 'Combined' },
- filterRaw: { id: 'label.filter-raw', defaultMessage: 'Raw' },
- views: { id: 'label.views', defaultMessage: 'Views' },
- none: { id: 'label.none', defaultMessage: 'None' },
- clearAll: { id: 'label.clear-all', defaultMessage: 'Clear all' },
- property: { id: 'label.property', defaultMessage: 'Property' },
- today: { id: 'label.today', defaultMessage: 'Today' },
- lastHours: { id: 'label.last-hours', defaultMessage: 'Last {x} hours' },
- yesterday: { id: 'label.yesterday', defaultMessage: 'Yesterday' },
- thisWeek: { id: 'label.this-week', defaultMessage: 'This week' },
- lastDays: { id: 'label.last-days', defaultMessage: 'Last {x} days' },
- lastMonths: { id: 'label.last-months', defaultMessage: 'Last {x} months' },
- thisMonth: { id: 'label.this-month', defaultMessage: 'This month' },
- thisYear: { id: 'label.this-year', defaultMessage: 'This year' },
- allTime: { id: 'label.all-time', defaultMessage: 'All time' },
- customRange: { id: 'label.custom-range', defaultMessage: 'Custom range' },
- selectWebsite: { id: 'label.select-website', defaultMessage: 'Select website' },
- selectRole: { id: 'label.select-role', defaultMessage: 'Select role' },
- selectDate: { id: 'label.select-date', defaultMessage: 'Select date' },
- all: { id: 'label.all', defaultMessage: 'All' },
- session: { id: 'label.session', defaultMessage: 'Session' },
- sessions: { id: 'label.sessions', defaultMessage: 'Sessions' },
- distinctId: { id: 'label.distinct-id', defaultMessage: 'Distinct ID' },
- pageNotFound: { id: 'message.page-not-found', defaultMessage: 'Page not found' },
- activity: { id: 'label.activity', defaultMessage: 'Activity' },
- dismiss: { id: 'label.dismiss', defaultMessage: 'Dismiss' },
- poweredBy: { id: 'label.powered-by', defaultMessage: 'Powered by {name}' },
- pageViews: { id: 'label.page-views', defaultMessage: 'Page views' },
- uniqueVisitors: { id: 'label.unique-visitors', defaultMessage: 'Unique visitors' },
- bounceRate: { id: 'label.bounce-rate', defaultMessage: 'Bounce rate' },
- viewsPerVisit: { id: 'label.views-per-visit', defaultMessage: 'Views per visit' },
- visitDuration: { id: 'label.visit-duration', defaultMessage: 'Visit duration' },
- desktop: { id: 'label.desktop', defaultMessage: 'Desktop' },
- laptop: { id: 'label.laptop', defaultMessage: 'Laptop' },
- tablet: { id: 'label.tablet', defaultMessage: 'Tablet' },
- mobile: { id: 'label.mobile', defaultMessage: 'Mobile' },
- toggleCharts: { id: 'label.toggle-charts', defaultMessage: 'Toggle charts' },
- editDashboard: { id: 'label.edit-dashboard', defaultMessage: 'Edit dashboard' },
- title: { id: 'label.title', defaultMessage: 'Title' },
- view: { id: 'label.view', defaultMessage: 'View' },
- cities: { id: 'label.cities', defaultMessage: 'Cities' },
- regions: { id: 'label.regions', defaultMessage: 'Regions' },
- reports: { id: 'label.reports', defaultMessage: 'Reports' },
- eventData: { id: 'label.event-data', defaultMessage: 'Event data' },
- sessionData: { id: 'label.session-data', defaultMessage: 'Session data' },
- funnel: { id: 'label.funnel', defaultMessage: 'Funnel' },
- funnelDescription: {
- id: 'label.funnel-description',
- defaultMessage: 'Understand the conversion and drop-off rate of users.',
- },
- revenue: { id: 'label.revenue', defaultMessage: 'Revenue' },
- revenueDescription: {
- id: 'label.revenue-description',
- defaultMessage: 'Look into your revenue data and how users are spending.',
- },
- attribution: { id: 'label.attribution', defaultMessage: 'Attribution' },
- attributionDescription: {
- id: 'label.attribution-description',
- defaultMessage: 'See how users engage with your marketing and what drives conversions.',
- },
- currency: { id: 'label.currency', defaultMessage: 'Currency' },
- model: { id: 'label.model', defaultMessage: 'Model' },
- url: { id: 'label.url', defaultMessage: 'URL' },
- urls: { id: 'label.urls', defaultMessage: 'URLs' },
- path: { id: 'label.path', defaultMessage: 'Path' },
- paths: { id: 'label.paths', defaultMessage: 'Paths' },
- add: { id: 'label.add', defaultMessage: 'Add' },
- update: { id: 'label.update', defaultMessage: 'Update' },
- window: { id: 'label.window', defaultMessage: 'Window' },
- runQuery: { id: 'label.run-query', defaultMessage: 'Run query' },
- field: { id: 'label.field', defaultMessage: 'Field' },
- fields: { id: 'label.fields', defaultMessage: 'Fields' },
- createReport: { id: 'label.create-report', defaultMessage: 'Create report' },
- description: { id: 'label.description', defaultMessage: 'Description' },
- untitled: { id: 'label.untitled', defaultMessage: 'Untitled' },
- type: { id: 'label.type', defaultMessage: 'Type' },
- filter: { id: 'label.filter', defaultMessage: 'Filter' },
- filters: { id: 'label.filters', defaultMessage: 'Filters' },
- breakdown: { id: 'label.breakdown', defaultMessage: 'Breakdown' },
- true: { id: 'label.true', defaultMessage: 'True' },
- false: { id: 'label.false', defaultMessage: 'False' },
- is: { id: 'label.is', defaultMessage: 'Is' },
- isNot: { id: 'label.is-not', defaultMessage: 'Is not' },
- isSet: { id: 'label.is-set', defaultMessage: 'Is set' },
- isNotSet: { id: 'label.is-not-set', defaultMessage: 'Is not set' },
- greaterThan: { id: 'label.greater-than', defaultMessage: 'Greater than' },
- lessThan: { id: 'label.less-than', defaultMessage: 'Less than' },
- greaterThanEquals: { id: 'label.greater-than-equals', defaultMessage: 'Greater than or equals' },
- lessThanEquals: { id: 'label.less-than-equals', defaultMessage: 'Less than or equals' },
- contains: { id: 'label.contains', defaultMessage: 'Contains' },
- doesNotContain: { id: 'label.does-not-contain', defaultMessage: 'Does not contain' },
- before: { id: 'label.before', defaultMessage: 'Before' },
- after: { id: 'label.after', defaultMessage: 'After' },
- total: { id: 'label.total', defaultMessage: 'Total' },
- min: { id: 'label.min', defaultMessage: 'Min' },
- max: { id: 'label.max', defaultMessage: 'Max' },
- unique: { id: 'label.unique', defaultMessage: 'Unique' },
- value: { id: 'label.value', defaultMessage: 'Value' },
- overview: { id: 'label.overview', defaultMessage: 'Overview' },
- totalRecords: { id: 'label.total-records', defaultMessage: 'Total records' },
- insights: { id: 'label.insights', defaultMessage: 'Insights' },
- insightsDescription: {
- id: 'label.insights-description',
- defaultMessage: 'Dive deeper into your data by using segments and filters.',
- },
- retention: { id: 'label.retention', defaultMessage: 'Retention' },
- retentionDescription: {
- id: 'label.retention-description',
- defaultMessage: 'Measure your website stickiness by tracking how often users return.',
- },
- dropoff: { id: 'label.dropoff', defaultMessage: 'Dropoff' },
- referrer: { id: 'label.referrer', defaultMessage: 'Referrer' },
- host: { id: 'label.host', defaultMessage: 'Host' },
- country: { id: 'label.country', defaultMessage: 'Country' },
- region: { id: 'label.region', defaultMessage: 'Region' },
- city: { id: 'label.city', defaultMessage: 'City' },
- browser: { id: 'label.browser', defaultMessage: 'Browser' },
- device: { id: 'label.device', defaultMessage: 'Device' },
- pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' },
- tag: { id: 'label.tag', defaultMessage: 'Tag' },
- segment: { id: 'label.segment', defaultMessage: 'Segment' },
- cohort: { id: 'label.cohort', defaultMessage: 'Cohort' },
- day: { id: 'label.day', defaultMessage: 'Day' },
- date: { id: 'label.date', defaultMessage: 'Date' },
- pageOf: { id: 'label.page-of', defaultMessage: 'Page {current} of {total}' },
- create: { id: 'label.create', defaultMessage: 'Create' },
- search: { id: 'label.search', defaultMessage: 'Search' },
- numberOfRecords: {
- id: 'label.number-of-records',
- defaultMessage: '{x} {x, plural, one {record} other {records}}',
- },
- select: { id: 'label.select', defaultMessage: 'Select' },
- myAccount: { id: 'label.my-account', defaultMessage: 'My account' },
- transfer: { id: 'label.transfer', defaultMessage: 'Transfer' },
- transactions: { id: 'label.transactions', defaultMessage: 'Transactions' },
- uniqueCustomers: { id: 'label.uniqueCustomers', defaultMessage: 'Unique Customers' },
- viewedPage: {
- id: 'message.viewed-page',
- defaultMessage: 'Viewed page',
- },
- collectedData: {
- id: 'message.collected-data',
- defaultMessage: 'Collected data',
- },
- triggeredEvent: {
- id: 'message.triggered-event',
- defaultMessage: 'Triggered event',
- },
- visitorsDroppedOff: {
- id: 'message.visitors-dropped-off',
- defaultMessage: 'Visitors dropped off',
- },
- utm: { id: 'label.utm', defaultMessage: 'UTM' },
- utmDescription: {
- id: 'label.utm-description',
- defaultMessage: 'Track your campaigns through UTM parameters.',
- },
- conversionStep: { id: 'label.conversion-step', defaultMessage: 'Conversion Step' },
- steps: { id: 'label.steps', defaultMessage: 'Steps' },
- startStep: { id: 'label.start-step', defaultMessage: 'Start Step' },
- endStep: { id: 'label.end-step', defaultMessage: 'End Step' },
- addStep: { id: 'label.add-step', defaultMessage: 'Add step' },
- goal: { id: 'label.goal', defaultMessage: 'Goal' },
- goals: { id: 'label.goals', defaultMessage: 'Goals' },
- goalsDescription: {
- id: 'label.goals-description',
- defaultMessage: 'Track your goals for pageviews and events.',
- },
- journey: { id: 'label.journey', defaultMessage: 'Journey' },
- journeyDescription: {
- id: 'label.journey-description',
- defaultMessage: 'Understand how users navigate through your website.',
- },
- compare: { id: 'label.compare', defaultMessage: 'Compare' },
- current: { id: 'label.current', defaultMessage: 'Current' },
- previous: { id: 'label.previous', defaultMessage: 'Previous' },
- previousPeriod: { id: 'label.previous-period', defaultMessage: 'Previous period' },
- previousYear: { id: 'label.previous-year', defaultMessage: 'Previous year' },
- lastSeen: { id: 'label.last-seen', defaultMessage: 'Last seen' },
- firstSeen: { id: 'label.first-seen', defaultMessage: 'First seen' },
- properties: { id: 'label.properties', defaultMessage: 'Properties' },
- channels: { id: 'label.channels', defaultMessage: 'Channels' },
- sources: { id: 'label.sources', defaultMessage: 'Sources' },
- medium: { id: 'label.medium', defaultMessage: 'Medium' },
- campaigns: { id: 'label.campaigns', defaultMessage: 'Campaigns' },
- content: { id: 'label.content', defaultMessage: 'Content' },
- terms: { id: 'label.terms', defaultMessage: 'Terms' },
- direct: { id: 'label.direct', defaultMessage: 'Direct' },
- referral: { id: 'label.referral', defaultMessage: 'Referral' },
- affiliate: { id: 'label.affiliate', defaultMessage: 'Affiliate' },
- email: { id: 'label.email', defaultMessage: 'Email' },
- sms: { id: 'label.sms', defaultMessage: 'SMS' },
- organicSearch: { id: 'label.organic-search', defaultMessage: 'Organic search' },
- organicSocial: { id: 'label.organic-social', defaultMessage: 'Organic social' },
- organicShopping: { id: 'label.organic-shopping', defaultMessage: 'Organic shopping' },
- organicVideo: { id: 'label.organic-video', defaultMessage: 'Organic video' },
- paidAds: { id: 'label.paid-ads', defaultMessage: 'Paid ads' },
- paidSearch: { id: 'label.paid-search', defaultMessage: 'Paid search' },
- paidSocial: { id: 'label.paid-social', defaultMessage: 'Paid social' },
- paidShopping: { id: 'label.paid-shopping', defaultMessage: 'Paid shopping' },
- paidVideo: { id: 'label.paid-video', defaultMessage: 'Paid video' },
- grouped: { id: 'label.grouped', defaultMessage: 'Grouped' },
- other: { id: 'label.other', defaultMessage: 'Other' },
- chart: { id: 'label.chart', defaultMessage: 'Chart' },
- table: { id: 'label.table', defaultMessage: 'Table' },
- download: { id: 'label.download', defaultMessage: 'Download' },
-});
-
-export const messages = defineMessages({
- error: { id: 'message.error', defaultMessage: 'Something went wrong.' },
- saved: { id: 'message.saved', defaultMessage: 'Saved.' },
- noUsers: { id: 'message.no-users', defaultMessage: 'There are no users.' },
- userDeleted: { id: 'message.user-deleted', defaultMessage: 'User deleted.' },
- noDataAvailable: { id: 'message.no-data-available', defaultMessage: 'No data available.' },
- confirmReset: {
- id: 'message.confirm-reset',
- defaultMessage: 'Are you sure you want to reset {target}?',
- },
- confirmDelete: {
- id: 'message.confirm-delete',
- defaultMessage: 'Are you sure you want to delete {target}?',
- },
- confirmRemove: {
- id: 'message.confirm-remove',
- defaultMessage: 'Are you sure you want to remove {target}?',
- },
- confirmLeave: {
- id: 'message.confirm-leave',
- defaultMessage: 'Are you sure you want to leave {target}?',
- },
- minPasswordLength: {
- id: 'message.min-password-length',
- defaultMessage: 'Minimum length of {n} characters',
- },
- noTeams: {
- id: 'message.no-teams',
- defaultMessage: 'You have not created any teams.',
- },
- shareUrl: {
- id: 'message.share-url',
- defaultMessage: 'Your website stats are publicly available at the following URL:',
- },
- trackingCode: {
- id: 'message.tracking-code',
- defaultMessage:
- 'To track stats for this website, place the following code in the ... section of your HTML.',
- },
- joinTeamWarning: {
- id: 'message.team-already-member',
- defaultMessage: 'You are already a member of the team.',
- },
- actionConfirmation: {
- id: 'message.action-confirmation',
- defaultMessage: 'Type {confirmation} in the box below to confirm.',
- },
- resetWebsite: {
- id: 'message.reset-website',
- defaultMessage: 'To reset this website, type {confirmation} in the box below to confirm.',
- },
- invalidDomain: {
- id: 'message.invalid-domain',
- defaultMessage: 'Invalid domain. Do not include http/https.',
- },
- resetWebsiteWarning: {
- id: 'message.reset-website-warning',
- defaultMessage:
- 'All statistics for this website will be deleted, but your settings will remain intact.',
- },
- deleteWebsiteWarning: {
- id: 'message.delete-website-warning',
- defaultMessage: 'All website data will be deleted.',
- },
- deleteTeamWarning: {
- id: 'message.delete-team-warning',
- defaultMessage: 'Deleting a team will also delete all team websites.',
- },
- noResultsFound: {
- id: 'message.no-results-found',
- defaultMessage: 'No results found.',
- },
- noWebsitesConfigured: {
- id: 'message.no-websites-configured',
- defaultMessage: 'You do not have any websites configured.',
- },
- noTeamWebsites: {
- id: 'message.no-team-websites',
- defaultMessage: 'This team does not have any websites.',
- },
- teamWebsitesInfo: {
- id: 'message.team-websites-info',
- defaultMessage: 'Websites can be viewed by anyone on the team.',
- },
- noMatchPassword: { id: 'message.no-match-password', defaultMessage: 'Passwords do not match.' },
- goToSettings: {
- id: 'message.go-to-settings',
- defaultMessage: 'Go to settings',
- },
- activeUsers: {
- id: 'message.active-users',
- defaultMessage: '{x} current {x, plural, one {visitor} other {visitors}}',
- },
- teamNotFound: {
- id: 'message.team-not-found',
- defaultMessage: 'Team not found.',
- },
- visitorLog: {
- id: 'message.visitor-log',
- defaultMessage: 'Visitor from {country} using {browser} on {os} {device}',
- },
- eventLog: {
- id: 'message.event-log',
- defaultMessage: '{event} on {url}',
- },
- incorrectUsernamePassword: {
- id: 'message.incorrect-username-password',
- defaultMessage: 'Incorrect username and/or password.',
- },
- noEventData: {
- id: 'message.no-event-data',
- defaultMessage: 'No event data is available.',
- },
- newVersionAvailable: {
- id: 'message.new-version-available',
- defaultMessage: 'A new version of Umami {version} is available!',
- },
- transferWebsite: {
- id: 'message.transfer-website',
- defaultMessage: 'Transfer website ownership to your account or another team.',
- },
- transferTeamWebsiteToUser: {
- id: 'message.transfer-team-website-to-user',
- defaultMessage: 'Transfer this website to your account?',
- },
- transferUserWebsiteToTeam: {
- id: 'message.transfer-user-website-to-team',
- defaultMessage: 'Select the team to transfer this website to.',
- },
-});
+export const messages: Record = {
+ error: 'message.error',
+ saved: 'message.saved',
+ noUsers: 'message.no-users',
+ userDeleted: 'message.user-deleted',
+ noDataAvailable: 'message.no-data-available',
+ nothingSelected: 'message.nothing-selected',
+ confirmReset: 'message.confirm-reset',
+ confirmDelete: 'message.confirm-delete',
+ confirmRemove: 'message.confirm-remove',
+ confirmLeave: 'message.confirm-leave',
+ minPasswordLength: 'message.min-password-length',
+ noTeams: 'message.no-teams',
+ shareUrl: 'message.share-url',
+ trackingCode: 'message.tracking-code',
+ joinTeamWarning: 'message.team-already-member',
+ actionConfirmation: 'message.action-confirmation',
+ resetWebsite: 'message.reset-website',
+ invalidDomain: 'message.invalid-domain',
+ resetWebsiteWarning: 'message.reset-website-warning',
+ deleteWebsiteWarning: 'message.delete-website-warning',
+ deleteTeamWarning: 'message.delete-team-warning',
+ noResultsFound: 'message.no-results-found',
+ noWebsitesConfigured: 'message.no-websites-configured',
+ noTeamWebsites: 'message.no-team-websites',
+ emptyDashboard: 'message.empty-dashboard',
+ selectComponentPreview: 'message.select-component-preview',
+ selectWebsiteFirst: 'message.select-website-first',
+ selectBoardEntityFirst: 'message.select-board-entity-first',
+ teamWebsitesInfo: 'message.team-websites-info',
+ noMatchPassword: 'message.no-match-password',
+ goToSettings: 'message.go-to-settings',
+ activeUsers: 'message.active-users',
+ teamNotFound: 'message.team-not-found',
+ visitorLog: 'message.visitor-log',
+ eventLog: 'message.event-log',
+ incorrectUsernamePassword: 'message.incorrect-username-password',
+ noEventData: 'message.no-event-data',
+ newVersionAvailable: 'message.new-version-available',
+ transferWebsite: 'message.transfer-website',
+ transferTeamWebsiteToUser: 'message.transfer-team-website-to-user',
+ transferUserWebsiteToTeam: 'message.transfer-user-website-to-team',
+ unauthorized: 'message.unauthorized',
+ badRequest: 'message.bad-request',
+ forbidden: 'message.forbidden',
+ notFound: 'message.not-found',
+ serverError: 'message.sever-error',
+ upgradeRequired: 'message.upgrade-required',
+};
diff --git a/src/components/metrics/ActiveUsers.module.css b/src/components/metrics/ActiveUsers.module.css
deleted file mode 100644
index 4a984725e..000000000
--- a/src/components/metrics/ActiveUsers.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.container {
- display: flex;
- align-items: center;
- margin-inline-start: 20px;
-}
-
-.text {
- display: flex;
- white-space: nowrap;
- font-size: var(--font-size-md);
- font-weight: 400;
-}
diff --git a/src/components/metrics/ActiveUsers.tsx b/src/components/metrics/ActiveUsers.tsx
index 50c676ab8..fda0ba2a4 100644
--- a/src/components/metrics/ActiveUsers.tsx
+++ b/src/components/metrics/ActiveUsers.tsx
@@ -1,8 +1,7 @@
+import { StatusLight, Text } from '@umami/react-zen';
import { useMemo } from 'react';
-import { StatusLight } from 'react-basics';
-import { useApi } from '@/components/hooks';
-import { useMessages } from '@/components/hooks';
-import styles from './ActiveUsers.module.css';
+import { LinkButton } from '@/components/common/LinkButton';
+import { useActyiveUsersQuery, useMessages } from '@/components/hooks';
export function ActiveUsers({
websiteId,
@@ -13,14 +12,8 @@ export function ActiveUsers({
value?: number;
refetchInterval?: number;
}) {
- const { formatMessage, messages } = useMessages();
- const { get, useQuery } = useApi();
- const { data } = useQuery({
- queryKey: ['websites:active', websiteId],
- queryFn: () => get(`/websites/${websiteId}/active`),
- enabled: !!websiteId,
- refetchInterval,
- });
+ const { t, labels } = useMessages();
+ const { data } = useActyiveUsersQuery(websiteId, { refetchInterval });
const count = useMemo(() => {
if (websiteId) {
@@ -35,10 +28,12 @@ export function ActiveUsers({
}
return (
-
- {formatMessage(messages.activeUsers, { x: count })}
-
+
+
+
+ {count} {t(labels.online)}
+
+
+
);
}
-
-export default ActiveUsers;
diff --git a/src/components/metrics/BrowsersTable.tsx b/src/components/metrics/BrowsersTable.tsx
deleted file mode 100644
index 500686b14..000000000
--- a/src/components/metrics/BrowsersTable.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import FilterLink from '@/components/common/FilterLink';
-import MetricsTable, { MetricsTableProps } from '@/components/metrics/MetricsTable';
-import { useMessages } from '@/components/hooks';
-import { useFormat } from '@/components/hooks';
-import TypeIcon from '@/components/common/TypeIcon';
-
-export function BrowsersTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
- const { formatBrowser } = useFormat();
-
- function renderLink({ x: browser }) {
- return (
-
-
-
- );
- }
-
- return (
-
- );
-}
-
-export default BrowsersTable;
diff --git a/src/components/metrics/ChangeLabel.module.css b/src/components/metrics/ChangeLabel.module.css
deleted file mode 100644
index 802a9931d..000000000
--- a/src/components/metrics/ChangeLabel.module.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.label {
- display: flex;
- align-items: center;
- gap: 5px;
- font-size: 13px;
- font-weight: 700;
- padding: 0.1em 0.5em;
- border-radius: 5px;
- color: var(--base500);
- align-self: flex-start;
-}
-
-.positive {
- color: var(--green700);
- background: var(--green100);
-}
-
-.negative {
- color: var(--red700);
- background: var(--red100);
-}
-
-.neutral {
- color: var(--base700);
- background: var(--base100);
-}
diff --git a/src/components/metrics/ChangeLabel.tsx b/src/components/metrics/ChangeLabel.tsx
index 7e7cb77b5..1960cefcb 100644
--- a/src/components/metrics/ChangeLabel.tsx
+++ b/src/components/metrics/ChangeLabel.tsx
@@ -1,46 +1,60 @@
-import classNames from 'classnames';
-import { Icon, Icons } from 'react-basics';
-import { ReactNode } from 'react';
-import styles from './ChangeLabel.module.css';
+import { Icon, Row, type RowProps, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { ArrowRight } from '@/components/icons';
+
+const STYLES = {
+ positive: {
+ color: `var(--status-success)`,
+ background: `var(--status-success-bg)`,
+ },
+ negative: {
+ color: `var(--status-error)`,
+ background: `var(--status-error-bg)`,
+ },
+ neutral: {
+ color: `var(--text-muted)`,
+ background: `var(--surface-raised)`,
+ },
+};
export function ChangeLabel({
value,
size,
- title,
reverseColors,
- className,
children,
+ ...props
}: {
value: number;
size?: 'xs' | 'sm' | 'md' | 'lg';
title?: string;
reverseColors?: boolean;
showPercentage?: boolean;
- className?: string;
children?: ReactNode;
-}) {
+} & RowProps) {
const positive = value >= 0;
const negative = value < 0;
- const neutral = value === 0 || isNaN(value);
+ const neutral = value === 0 || Number.isNaN(value);
const good = reverseColors ? negative : positive;
+ const style =
+ STYLES[good && 'positive'] || STYLES[!good && 'negative'] || STYLES[neutral && 'neutral'];
+
return (
-
{!neutral && (
-
+
)}
- {children || value}
-
+ {children || value}
+
);
}
-
-export default ChangeLabel;
diff --git a/src/components/metrics/ChannelsTable.tsx b/src/components/metrics/ChannelsTable.tsx
deleted file mode 100644
index d2dc207f8..000000000
--- a/src/components/metrics/ChannelsTable.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import MetricsTable, { MetricsTableProps } from '@/components/metrics/MetricsTable';
-import { useMessages } from '@/components/hooks';
-
-export function ChannelsTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
-
- const renderLabel = ({ x }) => {
- return formatMessage(labels[x]);
- };
-
- return (
-
- );
-}
-
-export default ChannelsTable;
diff --git a/src/components/metrics/CitiesTable.tsx b/src/components/metrics/CitiesTable.tsx
deleted file mode 100644
index 1e5fc7351..000000000
--- a/src/components/metrics/CitiesTable.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import { emptyFilter } from '@/lib/filters';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages } from '@/components/hooks';
-import { useFormat } from '@/components/hooks';
-
-export function CitiesTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
- const { formatCity } = useFormat();
-
- const renderLink = ({ x: city, country }) => {
- return (
-
- {country && (
-
- )}
-
- );
- };
-
- return (
-
- );
-}
-
-export default CitiesTable;
diff --git a/src/components/metrics/CountriesTable.tsx b/src/components/metrics/CountriesTable.tsx
deleted file mode 100644
index cdd051151..000000000
--- a/src/components/metrics/CountriesTable.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import FilterLink from '@/components/common/FilterLink';
-import { useCountryNames } from '@/components/hooks';
-import { useLocale, useMessages, useFormat } from '@/components/hooks';
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import TypeIcon from '@/components/common/TypeIcon';
-
-export function CountriesTable({ ...props }: MetricsTableProps) {
- const { locale } = useLocale();
- const { countryNames } = useCountryNames(locale);
- const { formatMessage, labels } = useMessages();
- const { formatCountry } = useFormat();
-
- const renderLink = ({ x: code }) => {
- return (
-
-
-
- );
- };
-
- return (
-
- );
-}
-
-export default CountriesTable;
diff --git a/src/components/metrics/DatePickerForm.module.css b/src/components/metrics/DatePickerForm.module.css
deleted file mode 100644
index 7168fa0d0..000000000
--- a/src/components/metrics/DatePickerForm.module.css
+++ /dev/null
@@ -1,44 +0,0 @@
-.container {
- display: flex;
- flex-direction: column;
- max-width: 100vw;
-}
-
-.calendars {
- display: flex;
- justify-content: center;
-}
-
-.calendars > div + div {
- margin-inline-start: 20px;
- padding-inline-start: 20px;
- border-inline-start: 1px solid var(--base300);
-}
-
-.filter {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 20px;
-}
-
-.buttons {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 10px;
- margin-top: 20px;
-}
-
-@media only screen and (max-width: 768px) {
- .calendars {
- flex-direction: column;
- }
-
- .calendars > div + div {
- padding: 0;
- margin-inline-start: 0;
- margin-top: 20px;
- border: 0;
- }
-}
diff --git a/src/components/metrics/DatePickerForm.tsx b/src/components/metrics/DatePickerForm.tsx
index d1a5c7db0..cb6041af6 100644
--- a/src/components/metrics/DatePickerForm.tsx
+++ b/src/components/metrics/DatePickerForm.tsx
@@ -1,10 +1,10 @@
+import { Button, Calendar, Column, Row, ToggleGroup, ToggleGroupItem } from '@umami/react-zen';
+import { endOfDay, isAfter, isBefore, isSameDay, startOfDay } from 'date-fns';
import { useState } from 'react';
-import { Button, ButtonGroup, Calendar } from 'react-basics';
-import { isAfter, isBefore, isSameDay, startOfDay, endOfDay } from 'date-fns';
-import { useLocale } from '@/components/hooks';
-import { FILTER_DAY, FILTER_RANGE } from '@/lib/constants';
import { useMessages } from '@/components/hooks';
-import styles from './DatePickerForm.module.css';
+
+const FILTER_DAY = 'filter-day';
+const FILTER_RANGE = 'filter-range';
export function DatePickerForm({
startDate: defaultStartDate,
@@ -14,73 +14,61 @@ export function DatePickerForm({
onChange,
onClose,
}) {
- const [selected, setSelected] = useState(
+ const [selected, setSelected] = useState([
isSameDay(defaultStartDate, defaultEndDate) ? FILTER_DAY : FILTER_RANGE,
- );
- const [singleDate, setSingleDate] = useState(defaultStartDate);
- const [startDate, setStartDate] = useState(defaultStartDate);
- const [endDate, setEndDate] = useState(defaultEndDate);
- const { dateLocale } = useLocale();
- const { formatMessage, labels } = useMessages();
+ ]);
+ const [date, setDate] = useState(defaultStartDate || new Date());
+ const [startDate, setStartDate] = useState(defaultStartDate || new Date());
+ const [endDate, setEndDate] = useState(defaultEndDate || new Date());
+ const { t, labels } = useMessages();
- const disabled =
- selected === FILTER_DAY
- ? isAfter(minDate, singleDate) && isBefore(maxDate, singleDate)
- : isAfter(startDate, endDate);
+ const disabled = selected.includes(FILTER_DAY)
+ ? isAfter(minDate, date) && isBefore(maxDate, date)
+ : isAfter(startDate, endDate);
const handleSave = () => {
- if (selected === FILTER_DAY) {
- onChange(`range:${startOfDay(singleDate).getTime()}:${endOfDay(singleDate).getTime()}`);
+ if (selected.includes(FILTER_DAY)) {
+ onChange(`range:${startOfDay(date).getTime()}:${endOfDay(date).getTime()}`);
} else {
onChange(`range:${startOfDay(startDate).getTime()}:${endOfDay(endDate).getTime()}`);
}
};
return (
-
-
- setSelected(key as any)}>
- {formatMessage(labels.singleDay)}
- {formatMessage(labels.dateRange)}
-
-
-
- {selected === FILTER_DAY && (
-
+
+
+
+ {t(labels.singleDay)}
+ {t(labels.dateRange)}
+
+
+
+ {selected.includes(FILTER_DAY) && (
+
)}
- {selected === FILTER_RANGE && (
- <>
+ {selected.includes(FILTER_RANGE) && (
+
- >
+
)}
-
-
-
- {formatMessage(labels.save)}
+
+
+ {t(labels.cancel)}
+
+ {t(labels.apply)}
- {formatMessage(labels.cancel)}
-
-
+
+
);
}
-
-export default DatePickerForm;
diff --git a/src/components/metrics/DevicesTable.tsx b/src/components/metrics/DevicesTable.tsx
deleted file mode 100644
index ed327c33a..000000000
--- a/src/components/metrics/DevicesTable.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages } from '@/components/hooks';
-import { useFormat } from '@/components/hooks';
-import TypeIcon from '@/components/common/TypeIcon';
-
-export function DevicesTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
- const { formatDevice } = useFormat();
-
- function renderLink({ x: device }) {
- return (
-
-
-
- );
- }
-
- return (
-
- );
-}
-
-export default DevicesTable;
diff --git a/src/components/metrics/EventData.tsx b/src/components/metrics/EventData.tsx
new file mode 100644
index 000000000..48d21c573
--- /dev/null
+++ b/src/components/metrics/EventData.tsx
@@ -0,0 +1,22 @@
+import { Column, Grid, Label, Text } from '@umami/react-zen';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useEventDataQuery } from '@/components/hooks';
+
+export function EventData({ websiteId, eventId }: { websiteId: string; eventId: string }) {
+ const { data, isLoading, error } = useEventDataQuery(websiteId, eventId);
+
+ return (
+
+
+ {data?.map(({ dataKey, stringValue }) => {
+ return (
+
+ {dataKey}
+ {stringValue}
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/components/metrics/EventsChart.module.css b/src/components/metrics/EventsChart.module.css
deleted file mode 100644
index d586bead2..000000000
--- a/src/components/metrics/EventsChart.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.chart {
- display: flex;
-}
diff --git a/src/components/metrics/EventsChart.tsx b/src/components/metrics/EventsChart.tsx
index 594a69f7c..db23dcc47 100644
--- a/src/components/metrics/EventsChart.tsx
+++ b/src/components/metrics/EventsChart.tsx
@@ -1,26 +1,34 @@
-import { useMemo, useState, useEffect } from 'react';
import { colord } from 'colord';
-import BarChart from '@/components/charts/BarChart';
-import { useDateRange, useLocale, useWebsiteEventsSeries } from '@/components/hooks';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { BarChart, type BarChartProps } from '@/components/charts/BarChart';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import {
+ useDateRange,
+ useLocale,
+ useTimezone,
+ useWebsiteEventsSeriesQuery,
+} from '@/components/hooks';
import { renderDateLabels } from '@/lib/charts';
import { CHART_COLORS } from '@/lib/constants';
+import { generateTimeSeries } from '@/lib/date';
-export interface EventsChartProps {
+export interface EventsChartProps extends BarChartProps {
websiteId: string;
- className?: string;
focusLabel?: string;
+ limit?: number;
}
-export function EventsChart({ websiteId, className, focusLabel }: EventsChartProps) {
+export function EventsChart({ websiteId, focusLabel, limit }: EventsChartProps) {
+ const { timezone } = useTimezone();
const {
- dateRange: { startDate, endDate, unit, value },
- } = useDateRange(websiteId);
- const { locale } = useLocale();
- const { data, isLoading } = useWebsiteEventsSeries(websiteId);
+ dateRange: { startDate, endDate, unit },
+ } = useDateRange({ timezone: timezone });
+ const { locale, dateLocale } = useLocale();
+ const { data, isLoading, error } = useWebsiteEventsSeriesQuery(websiteId, { limit });
const [label, setLabel] = useState(focusLabel);
- const chartData = useMemo(() => {
- if (!data) return [];
+ const chartData: any = useMemo(() => {
+ if (!data) return;
const map = (data as any[]).reduce((obj, { x, t, y }) => {
if (!obj[x]) {
@@ -32,20 +40,32 @@ export function EventsChart({ websiteId, className, focusLabel }: EventsChartPro
return obj;
}, {});
- return {
- datasets: Object.keys(map).map((key, index) => {
- const color = colord(CHART_COLORS[index % CHART_COLORS.length]);
- return {
- label: key,
- data: map[key],
- lineTension: 0,
- backgroundColor: color.alpha(0.6).toRgbString(),
- borderColor: color.alpha(0.7).toRgbString(),
- borderWidth: 1,
- };
- }),
- focusLabel,
- };
+ if (!map || Object.keys(map).length === 0) {
+ return {
+ datasets: [
+ {
+ data: generateTimeSeries([], startDate, endDate, unit, dateLocale),
+ lineTension: 0,
+ borderWidth: 1,
+ },
+ ],
+ };
+ } else {
+ return {
+ datasets: Object.keys(map).map((key, index) => {
+ const color = colord(CHART_COLORS[index % CHART_COLORS.length]);
+ return {
+ label: key,
+ data: generateTimeSeries(map[key], startDate, endDate, unit, dateLocale),
+ lineTension: 0,
+ backgroundColor: color.alpha(0.6).toRgbString(),
+ borderColor: color.alpha(0.7).toRgbString(),
+ borderWidth: 1,
+ };
+ }),
+ focusLabel,
+ };
+ }
}, [data, startDate, endDate, unit, focusLabel]);
useEffect(() => {
@@ -54,19 +74,21 @@ export function EventsChart({ websiteId, className, focusLabel }: EventsChartPro
}
}, [focusLabel]);
+ const renderXLabel = useCallback(renderDateLabels(unit, locale), [unit, locale]);
+
return (
-
+
+ {chartData && (
+
+ )}
+
);
}
-
-export default EventsChart;
diff --git a/src/components/metrics/EventsTable.tsx b/src/components/metrics/EventsTable.tsx
deleted file mode 100644
index 2be6f0137..000000000
--- a/src/components/metrics/EventsTable.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import { useMessages } from '@/components/hooks';
-
-export interface EventsTableProps extends MetricsTableProps {
- onLabelClick?: (value: string) => void;
-}
-
-export function EventsTable({ onLabelClick, ...props }: EventsTableProps) {
- const { formatMessage, labels } = useMessages();
-
- const handleDataLoad = (data: any) => {
- props.onDataLoad?.(data);
- };
-
- const renderLabel = ({ x: label }) => {
- if (onLabelClick) {
- return (
- onLabelClick(label)} style={{ cursor: 'pointer' }}>
- {label}
-
- );
- }
-
- return label;
- };
-
- return (
-
- );
-}
-
-export default EventsTable;
diff --git a/src/components/metrics/FilterTags.module.css b/src/components/metrics/FilterTags.module.css
deleted file mode 100644
index ea7714f47..000000000
--- a/src/components/metrics/FilterTags.module.css
+++ /dev/null
@@ -1,60 +0,0 @@
-.filters {
- display: flex;
- align-items: center;
- gap: 10px;
- background: var(--base75);
- padding: 10px 20px;
- border: 1px solid var(--base400);
- border-radius: 8px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.label {
- font-weight: 700;
-}
-
-.tag {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 4px;
- font-size: 12px;
- background: var(--base50);
- border: 1px solid var(--base400);
- border-radius: var(--border-radius);
- box-shadow: 1px 1px 1px var(--base500);
- padding: 6px 14px;
- cursor: pointer;
-}
-
-.tag:hover {
- background: var(--base100);
-}
-
-.close {
- font-weight: 700;
- align-self: center;
- margin-left: auto;
-}
-
-.name,
-.value {
- color: var(--base700);
- font-weight: 700;
-}
-
-.operator {
- text-transform: lowercase;
- font-weight: 900;
-}
-
-.icon {
- margin-left: 10px;
- padding: 2px;
- border-radius: 100%;
-}
-
-.icon:hover {
- background: var(--base200);
-}
diff --git a/src/components/metrics/FilterTags.tsx b/src/components/metrics/FilterTags.tsx
deleted file mode 100644
index fcba3c9e0..000000000
--- a/src/components/metrics/FilterTags.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import { MouseEvent } from 'react';
-import { Button, Icon, Icons, Popup, PopupTrigger, Text } from 'react-basics';
-import {
- useDateRange,
- useFields,
- useNavigation,
- useMessages,
- useFormat,
- useFilters,
-} from '@/components/hooks';
-import PopupForm from '@/app/(main)/reports/[reportId]/PopupForm';
-import FieldFilterEditForm from '@/app/(main)/reports/[reportId]/FieldFilterEditForm';
-import { OPERATOR_PREFIXES } from '@/lib/constants';
-import { isSearchOperator, parseParameterValue } from '@/lib/params';
-import styles from './FilterTags.module.css';
-import WebsiteFilterButton from '@/app/(main)/websites/[websiteId]/WebsiteFilterButton';
-
-export function FilterTags({
- websiteId,
- params,
-}: {
- websiteId: string;
- params: { [key: string]: string };
-}) {
- const { formatMessage, labels } = useMessages();
- const { formatValue } = useFormat();
- const { dateRange } = useDateRange(websiteId);
- const {
- router,
- renderUrl,
- query: { view },
- } = useNavigation();
- const { fields } = useFields();
- const { operatorLabels } = useFilters();
- const { startDate, endDate } = dateRange;
-
- if (Object.keys(params).filter(key => params[key]).length === 0) {
- return null;
- }
-
- const handleCloseFilter = (param: string, e: MouseEvent) => {
- e.stopPropagation();
- router.push(renderUrl({ [param]: undefined }));
- };
-
- const handleResetFilter = () => {
- router.push(renderUrl({ view }, true));
- };
-
- const handleChangeFilter = (
- values: { name: string; operator: string; value: string },
- close: () => void,
- ) => {
- const { name, operator, value } = values;
- const prefix = OPERATOR_PREFIXES[operator];
-
- router.push(renderUrl({ [name]: prefix + value }));
- close();
- };
-
- return (
-
-
{formatMessage(labels.filters)}
- {Object.keys(params).map(key => {
- if (!params[key]) {
- return null;
- }
- const label = fields.find(f => f.name === key)?.label;
- const { operator, value } = parseParameterValue(params[key]);
- const paramValue = isSearchOperator(operator) ? value : formatValue(value, key);
-
- return (
-
-
- {label}
- {operatorLabels[operator]}
- {paramValue}
- handleCloseFilter(key, e)}>
-
-
-
-
- {(close: () => void) => {
- return (
-
- handleChangeFilter(values, close)}
- />
-
- );
- }}
-
-
- );
- })}
-
-
-
-
-
- {formatMessage(labels.clearAll)}
-
-
- );
-}
-
-export default FilterTags;
diff --git a/src/components/metrics/HostsTable.tsx b/src/components/metrics/HostsTable.tsx
deleted file mode 100644
index e034b9702..000000000
--- a/src/components/metrics/HostsTable.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages } from '@/components/hooks';
-import { Flexbox } from 'react-basics';
-
-export function HostsTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
-
- const renderLink = ({ x: host }) => {
- return (
-
-
-
- );
- };
-
- return (
- <>
-
- >
- );
-}
-
-export default HostsTable;
diff --git a/src/components/metrics/LanguagesTable.tsx b/src/components/metrics/LanguagesTable.tsx
deleted file mode 100644
index 3ced249ed..000000000
--- a/src/components/metrics/LanguagesTable.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import { percentFilter } from '@/lib/filters';
-import { useLocale } from '@/components/hooks';
-import { useMessages } from '@/components/hooks';
-import { useFormat } from '@/components/hooks';
-
-export function LanguagesTable({
- onDataLoad,
- ...props
-}: { onDataLoad: (data: any) => void } & MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
- const { locale } = useLocale();
- const { formatLanguage } = useFormat();
-
- const renderLabel = ({ x }) => {
- return {formatLanguage(x)}
;
- };
-
- return (
- onDataLoad?.(percentFilter(data))}
- renderLabel={renderLabel}
- searchFormattedValues={true}
- />
- );
-}
-
-export default LanguagesTable;
diff --git a/src/components/metrics/Legend.module.css b/src/components/metrics/Legend.module.css
deleted file mode 100644
index dea515f34..000000000
--- a/src/components/metrics/Legend.module.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.legend {
- display: flex;
- justify-content: center;
- flex-wrap: wrap;
- padding: 20px 0;
-}
-
-.label {
- display: flex;
- align-items: center;
- font-size: var(--font-size-sm);
- cursor: pointer;
-}
-
-.label + .label {
- margin-inline-start: 20px;
-}
-
-.hidden {
- color: var(--base400);
-}
diff --git a/src/components/metrics/Legend.tsx b/src/components/metrics/Legend.tsx
index 774429573..2fea4abc8 100644
--- a/src/components/metrics/Legend.tsx
+++ b/src/components/metrics/Legend.tsx
@@ -1,8 +1,6 @@
-import { StatusLight } from 'react-basics';
+import { Row, StatusLight, Text } from '@umami/react-zen';
+import type { LegendItem } from 'chart.js/auto';
import { colord } from 'colord';
-import classNames from 'classnames';
-import { LegendItem } from 'chart.js/auto';
-import styles from './Legend.module.css';
export function Legend({
items = [],
@@ -16,23 +14,26 @@ export function Legend({
}
return (
-
+
{items.map(item => {
const { text, fillStyle, hidden } = item;
const color = colord(fillStyle);
return (
- onClick(item)}
- >
- {text}
-
+ onClick(item)}>
+
+
+ {text}
+
+
+
);
})}
-
+
);
}
-
-export default Legend;
diff --git a/src/components/metrics/ListTable.module.css b/src/components/metrics/ListTable.module.css
deleted file mode 100644
index 405819b1c..000000000
--- a/src/components/metrics/ListTable.module.css
+++ /dev/null
@@ -1,110 +0,0 @@
-.table {
- position: relative;
- display: grid;
- grid-template-rows: fit-content(100%) auto;
- overflow: hidden;
- flex: 1;
-}
-
-.body {
- position: relative;
- height: 100%;
- overflow: auto;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- line-height: 40px;
-}
-
-.title {
- display: flex;
- font-weight: 600;
-}
-
-.metric {
- font-weight: 600;
- text-align: center;
- width: 100px;
-}
-
-.row {
- position: relative;
- height: 30px;
- line-height: 30px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 5px;
- overflow: hidden;
- border-radius: 4px;
-}
-
-.row:hover {
- background-color: var(--base75);
-}
-
-.label {
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
- flex: 2;
- padding-left: 10px;
-}
-
-.label a {
- color: inherit;
- text-decoration: none;
-}
-
-.label a:hover {
- color: var(--primary400);
-}
-
-.label:empty {
- color: #b3b3b3;
-}
-
-.label:empty:before {
- content: 'Unknown';
-}
-
-.value {
- display: flex;
- align-items: center;
- gap: 10px;
- text-align: end;
- margin-inline-end: 5px;
- font-weight: 600;
-}
-
-.percent {
- position: relative;
- width: 50px;
- color: var(--base600);
- border-inline-start: 1px solid var(--base600);
- padding-inline-start: 10px;
- z-index: 1;
-}
-
-.bar {
- position: absolute;
- top: 0;
- left: 0;
- height: 30px;
- opacity: 0.1;
- background: var(--primary400);
- z-index: -1;
-}
-
-.empty {
- min-height: 200px;
-}
-
-@media only screen and (max-width: 992px) {
- .body {
- height: auto;
- }
-}
diff --git a/src/components/metrics/ListTable.tsx b/src/components/metrics/ListTable.tsx
index f5dbbee53..f47d8ac0c 100644
--- a/src/components/metrics/ListTable.tsx
+++ b/src/components/metrics/ListTable.tsx
@@ -1,72 +1,86 @@
-import Empty from '@/components/common/Empty';
-import { useMessages } from '@/components/hooks';
-import { formatLongCurrency, formatLongNumber } from '@/lib/format';
-import { animated, config, useSpring } from '@react-spring/web';
-import classNames from 'classnames';
-import { ReactNode } from 'react';
+import { config, useSpring } from '@react-spring/web';
+import { Column, Grid, Row, Text } from '@umami/react-zen';
+import type { ReactNode } from 'react';
import { FixedSizeList } from 'react-window';
-import styles from './ListTable.module.css';
+import { AnimatedDiv } from '@/components/common/AnimatedDiv';
+import { Empty } from '@/components/common/Empty';
+import { useMessages, useMobile } from '@/components/hooks';
+import { formatLongNumber } from '@/lib/format';
const ITEM_SIZE = 30;
+interface ListData {
+ label: string;
+ count: number;
+ percent: number;
+}
+
export interface ListTableProps {
- data?: any[];
+ data?: ListData[];
title?: string;
metric?: string;
className?: string;
- renderLabel?: (row: any, index: number) => ReactNode;
- renderChange?: (row: any, index: number) => ReactNode;
+ renderLabel?: (data: ListData, index: number) => ReactNode;
+ renderChange?: (data: ListData, index: number) => ReactNode;
animate?: boolean;
virtualize?: boolean;
showPercentage?: boolean;
itemCount?: number;
- currency?: string;
+ formatCount?: (n: number) => string;
}
export function ListTable({
data = [],
title,
metric,
- className,
renderLabel,
renderChange,
animate = true,
virtualize = false,
showPercentage = true,
itemCount = 10,
- currency,
+ formatCount,
}: ListTableProps) {
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
+ const { isPhone } = useMobile();
- const getRow = (row: { x: any; y: any; z: any }, index: number) => {
- const { x: label, y: value, z: percent } = row;
+ const getRow = (row: ListData, index: number) => {
+ const { label, count, percent } = row;
return (
);
};
- const Row = ({ index, style }) => {
+ const ListTableRow = ({ index, style }) => {
return {getRow(data[index], index)}
;
};
return (
-
-
-
- {data?.length === 0 && }
+
+
+ {title}
+
+ {metric}
+
+
+
+ {data?.length === 0 && }
{virtualize && data.length > 0 ? (
- {Row}
+ {ListTableRow}
) : (
data.map(getRow)
)}
-
-
+
+
);
}
@@ -91,34 +105,55 @@ const AnimatedRow = ({
change,
animate,
showPercentage = true,
- currency,
+ formatCount,
+ isPhone,
}) => {
const props = useSpring({
width: percent,
- y: value,
+ y: !Number.isNaN(value) ? value : 0,
from: { width: 0, y: 0 },
config: animate ? config.default : { duration: 0 },
});
return (
-
-
{label}
-
+
+
+
+ {label}
+
+
+
{change}
-
- {currency
- ? props.y?.to(n => formatLongCurrency(n, currency))
- : props.y?.to(formatLongNumber)}
-
-
+
+
+ {formatCount ? props.y?.to(formatCount) : props.y?.to(formatLongNumber)}
+
+
+
{showPercentage && (
-
-
`${n}%`) }} />
- {props.width.to(n => `${n?.toFixed?.(0)}%`)}
-
+
+ {props.width.to(n => `${n?.toFixed?.(0)}%`)}
+
)}
-
+
);
};
-
-export default ListTable;
diff --git a/src/components/metrics/MetricCard.module.css b/src/components/metrics/MetricCard.module.css
deleted file mode 100644
index 93e6c6d72..000000000
--- a/src/components/metrics/MetricCard.module.css
+++ /dev/null
@@ -1,37 +0,0 @@
-.card {
- display: flex;
- flex-direction: column;
- justify-content: center;
- min-width: 150px;
-}
-
-.card.compare .change {
- font-size: 16px;
- margin: 10px 0;
-}
-
-.card:first-child {
- padding-left: 0;
-}
-
-.card:last-child {
- border: 0;
-}
-
-.value {
- font-size: 36px;
- font-weight: 700;
- white-space: nowrap;
- color: var(--base900);
- line-height: 1.5;
-}
-
-.value.prev {
- color: var(--base800);
-}
-
-.label {
- font-weight: 700;
- white-space: nowrap;
- color: var(--base800);
-}
diff --git a/src/components/metrics/MetricCard.tsx b/src/components/metrics/MetricCard.tsx
index 41766167e..24768e3f4 100644
--- a/src/components/metrics/MetricCard.tsx
+++ b/src/components/metrics/MetricCard.tsx
@@ -1,62 +1,73 @@
-import classNames from 'classnames';
-import { useSpring, animated } from '@react-spring/web';
+import { useSpring } from '@react-spring/web';
+import { Button, Column, Icon, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import type { ReactNode } from 'react';
+import { AnimatedDiv } from '@/components/common/AnimatedDiv';
+import { Info } from '@/components/icons';
+import { ChangeLabel } from '@/components/metrics/ChangeLabel';
import { formatNumber } from '@/lib/format';
-import ChangeLabel from '@/components/metrics/ChangeLabel';
-import styles from './MetricCard.module.css';
export interface MetricCardProps {
value: number;
previousValue?: number;
change?: number;
label?: string;
+ tooltip?: ReactNode;
reverseColors?: boolean;
formatValue?: (n: any) => string;
showLabel?: boolean;
showChange?: boolean;
- showPrevious?: boolean;
- className?: string;
}
export const MetricCard = ({
value = 0,
change = 0,
label,
+ tooltip,
reverseColors = false,
formatValue = formatNumber,
showLabel = true,
showChange = false,
- showPrevious = false,
- className,
}: MetricCardProps) => {
const diff = value - change;
- const pct = ((value - diff) / diff) * 100;
+ const pct = diff !== 0 ? ((value - diff) / diff) * 100 : value !== 0 ? 100 : 0;
const props = useSpring({ x: Number(value) || 0, from: { x: 0 } });
const changeProps = useSpring({ x: Number(pct) || 0, from: { x: 0 } });
- const prevProps = useSpring({ x: Number(diff) || 0, from: { x: 0 } });
return (
-
- {showLabel &&
{label}
}
-
- {props?.x?.to(x => formatValue(x))}
-
+
+ {showLabel && (
+
+
+ {label}
+
+ {tooltip && (
+
+
+
+
+
+
+ {tooltip}
+
+ )}
+
+ )}
+
+ {props?.x?.to(x => formatValue(x))}
+
{showChange && (
-
- {changeProps?.x?.to(x => `${Math.abs(~~x)}%`)}
+
+ {changeProps?.x?.to(x => `${Math.abs(~~x)}%`)}
)}
- {showPrevious && (
-
- {prevProps?.x?.to(x => formatValue(x))}
-
- )}
-
+
);
};
-
-export default MetricCard;
diff --git a/src/components/metrics/MetricLabel.tsx b/src/components/metrics/MetricLabel.tsx
new file mode 100644
index 000000000..dae5dbabf
--- /dev/null
+++ b/src/components/metrics/MetricLabel.tsx
@@ -0,0 +1,142 @@
+import { Row } from '@umami/react-zen';
+import { Favicon } from '@/components/common/Favicon';
+import { FilterLink } from '@/components/common/FilterLink';
+import { TypeIcon } from '@/components/common/TypeIcon';
+import {
+ useCountryNames,
+ useFormat,
+ useLocale,
+ useMessages,
+ useRegionNames,
+} from '@/components/hooks';
+import { GROUPED_DOMAINS } from '@/lib/constants';
+
+export interface MetricLabelProps {
+ type: string;
+ data: any;
+ onClick?: () => void;
+}
+
+export function MetricLabel({ type, data }: MetricLabelProps) {
+ const { t, labels } = useMessages();
+ const { formatValue, formatCity } = useFormat();
+ const { locale } = useLocale();
+ const { countryNames } = useCountryNames(locale);
+ const { getRegionName } = useRegionNames(locale);
+
+ const { label, country, domain } = data;
+
+ switch (type) {
+ case 'browser':
+ case 'os':
+ return (
+ }
+ />
+ );
+
+ case 'channel':
+ return t(labels[label]);
+
+ case 'city':
+ return (
+
+ )
+ }
+ />
+ );
+
+ case 'region':
+ return (
+ }
+ />
+ );
+
+ case 'country':
+ return (
+ }
+ />
+ );
+
+ case 'path':
+ case 'entry':
+ case 'exit':
+ return (
+
+ );
+
+ case 'device':
+ return (
+ }
+ />
+ );
+
+ case 'referrer':
+ return (
+ }
+ />
+ );
+
+ case 'domain':
+ if (label === 'Other') {
+ return `(${t(labels.other)})`;
+ } else {
+ const name = GROUPED_DOMAINS.find(({ domain }) => domain === label)?.name;
+
+ if (!name) {
+ return null;
+ }
+
+ return (
+
+
+ {name}
+
+ );
+ }
+
+ case 'language':
+ return formatValue(label, 'language');
+
+ default:
+ return ;
+ }
+}
diff --git a/src/components/metrics/MetricsBar.module.css b/src/components/metrics/MetricsBar.module.css
deleted file mode 100644
index dadee9ef7..000000000
--- a/src/components/metrics/MetricsBar.module.css
+++ /dev/null
@@ -1,13 +0,0 @@
-.bar {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(140px, max-content));
- gap: 20px;
- width: 100%;
- position: relative;
-}
-
-@media screen and (max-width: 768px) {
- .bar {
- grid-template-columns: 1fr 1fr;
- }
-}
diff --git a/src/components/metrics/MetricsBar.tsx b/src/components/metrics/MetricsBar.tsx
index 6e9f22de9..850c6bc9a 100644
--- a/src/components/metrics/MetricsBar.tsx
+++ b/src/components/metrics/MetricsBar.tsx
@@ -1,31 +1,14 @@
-import { ReactNode } from 'react';
-import { Loading, cloneChildren } from 'react-basics';
-import ErrorMessage from '@/components/common/ErrorMessage';
-import { formatLongNumber } from '@/lib/format';
-import styles from './MetricsBar.module.css';
+import { Grid, type GridProps } from '@umami/react-zen';
+import type { ReactNode } from 'react';
-export interface MetricsBarProps {
- isLoading?: boolean;
- isFetched?: boolean;
- error?: unknown;
+export interface MetricsBarProps extends GridProps {
children?: ReactNode;
}
-export function MetricsBar({ children, isLoading, isFetched, error }: MetricsBarProps) {
- const formatFunc = n => (n >= 0 ? formatLongNumber(n) : `-${formatLongNumber(Math.abs(n))}`);
-
+export function MetricsBar({ children, ...props }: MetricsBarProps) {
return (
-
- {isLoading && !isFetched && }
- {error && }
- {!isLoading &&
- !error &&
- isFetched &&
- cloneChildren(children, child => {
- return { format: child.props.format || formatFunc };
- })}
-
+
+ {children}
+
);
}
-
-export default MetricsBar;
diff --git a/src/components/metrics/MetricsExpandedTable.tsx b/src/components/metrics/MetricsExpandedTable.tsx
new file mode 100644
index 000000000..c4c49e75a
--- /dev/null
+++ b/src/components/metrics/MetricsExpandedTable.tsx
@@ -0,0 +1,124 @@
+import { Button, Column, DataColumn, DataTable, Icon, Row, SearchField } from '@umami/react-zen';
+import { type ReactNode, useState } from 'react';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useWebsiteExpandedMetricsQuery } from '@/components/hooks';
+import { X } from '@/components/icons';
+import { DownloadButton } from '@/components/input/DownloadButton';
+import { MetricLabel } from '@/components/metrics/MetricLabel';
+import { SESSION_COLUMNS } from '@/lib/constants';
+import { formatShortTime } from '@/lib/format';
+
+export interface MetricsExpandedTableProps {
+ websiteId: string;
+ type?: string;
+ title?: string;
+ dataFilter?: (data: any) => any;
+ onSearch?: (search: string) => void;
+ params?: { [key: string]: any };
+ allowSearch?: boolean;
+ allowDownload?: boolean;
+ renderLabel?: (row: any, index: number) => ReactNode;
+ onClose?: () => void;
+ children?: ReactNode;
+}
+
+export function MetricsExpandedTable({
+ websiteId,
+ type,
+ title,
+ params,
+ allowSearch = true,
+ allowDownload = true,
+ onClose,
+ children,
+}: MetricsExpandedTableProps) {
+ const [search, setSearch] = useState('');
+ const { t, labels } = useMessages();
+ const isType = ['browser', 'country', 'device', 'os'].includes(type);
+ const showBounceDuration = SESSION_COLUMNS.includes(type);
+
+ const { data, isLoading, isFetching, error } = useWebsiteExpandedMetricsQuery(websiteId, {
+ type,
+ search: isType ? undefined : search,
+ ...params,
+ });
+
+ const items = data?.map(({ name, ...props }) => ({ label: name, ...props }));
+
+ return (
+ <>
+
+ {allowSearch && }
+
+ {children}
+ {allowDownload && }
+ {onClose && (
+
+
+
+
+
+ )}
+
+
+
+
+ {items && (
+
+
+ {row => (
+
+
+
+ )}
+
+
+ {row => row?.visitors?.toLocaleString()}
+
+
+ {row => row?.visits?.toLocaleString()}
+
+
+ {row => row?.pageviews?.toLocaleString()}
+
+ {showBounceDuration && [
+
+ {row => {
+ const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100;
+ return `${Math.round(+n)}%`;
+ }}
+ ,
+
+
+ {row => {
+ const n = row?.totaltime / row?.visits;
+ return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`;
+ }}
+ ,
+ ]}
+
+ )}
+
+
+ >
+ );
+}
diff --git a/src/components/metrics/MetricsTable.module.css b/src/components/metrics/MetricsTable.module.css
deleted file mode 100644
index 112cf3826..000000000
--- a/src/components/metrics/MetricsTable.module.css
+++ /dev/null
@@ -1,45 +0,0 @@
-.container {
- position: relative;
- min-height: 430px;
- display: flex;
- flex-direction: column;
- flex: 1;
-}
-
-.actions {
- display: flex;
- gap: 20px;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-
-.buttons {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: 10px;
-}
-
-.footer {
- display: flex;
- justify-content: center;
-}
-
-.search {
- max-width: 300px;
-}
-
-@media only screen and (max-width: 992px) {
- .container {
- min-height: auto;
- }
-
- .actions {
- flex-direction: column;
- }
-
- .search {
- max-width: 100%;
- }
-}
diff --git a/src/components/metrics/MetricsTable.tsx b/src/components/metrics/MetricsTable.tsx
index 39ba712d6..8c94b26b4 100644
--- a/src/components/metrics/MetricsTable.tsx
+++ b/src/components/metrics/MetricsTable.tsx
@@ -1,69 +1,43 @@
-import { ReactNode, useMemo, useState } from 'react';
-import { Loading, Icon, Text, SearchField } from 'react-basics';
-import classNames from 'classnames';
-import ErrorMessage from '@/components/common/ErrorMessage';
-import LinkButton from '@/components/common/LinkButton';
-import { DEFAULT_ANIMATION_DURATION } from '@/lib/constants';
+import { Grid, Row } from '@umami/react-zen';
+import { useEffect, useMemo } from 'react';
+import { IconLabel } from '@/components/common/IconLabel';
+import { LinkButton } from '@/components/common/LinkButton';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useMessages, useNavigation, useWebsiteMetricsQuery } from '@/components/hooks';
+import { Maximize } from '@/components/icons';
+import { MetricLabel } from '@/components/metrics/MetricLabel';
import { percentFilter } from '@/lib/filters';
-import {
- useNavigation,
- useWebsiteMetrics,
- useMessages,
- useLocale,
- useFormat,
-} from '@/components/hooks';
-import Icons from '@/components/icons';
-import ListTable, { ListTableProps } from './ListTable';
-import styles from './MetricsTable.module.css';
-import { DownloadButton } from '@/components/input/DownloadButton';
+import { ListTable, type ListTableProps } from './ListTable';
export interface MetricsTableProps extends ListTableProps {
websiteId: string;
- type?: string;
- className?: string;
+ type: string;
dataFilter?: (data: any) => any;
limit?: number;
- delay?: number;
- onDataLoad?: (data: any) => void;
- onSearch?: (search: string) => void;
- allowSearch?: boolean;
- searchFormattedValues?: boolean;
showMore?: boolean;
- params?: { [key: string]: any };
- allowDownload?: boolean;
- children?: ReactNode;
+ filterLink?: boolean;
+ params?: Record;
+ onDataLoad?: (data: any) => void;
}
export function MetricsTable({
websiteId,
type,
- className,
dataFilter,
limit,
- onDataLoad,
- delay = null,
- allowSearch = false,
- searchFormattedValues = false,
- showMore = true,
+ showMore = false,
+ filterLink = true,
params,
- allowDownload = true,
- children,
+ onDataLoad,
...props
}: MetricsTableProps) {
- const [search, setSearch] = useState('');
- const { formatValue } = useFormat();
- const { renderUrl } = useNavigation();
- const { formatMessage, labels } = useMessages();
- const { dir } = useLocale();
-
- const { data, isLoading, isFetched, error } = useWebsiteMetrics(
- websiteId,
- { type, limit, search: searchFormattedValues ? undefined : search, ...params },
- {
- retryDelay: delay || DEFAULT_ANIMATION_DURATION,
- onDataLoad,
- },
- );
+ const { updateParams } = useNavigation();
+ const { t, labels } = useMessages();
+ const { data, isLoading, isFetching, error } = useWebsiteMetricsQuery(websiteId, {
+ type,
+ limit,
+ ...params,
+ });
const filteredData = useMemo(() => {
if (data) {
@@ -79,55 +53,41 @@ export function MetricsTable({
}
}
- if (searchFormattedValues && search) {
- items = items.filter(({ x, ...data }) => {
- const value = formatValue(x, type, data);
-
- return value?.toLowerCase().includes(search.toLowerCase());
- });
- }
-
items = percentFilter(items);
- return items;
+ return items.map(({ x, y, z, ...props }) => ({ label: x, count: y, percent: z, ...props }));
}
return [];
- }, [data, dataFilter, search, limit, formatValue, type]);
+ }, [data, dataFilter, limit, type]);
+
+ useEffect(() => {
+ if (data) {
+ onDataLoad?.(data);
+ }
+ }, [data]);
+
+ const renderLabel = (row: any) => {
+ return filterLink ? : row.label;
+ };
return (
-
- {error &&
}
-
- {allowSearch && (
-
+
+
+ {data && }
+ {showMore && limit && (
+
+
+ }>{t(labels.more)}
+
+
)}
-
- {children}
- {allowDownload && }
-
-
- {data && !error && (
-
- )}
- {!data && isLoading && !isFetched &&
}
-
- {showMore && data && !error && limit && (
-
- {formatMessage(labels.more)}
-
-
-
-
- )}
-
-
+
+
);
}
-
-export default MetricsTable;
diff --git a/src/components/metrics/OSTable.tsx b/src/components/metrics/OSTable.tsx
deleted file mode 100644
index 37b79549a..000000000
--- a/src/components/metrics/OSTable.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages, useFormat } from '@/components/hooks';
-import TypeIcon from '@/components/common/TypeIcon';
-
-export function OSTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
- const { formatOS } = useFormat();
-
- function renderLink({ x: os }) {
- return (
-
-
-
- );
- }
-
- return (
-
- );
-}
-
-export default OSTable;
diff --git a/src/components/metrics/PagesTable.tsx b/src/components/metrics/PagesTable.tsx
deleted file mode 100644
index 59cfda43d..000000000
--- a/src/components/metrics/PagesTable.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { WebsiteContext } from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
-import FilterButtons from '@/components/common/FilterButtons';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages, useNavigation } from '@/components/hooks';
-import { emptyFilter } from '@/lib/filters';
-import { useContext } from 'react';
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-
-export interface PagesTableProps extends MetricsTableProps {
- allowFilter?: boolean;
-}
-
-export function PagesTable({ allowFilter, ...props }: PagesTableProps) {
- const {
- router,
- renderUrl,
- query: { view = 'url' },
- } = useNavigation();
- const { formatMessage, labels } = useMessages();
- const { domain } = useContext(WebsiteContext);
-
- const handleSelect = (key: any) => {
- router.push(renderUrl({ view: key }), { scroll: false });
- };
-
- const buttons = [
- {
- label: formatMessage(labels.path),
- key: 'url',
- },
- {
- label: formatMessage(labels.entry),
- key: 'entry',
- },
- {
- label: formatMessage(labels.exit),
- key: 'exit',
- },
- {
- label: formatMessage(labels.title),
- key: 'title',
- },
- ];
-
- const renderLink = ({ x }) => {
- return (
-
- );
- };
-
- return (
-
- {allowFilter && }
-
- );
-}
-
-export default PagesTable;
diff --git a/src/components/metrics/PageviewsChart.tsx b/src/components/metrics/PageviewsChart.tsx
index 6fa3285f4..6727facaa 100644
--- a/src/components/metrics/PageviewsChart.tsx
+++ b/src/components/metrics/PageviewsChart.tsx
@@ -1,9 +1,12 @@
-import { useMemo } from 'react';
-import BarChart, { BarChartProps } from '@/components/charts/BarChart';
-import { useLocale, useTheme, useMessages } from '@/components/hooks';
+import { useTheme } from '@umami/react-zen';
+import { useCallback, useMemo } from 'react';
+import { BarChart, type BarChartProps } from '@/components/charts/BarChart';
+import { useLocale, useMessages } from '@/components/hooks';
import { renderDateLabels } from '@/lib/charts';
+import { getThemeColors } from '@/lib/colors';
+import { generateTimeSeries } from '@/lib/date';
-export interface PagepageviewsChartProps extends BarChartProps {
+export interface PageviewsChartProps extends BarChartProps {
data: {
pageviews: any[];
sessions: any[];
@@ -13,38 +16,36 @@ export interface PagepageviewsChartProps extends BarChartProps {
};
};
unit: string;
- isLoading?: boolean;
- isAllTime?: boolean;
}
-export function PagepageviewsChart({
- data,
- unit,
- isLoading,
- isAllTime,
- ...props
-}: PagepageviewsChartProps) {
- const { formatMessage, labels } = useMessages();
- const { colors } = useTheme();
- const { locale } = useLocale();
+export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: PageviewsChartProps) {
+ const { t, labels } = useMessages();
+ const { theme } = useTheme();
+ const { locale, dateLocale } = useLocale();
+ const { colors } = useMemo(() => getThemeColors(theme), [theme]);
- const chartData = useMemo(() => {
- if (!data) {
- return {};
- }
+ const chartData: any = useMemo(() => {
+ if (!data) return;
return {
+ __id: Date.now(),
datasets: [
{
- label: formatMessage(labels.visitors),
- data: data.sessions,
+ type: 'bar',
+ label: t(labels.visitors),
+ data: generateTimeSeries(data.sessions, minDate, maxDate, unit, dateLocale),
borderWidth: 1,
+ barPercentage: 0.9,
+ categoryPercentage: 0.9,
...colors.chart.visitors,
order: 3,
},
{
- label: formatMessage(labels.views),
- data: data.pageviews,
+ type: 'bar',
+ label: t(labels.views),
+ data: generateTimeSeries(data.pageviews, minDate, maxDate, unit, dateLocale),
+ barPercentage: 0.9,
+ categoryPercentage: 0.9,
borderWidth: 1,
...colors.chart.views,
order: 4,
@@ -53,8 +54,14 @@ export function PagepageviewsChart({
? [
{
type: 'line',
- label: `${formatMessage(labels.views)} (${formatMessage(labels.previous)})`,
- data: data.compare.pageviews,
+ label: `${t(labels.views)} (${t(labels.previous)})`,
+ data: generateTimeSeries(
+ data.compare.pageviews,
+ minDate,
+ maxDate,
+ unit,
+ dateLocale,
+ ),
borderWidth: 2,
backgroundColor: '#8601B0',
borderColor: '#8601B0',
@@ -62,8 +69,8 @@ export function PagepageviewsChart({
},
{
type: 'line',
- label: `${formatMessage(labels.visitors)} (${formatMessage(labels.previous)})`,
- data: data.compare.sessions,
+ label: `${t(labels.visitors)} (${t(labels.previous)})`,
+ data: generateTimeSeries(data.compare.sessions, minDate, maxDate, unit, dateLocale),
borderWidth: 2,
backgroundColor: '#f15bb5',
borderColor: '#f15bb5',
@@ -75,16 +82,17 @@ export function PagepageviewsChart({
};
}, [data, locale]);
+ const renderXLabel = useCallback(renderDateLabels(unit, locale), [unit, locale]);
+
return (
);
}
-
-export default PagepageviewsChart;
diff --git a/src/components/metrics/PerformanceCard.module.css b/src/components/metrics/PerformanceCard.module.css
new file mode 100644
index 000000000..9e0d1f296
--- /dev/null
+++ b/src/components/metrics/PerformanceCard.module.css
@@ -0,0 +1,12 @@
+.card {
+ transition: box-shadow 0.2s ease;
+}
+
+.card:hover {
+ box-shadow: 0 0 0 1px var(--text-primary);
+}
+
+.card.selected {
+ box-shadow: 0 0 0 1px var(--text-primary);
+}
+
diff --git a/src/components/metrics/PerformanceCard.tsx b/src/components/metrics/PerformanceCard.tsx
new file mode 100644
index 000000000..6a6345aaa
--- /dev/null
+++ b/src/components/metrics/PerformanceCard.tsx
@@ -0,0 +1,77 @@
+import { config, useSpring } from '@react-spring/web';
+import { Column, Text } from '@umami/react-zen';
+import { useRef } from 'react';
+import { AnimatedDiv } from '@/components/common/AnimatedDiv';
+import { Badge } from '@/components/common/Badge';
+import { useMessages } from '@/components/hooks';
+import { WEB_VITALS_THRESHOLDS } from '@/lib/constants';
+import { formatNumber } from '@/lib/format';
+import styles from './PerformanceCard.module.css';
+
+export interface PerformanceCardProps {
+ metric: 'lcp' | 'inp' | 'cls' | 'fcp' | 'ttfb';
+ value: number;
+ label: string;
+ formatValue?: (n: any) => string;
+ onClick?: () => void;
+ selected?: boolean;
+}
+
+const RATING_VARIANTS = {
+ good: 'good',
+ 'needs-improvement': 'warning',
+ poor: 'danger',
+} as const;
+
+function getRating(metric: string, value: number): 'good' | 'needs-improvement' | 'poor' {
+ const threshold = WEB_VITALS_THRESHOLDS[metric as keyof typeof WEB_VITALS_THRESHOLDS];
+ if (!threshold || value <= 0) return 'good';
+ if (value <= threshold.good) return 'good';
+ if (value <= threshold.poor) return 'needs-improvement';
+ return 'poor';
+}
+
+export const PerformanceCard = ({
+ metric,
+ value = 0,
+ label,
+ formatValue = formatNumber,
+ onClick,
+ selected = false,
+}: PerformanceCardProps) => {
+ const { t, labels } = useMessages();
+ const rating = getRating(metric, value);
+ const prevMetricRef = useRef(metric);
+ const metricChanged = prevMetricRef.current !== metric;
+ if (metricChanged) prevMetricRef.current = metric;
+
+ const spring = useSpring({
+ value: !Number.isNaN(value) ? value : 0,
+ config: metricChanged ? { duration: 0 } : config.default,
+ });
+
+ return (
+
+
+ {label}
+
+
+ {spring.value.to(n => formatValue(n))}
+
+
+ {t(labels[rating === 'needs-improvement' ? 'needsImprovement' : rating])}
+
+
+ );
+};
diff --git a/src/components/metrics/QueryParametersTable.module.css b/src/components/metrics/QueryParametersTable.module.css
deleted file mode 100644
index 47b20a90c..000000000
--- a/src/components/metrics/QueryParametersTable.module.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.item {
- display: inline-flex;
- align-items: center;
- line-height: 26px;
-}
-
-.param {
- padding: 0 8px;
- color: var(--primary400);
- background: var(--blue100);
- border-radius: 4px;
-}
-
-.value {
- padding: 0 8px;
-}
diff --git a/src/components/metrics/QueryParametersTable.tsx b/src/components/metrics/QueryParametersTable.tsx
deleted file mode 100644
index 26f01faf4..000000000
--- a/src/components/metrics/QueryParametersTable.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { useState } from 'react';
-import FilterButtons from '@/components/common/FilterButtons';
-import { emptyFilter, paramFilter } from '@/lib/filters';
-import { FILTER_RAW, FILTER_COMBINED } from '@/lib/constants';
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import { useMessages } from '@/components/hooks';
-import styles from './QueryParametersTable.module.css';
-
-const filters = {
- [FILTER_RAW]: emptyFilter,
- [FILTER_COMBINED]: [emptyFilter, paramFilter],
-};
-
-export function QueryParametersTable({
- allowFilter,
- ...props
-}: { allowFilter: boolean } & MetricsTableProps) {
- const [filter, setFilter] = useState(FILTER_COMBINED);
- const { formatMessage, labels } = useMessages();
-
- const buttons = [
- {
- label: formatMessage(labels.filterCombined),
- key: FILTER_COMBINED,
- },
- { label: formatMessage(labels.filterRaw), key: FILTER_RAW },
- ];
-
- return (
-
- filter === FILTER_RAW ? (
- x
- ) : (
-
- )
- }
- delay={0}
- >
- {allowFilter && }
-
- );
-}
-
-export default QueryParametersTable;
diff --git a/src/components/metrics/RealtimeChart.tsx b/src/components/metrics/RealtimeChart.tsx
index f5697caa1..f42b96da2 100644
--- a/src/components/metrics/RealtimeChart.tsx
+++ b/src/components/metrics/RealtimeChart.tsx
@@ -1,8 +1,9 @@
+import { isBefore, startOfMinute, subMinutes } from 'date-fns';
import { useMemo, useRef } from 'react';
-import { startOfMinute, subMinutes, isBefore } from 'date-fns';
-import PageviewsChart from './PageviewsChart';
+import { useTimezone } from '@/components/hooks';
import { DEFAULT_ANIMATION_DURATION, REALTIME_RANGE } from '@/lib/constants';
-import { RealtimeData } from '@/lib/types';
+import type { RealtimeData } from '@/lib/types';
+import { PageviewsChart } from './PageviewsChart';
export interface RealtimeChartProps {
data: RealtimeData;
@@ -11,9 +12,11 @@ export interface RealtimeChartProps {
}
export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) {
+ const { formatSeriesTimezone, fromUtc, timezone } = useTimezone();
const endDate = startOfMinute(new Date());
const startDate = subMinutes(endDate, REALTIME_RANGE);
const prevEndDate = useRef(endDate);
+ const prevData = useRef(null);
const chartData = useMemo(() => {
if (!data) {
@@ -21,30 +24,36 @@ export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) {
}
return {
- pageviews: data.series.views,
- sessions: data.series.visitors,
+ pageviews: formatSeriesTimezone(data.series.views, 'x', timezone),
+ sessions: formatSeriesTimezone(data.series.visitors, 'x', timezone),
};
}, [data, startDate, endDate, unit]);
- // Don't animate the bars shifting over because it looks weird
const animationDuration = useMemo(() => {
+ // Don't animate the bars shifting over because it looks weird
if (isBefore(prevEndDate.current, endDate)) {
prevEndDate.current = endDate;
return 0;
}
+
+ // Don't animate when data hasn't changed
+ const serialized = JSON.stringify(chartData);
+ if (prevData.current === serialized) {
+ return 0;
+ }
+ prevData.current = serialized;
+
return DEFAULT_ANIMATION_DURATION;
- }, [endDate]);
+ }, [endDate, chartData]);
return (
);
}
-
-export default RealtimeChart;
diff --git a/src/components/metrics/ReferrersTable.tsx b/src/components/metrics/ReferrersTable.tsx
deleted file mode 100644
index 89729418c..000000000
--- a/src/components/metrics/ReferrersTable.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import FilterLink from '@/components/common/FilterLink';
-import Favicon from '@/components/common/Favicon';
-import { useMessages, useNavigation } from '@/components/hooks';
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import FilterButtons from '@/components/common/FilterButtons';
-import thenby from 'thenby';
-import { GROUPED_DOMAINS } from '@/lib/constants';
-import { Flexbox } from 'react-basics';
-
-export interface ReferrersTableProps extends MetricsTableProps {
- allowFilter?: boolean;
-}
-
-export function ReferrersTable({ allowFilter, ...props }: ReferrersTableProps) {
- const {
- router,
- renderUrl,
- query: { view = 'referrer' },
- } = useNavigation();
- const { formatMessage, labels } = useMessages();
-
- const handleSelect = (key: any) => {
- router.push(renderUrl({ view: key }), { scroll: false });
- };
-
- const buttons = [
- {
- label: formatMessage(labels.domain),
- key: 'referrer',
- },
- {
- label: formatMessage(labels.grouped),
- key: 'grouped',
- },
- ];
-
- const renderLink = ({ x: referrer }) => {
- if (view === 'grouped') {
- if (referrer === '_other') {
- return `(${formatMessage(labels.other)})`;
- } else {
- return (
-
-
- {GROUPED_DOMAINS.find(({ domain }) => domain === referrer)?.name}
-
- );
- }
- }
-
- return (
-
-
-
- );
- };
-
- const getDomain = (x: string) => {
- for (const { domain, match } of GROUPED_DOMAINS) {
- if (Array.isArray(match) ? match.some(str => x.includes(str)) : x.includes(match)) {
- return domain;
- }
- }
- return '_other';
- };
-
- const groupedFilter = (data: any[]) => {
- const groups = { _other: 0 };
-
- for (const { x, y } of data) {
- const domain = getDomain(x);
- if (!groups[domain]) {
- groups[domain] = 0;
- }
- groups[domain] += +y;
- }
-
- return Object.keys(groups)
- .map((key: any) => ({ x: key, y: groups[key] }))
- .sort(thenby.firstBy('y', -1));
- };
-
- return (
- <>
-
- {allowFilter && (
-
- )}
-
- >
- );
-}
-
-export default ReferrersTable;
diff --git a/src/components/metrics/RegionsTable.tsx b/src/components/metrics/RegionsTable.tsx
deleted file mode 100644
index 0b7e3bdfa..000000000
--- a/src/components/metrics/RegionsTable.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import FilterLink from '@/components/common/FilterLink';
-import { emptyFilter } from '@/lib/filters';
-import { useMessages, useLocale, useRegionNames } from '@/components/hooks';
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import TypeIcon from '@/components/common/TypeIcon';
-
-export function RegionsTable(props: MetricsTableProps) {
- const { locale } = useLocale();
- const { formatMessage, labels } = useMessages();
- const { getRegionName } = useRegionNames(locale);
-
- const renderLink = ({ x: code, country }) => {
- return (
-
-
-
- );
- };
-
- return (
-
- );
-}
-
-export default RegionsTable;
diff --git a/src/components/metrics/RevenueChart.tsx b/src/components/metrics/RevenueChart.tsx
new file mode 100644
index 000000000..bed54706b
--- /dev/null
+++ b/src/components/metrics/RevenueChart.tsx
@@ -0,0 +1,60 @@
+import { colord } from 'colord';
+import { useCallback, useMemo } from 'react';
+import { BarChart } from '@/components/charts/BarChart';
+import { useLocale } from '@/components/hooks';
+import { renderDateLabels } from '@/lib/charts';
+import { CHART_COLORS } from '@/lib/constants';
+import { generateTimeSeries } from '@/lib/date';
+
+export interface RevenueChartProps {
+ data: { x: string; t: string; y: number; count: number }[];
+ unit: string;
+ minDate: Date;
+ maxDate: Date;
+ currency: string;
+}
+
+export function RevenueChart({ data, unit, minDate, maxDate, currency }: RevenueChartProps) {
+ const { locale, dateLocale } = useLocale();
+
+ const chartData: any = useMemo(() => {
+ if (!data?.length) return { datasets: [] };
+
+ const map = data.reduce(
+ (obj, { x, t, y }) => {
+ if (!obj[x]) obj[x] = [];
+ obj[x].push({ x: t, y });
+ return obj;
+ },
+ {} as Record,
+ );
+
+ return {
+ datasets: Object.keys(map).map((key, index) => {
+ const color = colord(CHART_COLORS[index % CHART_COLORS.length]);
+ return {
+ label: key,
+ data: generateTimeSeries(map[key], minDate, maxDate, unit, dateLocale),
+ backgroundColor: color.alpha(0.6).toRgbString(),
+ borderColor: color.alpha(0.7).toRgbString(),
+ borderWidth: 1,
+ };
+ }),
+ };
+ }, [data, minDate, maxDate, unit, dateLocale]);
+
+ const renderXLabel = useCallback(renderDateLabels(unit, locale), [unit, locale]);
+
+ return (
+
+ );
+}
diff --git a/src/components/metrics/ScreenTable.tsx b/src/components/metrics/ScreenTable.tsx
deleted file mode 100644
index c2a19caae..000000000
--- a/src/components/metrics/ScreenTable.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import { useMessages } from '@/components/hooks';
-
-export function ScreenTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
-
- return (
-
- );
-}
-
-export default ScreenTable;
diff --git a/src/components/metrics/TagsTable.tsx b/src/components/metrics/TagsTable.tsx
deleted file mode 100644
index e915f8735..000000000
--- a/src/components/metrics/TagsTable.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import MetricsTable, { MetricsTableProps } from './MetricsTable';
-import FilterLink from '@/components/common/FilterLink';
-import { useMessages } from '@/components/hooks';
-import { Flexbox } from 'react-basics';
-
-export function TagsTable(props: MetricsTableProps) {
- const { formatMessage, labels } = useMessages();
-
- const renderLink = ({ x: tag }) => {
- return (
-
-
-
- );
- };
-
- return (
- <>
-
- >
- );
-}
-
-export default TagsTable;
diff --git a/src/components/metrics/WeeklyTraffic.tsx b/src/components/metrics/WeeklyTraffic.tsx
new file mode 100644
index 000000000..7db54eddf
--- /dev/null
+++ b/src/components/metrics/WeeklyTraffic.tsx
@@ -0,0 +1,117 @@
+import { Focusable, Grid, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
+import { addHours, format, startOfDay } from 'date-fns';
+import { LoadingPanel } from '@/components/common/LoadingPanel';
+import { useLocale, useMessages, useWeeklyTrafficQuery } from '@/components/hooks';
+import { getDayOfWeekAsDate } from '@/lib/date';
+
+export function WeeklyTraffic({ websiteId }: { websiteId: string }) {
+ const { data, isLoading, error } = useWeeklyTrafficQuery(websiteId);
+ const { dateLocale } = useLocale();
+ const { labels, t } = useMessages();
+ const { weekStartsOn } = dateLocale.options;
+ const daysOfWeek = Array(7)
+ .fill(weekStartsOn)
+ .map((d, i) => (d + i) % 7);
+
+ const [, max = 1] = data
+ ? data.reduce((arr: number[], hours: number[], index: number) => {
+ const min = Math.min(...hours);
+ const max = Math.max(...hours);
+
+ if (index === 0) {
+ return [min, max];
+ }
+
+ if (min < arr[0]) {
+ arr[0] = min;
+ }
+
+ if (max > arr[1]) {
+ arr[1] = max;
+ }
+
+ return arr;
+ }, [])
+ : [];
+
+ return (
+
+
+ {data && (
+ <>
+
+ {daysOfWeek.map((index: number) => (
+
+
+ {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })}
+
+
+ ))}
+
+ {Array(24)
+ .fill(null)
+ .map((_, i) => {
+ const label = format(addHours(startOfDay(new Date()), i), 'haaa', {
+ locale: dateLocale,
+ });
+ return (
+
+
+ {label}
+
+
+ );
+ })}
+
+ {daysOfWeek.map((index: number) => {
+ const day = data[index];
+ return (
+
+ {day?.map((count: number, j) => {
+ const pct = max ? count / max : 0;
+ return (
+
+
+
+
+
+
+
+ {`${t(labels.visitors)}: ${count}`}
+
+
+ );
+ })}
+
+ );
+ })}
+ >
+ )}
+
+
+ );
+}
diff --git a/src/components/metrics/WorldMap.module.css b/src/components/metrics/WorldMap.module.css
deleted file mode 100644
index c25280382..000000000
--- a/src/components/metrics/WorldMap.module.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.container {
- overflow: hidden;
- position: relative;
-}
diff --git a/src/components/metrics/WorldMap.tsx b/src/components/metrics/WorldMap.tsx
index a377bfc9a..9601b7b20 100644
--- a/src/components/metrics/WorldMap.tsx
+++ b/src/components/metrics/WorldMap.tsx
@@ -1,42 +1,37 @@
-import { useState, useMemo, HTMLAttributes } from 'react';
-import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps';
-import classNames from 'classnames';
+import { Box, Column, type ColumnProps, FloatingTooltip, Text, useTheme } from '@umami/react-zen';
import { colord } from 'colord';
-import HoverTooltip from '@/components/common/HoverTooltip';
+import { useMemo, useState } from 'react';
+import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps';
+import {
+ useCountryNames,
+ useLocale,
+ useMessages,
+ useWebsiteMetricsQuery,
+} from '@/components/hooks';
+import { getThemeColors } from '@/lib/colors';
import { ISO_COUNTRIES, MAP_FILE } from '@/lib/constants';
-import { useDateRange, useTheme, useWebsiteMetrics } from '@/components/hooks';
-import { useCountryNames } from '@/components/hooks';
-import { useLocale } from '@/components/hooks';
-import { useMessages } from '@/components/hooks';
-import { formatLongNumber } from '@/lib/format';
import { percentFilter } from '@/lib/filters';
-import styles from './WorldMap.module.css';
+import { formatLongNumber } from '@/lib/format';
-export function WorldMap({
- websiteId,
- data,
- className,
- ...props
-}: {
+export interface WorldMapProps extends ColumnProps {
websiteId?: string;
data?: any[];
- className?: string;
-} & HTMLAttributes) {
+}
+
+export function WorldMap({ websiteId, data, ...props }: WorldMapProps) {
const [tooltip, setTooltipPopup] = useState();
- const { theme, colors } = useTheme();
+ const { theme } = useTheme();
+ const { colors } = getThemeColors(theme);
const { locale } = useLocale();
- const { formatMessage, labels } = useMessages();
+ const { t, labels } = useMessages();
const { countryNames } = useCountryNames(locale);
- const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale);
- const unknownLabel = formatMessage(labels.unknown);
- const {
- dateRange: { startDate, endDate },
- } = useDateRange(websiteId);
- const { data: mapData } = useWebsiteMetrics(websiteId, {
+ const visitorsLabel = t(labels.visitors).toLocaleLowerCase(locale);
+ const unknownLabel = t(labels.unknown);
+
+ const { data: mapData } = useWebsiteMetricsQuery(websiteId, {
type: 'country',
- startAt: +startDate,
- endAt: +endDate,
});
+
const metrics = useMemo(
() => (data || mapData ? percentFilter((data || mapData) as any[]) : []),
[data, mapData],
@@ -70,11 +65,11 @@ export function WorldMap({
};
return (
-
@@ -104,9 +99,17 @@ export function WorldMap({
- {tooltip && {tooltip} }
-
+ {tooltip && (
+
+
+ {tooltip}
+
+
+ )}
+
);
}
-
-export default WorldMap;
diff --git a/src/components/share/SimpleShareCreateForm.tsx b/src/components/share/SimpleShareCreateForm.tsx
new file mode 100644
index 000000000..9ab850bcb
--- /dev/null
+++ b/src/components/share/SimpleShareCreateForm.tsx
@@ -0,0 +1,57 @@
+import { Button, Column, Form, FormField, FormSubmitButton, Row, TextField } from '@umami/react-zen';
+import { useState } from 'react';
+import { useApi, useMessages, useModified } from '@/components/hooks';
+
+export function SimpleShareCreateForm({
+ createPath,
+ onSave,
+ onCancel,
+}: {
+ createPath: string;
+ onSave?: () => void;
+ onCancel?: () => void;
+}) {
+ const { post } = useApi();
+ const { touch } = useModified();
+ const { t, labels, getErrorMessage } = useMessages();
+ const [isPending, setIsPending] = useState(false);
+ const [error, setError] = useState(null);
+
+ const handleSubmit = async (data: { name: string }) => {
+ setIsPending(true);
+ setError(null);
+
+ try {
+ await post(createPath, {
+ name: data.name,
+ });
+
+ touch('shares');
+ onSave?.();
+ } catch (e) {
+ setError(e);
+ } finally {
+ setIsPending(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/src/components/share/SimpleShareEditButton.tsx b/src/components/share/SimpleShareEditButton.tsx
new file mode 100644
index 000000000..eb56fda4d
--- /dev/null
+++ b/src/components/share/SimpleShareEditButton.tsx
@@ -0,0 +1,14 @@
+import { useMessages } from '@/components/hooks';
+import { Edit } from '@/components/icons';
+import { DialogButton } from '@/components/input/DialogButton';
+import { SimpleShareEditForm } from './SimpleShareEditForm';
+
+export function SimpleShareEditButton({ shareId }: { shareId: string }) {
+ const { t, labels } = useMessages();
+
+ return (
+ } title={t(labels.share)} variant="quiet" width="600px">
+ {({ close }) => }
+
+ );
+}
diff --git a/src/components/share/SimpleShareEditForm.tsx b/src/components/share/SimpleShareEditForm.tsx
new file mode 100644
index 000000000..3c83fed52
--- /dev/null
+++ b/src/components/share/SimpleShareEditForm.tsx
@@ -0,0 +1,104 @@
+import {
+ Button,
+ Column,
+ Form,
+ FormField,
+ FormSubmitButton,
+ Label,
+ Loading,
+ Row,
+ TextField,
+} from '@umami/react-zen';
+import { useEffect, useState } from 'react';
+import { useApi, useConfig, useMessages, useModified } from '@/components/hooks';
+
+export function SimpleShareEditForm({
+ shareId,
+ onSave,
+ onClose,
+}: {
+ shareId: string;
+ onSave?: () => void;
+ onClose?: () => void;
+}) {
+ const { t, labels, getErrorMessage } = useMessages();
+ const config = useConfig();
+ const { get, post } = useApi();
+ const { touch } = useModified();
+ const { modified } = useModified('shares');
+ const [share, setShare] = useState(null);
+ const [isLoading, setIsLoading] = useState(true);
+ const [isPending, setIsPending] = useState(false);
+ const [error, setError] = useState(null);
+
+ const getUrl = (slug: string) => {
+ return `${config?.cloudMode ? process.env.cloudUrl : window?.location.origin}${process.env.basePath || ''}/share/${slug}`;
+ };
+
+ useEffect(() => {
+ const loadShare = async () => {
+ setIsLoading(true);
+ try {
+ const data = await get(`/share/id/${shareId}`);
+ setShare(data);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ loadShare();
+ }, [get, modified, shareId]);
+
+ const handleSubmit = async (data: { name: string }) => {
+ setIsPending(true);
+ setError(null);
+
+ try {
+ await post(`/share/id/${shareId}`, {
+ name: data.name,
+ slug: share.slug,
+ parameters: share.parameters || {},
+ });
+
+ touch('shares');
+ onSave?.();
+ onClose?.();
+ } catch (e) {
+ setError(e);
+ } finally {
+ setIsPending(false);
+ }
+ };
+
+ if (isLoading) {
+ return ;
+ }
+
+ return (
+
+ );
+}
diff --git a/src/components/share/SimpleSharesTable.tsx b/src/components/share/SimpleSharesTable.tsx
new file mode 100644
index 000000000..13313f7b9
--- /dev/null
+++ b/src/components/share/SimpleSharesTable.tsx
@@ -0,0 +1,51 @@
+import { ShareDeleteButton } from '@/app/(main)/websites/[websiteId]/settings/ShareDeleteButton';
+import { CopyButton } from '@/components/common/CopyButton';
+import { ExternalLink } from '@/components/common/ExternalLink';
+import { useConfig, useMessages, useMobile } from '@/components/hooks';
+import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen';
+import { SimpleShareEditButton } from './SimpleShareEditButton';
+
+export function SimpleSharesTable(props: DataTableProps) {
+ const { t, labels } = useMessages();
+ const config = useConfig();
+ const cloudMode = config?.cloudMode;
+ const { isMobile } = useMobile();
+
+ const getUrl = (slug: string) => {
+ if (cloudMode) {
+ return `${process.env.cloudUrl}/share/${slug}`;
+ }
+
+ return `${window?.location.origin}${process.env.basePath || ''}/share/${slug}`;
+ };
+
+ return (
+
+
+ {({ name }: any) => name}
+
+
+ {({ slug }: any) => {
+ const url = getUrl(slug);
+
+ return (
+
+
+ {isMobile ? slug : url}
+
+
+
+ );
+ }}
+
+
+ {({ id, slug }: any) => (
+
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/components/svg/AddUser.tsx b/src/components/svg/AddUser.tsx
new file mode 100644
index 000000000..d1eb50956
--- /dev/null
+++ b/src/components/svg/AddUser.tsx
@@ -0,0 +1,16 @@
+import type { SVGProps } from 'react';
+
+const SvgAddUser = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgAddUser;
diff --git a/src/components/svg/BarChart.tsx b/src/components/svg/BarChart.tsx
new file mode 100644
index 000000000..85f12452c
--- /dev/null
+++ b/src/components/svg/BarChart.tsx
@@ -0,0 +1,8 @@
+import { memo, type SVGProps } from 'react';
+
+const SvgBarChart = memo((props: SVGProps) => (
+
+
+
+));
+export default SvgBarChart;
diff --git a/src/components/svg/Bars.tsx b/src/components/svg/Bars.tsx
new file mode 100644
index 000000000..1ce88f724
--- /dev/null
+++ b/src/components/svg/Bars.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgBars = (props: SVGProps) => (
+
+
+
+);
+export default SvgBars;
diff --git a/src/components/svg/Bolt.tsx b/src/components/svg/Bolt.tsx
new file mode 100644
index 000000000..23b1e76b5
--- /dev/null
+++ b/src/components/svg/Bolt.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgBolt = (props: SVGProps) => (
+
+
+
+);
+export default SvgBolt;
diff --git a/src/components/svg/Bookmark.tsx b/src/components/svg/Bookmark.tsx
new file mode 100644
index 000000000..089f61fe2
--- /dev/null
+++ b/src/components/svg/Bookmark.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgBookmark = (props: SVGProps) => (
+
+
+
+);
+export default SvgBookmark;
diff --git a/src/components/svg/Calendar.tsx b/src/components/svg/Calendar.tsx
new file mode 100644
index 000000000..dfb848a9c
--- /dev/null
+++ b/src/components/svg/Calendar.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgCalendar = (props: SVGProps) => (
+
+
+
+);
+export default SvgCalendar;
diff --git a/src/components/svg/Change.tsx b/src/components/svg/Change.tsx
new file mode 100644
index 000000000..935a2f7a8
--- /dev/null
+++ b/src/components/svg/Change.tsx
@@ -0,0 +1,13 @@
+import type { SVGProps } from 'react';
+
+const SvgChange = (props: SVGProps) => (
+
+
+
+);
+export default SvgChange;
diff --git a/src/components/svg/Clock.tsx b/src/components/svg/Clock.tsx
new file mode 100644
index 000000000..2dfa6a6ee
--- /dev/null
+++ b/src/components/svg/Clock.tsx
@@ -0,0 +1,12 @@
+import type { SVGProps } from 'react';
+
+const SvgClock = (props: SVGProps) => (
+
+
+
+
+
+
+
+);
+export default SvgClock;
diff --git a/src/components/svg/Compare.tsx b/src/components/svg/Compare.tsx
new file mode 100644
index 000000000..3434461a3
--- /dev/null
+++ b/src/components/svg/Compare.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgCompare = (props: SVGProps) => (
+
+
+
+);
+export default SvgCompare;
diff --git a/src/components/svg/Dashboard.tsx b/src/components/svg/Dashboard.tsx
new file mode 100644
index 000000000..5696244fd
--- /dev/null
+++ b/src/components/svg/Dashboard.tsx
@@ -0,0 +1,21 @@
+import type { SVGProps } from 'react';
+
+const SvgDashboard = (props: SVGProps) => (
+
+
+
+
+
+
+);
+export default SvgDashboard;
diff --git a/src/components/svg/Download.tsx b/src/components/svg/Download.tsx
new file mode 100644
index 000000000..5f58724cc
--- /dev/null
+++ b/src/components/svg/Download.tsx
@@ -0,0 +1,9 @@
+import type { SVGProps } from 'react';
+
+const SvgDownload = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgDownload;
diff --git a/src/components/svg/Expand.tsx b/src/components/svg/Expand.tsx
new file mode 100644
index 000000000..a0f472e57
--- /dev/null
+++ b/src/components/svg/Expand.tsx
@@ -0,0 +1,18 @@
+import type { SVGProps } from 'react';
+
+const SvgExpand = (props: SVGProps) => (
+
+
+
+);
+export default SvgExpand;
diff --git a/src/components/svg/Export.tsx b/src/components/svg/Export.tsx
new file mode 100644
index 000000000..5c1ef14dc
--- /dev/null
+++ b/src/components/svg/Export.tsx
@@ -0,0 +1,12 @@
+import type { SVGProps } from 'react';
+
+const SvgExport = (props: SVGProps) => (
+
+
+
+
+
+
+
+);
+export default SvgExport;
diff --git a/src/components/svg/Flag.tsx b/src/components/svg/Flag.tsx
new file mode 100644
index 000000000..34af943a9
--- /dev/null
+++ b/src/components/svg/Flag.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgFlag = (props: SVGProps) => (
+
+
+
+);
+export default SvgFlag;
diff --git a/src/components/svg/Funnel.tsx b/src/components/svg/Funnel.tsx
new file mode 100644
index 000000000..63cf47d7b
--- /dev/null
+++ b/src/components/svg/Funnel.tsx
@@ -0,0 +1,18 @@
+import type { SVGProps } from 'react';
+
+const SvgFunnel = (props: SVGProps) => (
+
+
+
+
+
+
+);
+export default SvgFunnel;
diff --git a/src/components/svg/Gauge.tsx b/src/components/svg/Gauge.tsx
new file mode 100644
index 000000000..38933993c
--- /dev/null
+++ b/src/components/svg/Gauge.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgGauge = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgGauge;
diff --git a/src/components/svg/Gear.tsx b/src/components/svg/Gear.tsx
new file mode 100644
index 000000000..539b838c9
--- /dev/null
+++ b/src/components/svg/Gear.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgGear = (props: SVGProps) => (
+
+
+
+);
+export default SvgGear;
diff --git a/src/components/svg/Globe.tsx b/src/components/svg/Globe.tsx
new file mode 100644
index 000000000..385017d40
--- /dev/null
+++ b/src/components/svg/Globe.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgGlobe = (props: SVGProps) => (
+
+
+
+);
+export default SvgGlobe;
diff --git a/src/components/svg/Lightbulb.tsx b/src/components/svg/Lightbulb.tsx
new file mode 100644
index 000000000..8d86170e2
--- /dev/null
+++ b/src/components/svg/Lightbulb.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgLightbulb = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgLightbulb;
diff --git a/src/components/svg/Lightning.tsx b/src/components/svg/Lightning.tsx
new file mode 100644
index 000000000..9539a9614
--- /dev/null
+++ b/src/components/svg/Lightning.tsx
@@ -0,0 +1,33 @@
+import type { SVGProps } from 'react';
+
+const SvgLightning = (props: SVGProps) => (
+
+
+
+
+
+
+
+
+
+
+);
+export default SvgLightning;
diff --git a/src/components/svg/Link.tsx b/src/components/svg/Link.tsx
new file mode 100644
index 000000000..4ce88e78b
--- /dev/null
+++ b/src/components/svg/Link.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgLink = (props: SVGProps) => (
+
+
+
+);
+export default SvgLink;
diff --git a/src/components/svg/Location.tsx b/src/components/svg/Location.tsx
new file mode 100644
index 000000000..0fd7d165f
--- /dev/null
+++ b/src/components/svg/Location.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgLocation = (props: SVGProps) => (
+
+
+
+);
+export default SvgLocation;
diff --git a/src/components/svg/Lock.tsx b/src/components/svg/Lock.tsx
new file mode 100644
index 000000000..2b62eb9e0
--- /dev/null
+++ b/src/components/svg/Lock.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgLock = (props: SVGProps) => (
+
+
+
+);
+export default SvgLock;
diff --git a/src/components/svg/Logo.tsx b/src/components/svg/Logo.tsx
new file mode 100644
index 000000000..eb9fdf5bb
--- /dev/null
+++ b/src/components/svg/Logo.tsx
@@ -0,0 +1,17 @@
+import type { SVGProps } from 'react';
+
+const SvgLogo = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgLogo;
diff --git a/src/components/svg/LogoWhite.tsx b/src/components/svg/LogoWhite.tsx
new file mode 100644
index 000000000..fb8c5f9bb
--- /dev/null
+++ b/src/components/svg/LogoWhite.tsx
@@ -0,0 +1,26 @@
+import type { SVGProps } from 'react';
+
+const SvgLogoWhite = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgLogoWhite;
diff --git a/src/components/svg/Magnet.tsx b/src/components/svg/Magnet.tsx
new file mode 100644
index 000000000..88b0f03ae
--- /dev/null
+++ b/src/components/svg/Magnet.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgMagnet = (props: SVGProps) => (
+
+
+
+);
+export default SvgMagnet;
diff --git a/src/components/svg/Money.tsx b/src/components/svg/Money.tsx
new file mode 100644
index 000000000..7d7b1e562
--- /dev/null
+++ b/src/components/svg/Money.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgMoney = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgMoney;
diff --git a/src/components/svg/Moon.tsx b/src/components/svg/Moon.tsx
new file mode 100644
index 000000000..40e3e8b98
--- /dev/null
+++ b/src/components/svg/Moon.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgMoon = (props: SVGProps) => (
+
+
+
+);
+export default SvgMoon;
diff --git a/src/components/svg/Network.tsx b/src/components/svg/Network.tsx
new file mode 100644
index 000000000..15941a99f
--- /dev/null
+++ b/src/components/svg/Network.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgNetwork = (props: SVGProps) => (
+
+
+
+);
+export default SvgNetwork;
diff --git a/src/components/svg/Nodes.tsx b/src/components/svg/Nodes.tsx
new file mode 100644
index 000000000..1adfcb84e
--- /dev/null
+++ b/src/components/svg/Nodes.tsx
@@ -0,0 +1,12 @@
+import type { SVGProps } from 'react';
+
+const SvgNodes = (props: SVGProps) => (
+
+
+
+);
+export default SvgNodes;
diff --git a/src/components/svg/Overview.tsx b/src/components/svg/Overview.tsx
new file mode 100644
index 000000000..67e6af146
--- /dev/null
+++ b/src/components/svg/Overview.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgOverview = (props: SVGProps) => (
+
+
+
+);
+export default SvgOverview;
diff --git a/src/components/svg/Path.tsx b/src/components/svg/Path.tsx
new file mode 100644
index 000000000..7538ba442
--- /dev/null
+++ b/src/components/svg/Path.tsx
@@ -0,0 +1,15 @@
+import type { SVGProps } from 'react';
+
+const SvgPath = (props: SVGProps) => (
+
+
+
+);
+export default SvgPath;
diff --git a/src/components/svg/Profile.tsx b/src/components/svg/Profile.tsx
new file mode 100644
index 000000000..c955fce2f
--- /dev/null
+++ b/src/components/svg/Profile.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgProfile = (props: SVGProps) => (
+
+
+
+);
+export default SvgProfile;
diff --git a/src/components/svg/Pushpin.tsx b/src/components/svg/Pushpin.tsx
new file mode 100644
index 000000000..d19e98ea0
--- /dev/null
+++ b/src/components/svg/Pushpin.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgPushpin = (props: SVGProps) => (
+
+
+
+);
+export default SvgPushpin;
diff --git a/src/components/svg/Redo.tsx b/src/components/svg/Redo.tsx
new file mode 100644
index 000000000..04c389f6e
--- /dev/null
+++ b/src/components/svg/Redo.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgRedo = (props: SVGProps) => (
+
+
+
+);
+export default SvgRedo;
diff --git a/src/components/svg/Reports.tsx b/src/components/svg/Reports.tsx
new file mode 100644
index 000000000..b5489668a
--- /dev/null
+++ b/src/components/svg/Reports.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgReports = (props: SVGProps) => (
+
+
+
+);
+export default SvgReports;
diff --git a/src/components/svg/Security.tsx b/src/components/svg/Security.tsx
new file mode 100644
index 000000000..d075a9385
--- /dev/null
+++ b/src/components/svg/Security.tsx
@@ -0,0 +1,16 @@
+import type { SVGProps } from 'react';
+
+const SvgSecurity = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgSecurity;
diff --git a/src/components/svg/Speaker.tsx b/src/components/svg/Speaker.tsx
new file mode 100644
index 000000000..eb724ae9c
--- /dev/null
+++ b/src/components/svg/Speaker.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgSpeaker = (props: SVGProps) => (
+
+
+
+);
+export default SvgSpeaker;
diff --git a/src/components/svg/Sun.tsx b/src/components/svg/Sun.tsx
new file mode 100644
index 000000000..61880f5cc
--- /dev/null
+++ b/src/components/svg/Sun.tsx
@@ -0,0 +1,9 @@
+import type { SVGProps } from 'react';
+
+const SvgSun = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgSun;
diff --git a/src/components/svg/Switch.tsx b/src/components/svg/Switch.tsx
new file mode 100644
index 000000000..0196d850f
--- /dev/null
+++ b/src/components/svg/Switch.tsx
@@ -0,0 +1,19 @@
+import type { SVGProps } from 'react';
+
+const SvgSwitch = (props: SVGProps) => (
+
+
+
+);
+export default SvgSwitch;
diff --git a/src/components/svg/Tag.tsx b/src/components/svg/Tag.tsx
new file mode 100644
index 000000000..2ff51f4dc
--- /dev/null
+++ b/src/components/svg/Tag.tsx
@@ -0,0 +1,16 @@
+import type { SVGProps } from 'react';
+
+const SvgTag = (props: SVGProps) => (
+
+
+
+
+);
+export default SvgTag;
diff --git a/src/components/svg/Target.tsx b/src/components/svg/Target.tsx
new file mode 100644
index 000000000..3fe76d21f
--- /dev/null
+++ b/src/components/svg/Target.tsx
@@ -0,0 +1,21 @@
+import type { SVGProps } from 'react';
+
+const SvgTarget = (props: SVGProps) => (
+
+
+
+
+
+);
+export default SvgTarget;
diff --git a/src/components/svg/Visitor.tsx b/src/components/svg/Visitor.tsx
new file mode 100644
index 000000000..16db58589
--- /dev/null
+++ b/src/components/svg/Visitor.tsx
@@ -0,0 +1,8 @@
+import type { SVGProps } from 'react';
+
+const SvgVisitor = (props: SVGProps) => (
+
+
+
+);
+export default SvgVisitor;
diff --git a/src/components/svg/Website.tsx b/src/components/svg/Website.tsx
new file mode 100644
index 000000000..20a18a49f
--- /dev/null
+++ b/src/components/svg/Website.tsx
@@ -0,0 +1,13 @@
+import type { SVGProps } from 'react';
+
+const SvgWebsite = (props: SVGProps) => (
+
+
+
+);
+export default SvgWebsite;
diff --git a/src/components/svg/index.ts b/src/components/svg/index.ts
new file mode 100644
index 000000000..15721e52e
--- /dev/null
+++ b/src/components/svg/index.ts
@@ -0,0 +1,38 @@
+export { default as AddUser } from './AddUser';
+export { default as BarChart } from './BarChart';
+export { default as Bars } from './Bars';
+export { default as Bolt } from './Bolt';
+export { default as Bookmark } from './Bookmark';
+export { default as Change } from './Change';
+export { default as Compare } from './Compare';
+export { default as Dashboard } from './Dashboard';
+export { default as Download } from './Download';
+export { default as Expand } from './Expand';
+export { default as Export } from './Export';
+export { default as Flag } from './Flag';
+export { default as Funnel } from './Funnel';
+export { default as Gauge } from './Gauge';
+export { default as Gear } from './Gear';
+export { default as Lightbulb } from './Lightbulb';
+export { default as Lightning } from './Lightning';
+export { default as Location } from './Location';
+export { default as Lock } from './Lock';
+export { default as Logo } from './Logo';
+export { default as LogoWhite } from './LogoWhite';
+export { default as Magnet } from './Magnet';
+export { default as Money } from './Money';
+export { default as Network } from './Network';
+export { default as Nodes } from './Nodes';
+export { default as Overview } from './Overview';
+export { default as Path } from './Path';
+export { default as Profile } from './Profile';
+export { default as Pushpin } from './Pushpin';
+export { default as Redo } from './Redo';
+export { default as Reports } from './Reports';
+export { default as Security } from './Security';
+export { default as Speaker } from './Speaker';
+export { default as Switch } from './Switch';
+export { default as Tag } from './Tag';
+export { default as Target } from './Target';
+export { default as Visitor } from './Visitor';
+export { default as Website } from './Website';
diff --git a/src/declaration.d.ts b/src/declaration.d.ts
index 7dff68b86..7bd6d1f0e 100644
--- a/src/declaration.d.ts
+++ b/src/declaration.d.ts
@@ -1,6 +1,17 @@
+declare module '*.css';
+declare module '*.svg';
+declare module '*.json';
declare module 'bcryptjs';
declare module 'chartjs-adapter-date-fns';
declare module 'cors';
+declare module 'date-fns-tz';
declare module 'debug';
declare module 'jsonwebtoken';
declare module 'md5';
+declare module 'papaparse';
+declare module 'prettier';
+declare module 'react-simple-maps';
+declare module 'semver';
+declare module 'tsup';
+declare module 'uuid';
+declare module '@umami/esbuild-plugin-css-modules';
diff --git a/src/i18n/request.ts b/src/i18n/request.ts
new file mode 100644
index 000000000..f35538f1b
--- /dev/null
+++ b/src/i18n/request.ts
@@ -0,0 +1,9 @@
+import { getRequestConfig } from 'next-intl/server';
+import enUS from '../../public/intl/messages/en-US.json';
+
+export default getRequestConfig(async () => {
+ return {
+ locale: 'en-US',
+ messages: enUS,
+ };
+});
diff --git a/src/index.ts b/src/index.ts
index e7b0e6c62..caeaf38a3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,64 +1,84 @@
-export * from '@/components/hooks';
+export * from '@/app/(main)/settings/preferences/LanguageSetting';
+export * from '@/app/(main)/settings/preferences/PreferenceSettings';
+export * from '@/app/(main)/settings/preferences/PreferencesPage';
+export * from '@/app/(main)/settings/preferences/ThemeSetting';
+export * from '@/app/(main)/teams/[teamId]/TeamDeleteForm';
+export * from '@/app/(main)/teams/[teamId]/TeamEditForm';
+export * from '@/app/(main)/teams/[teamId]/TeamManage';
+export * from '@/app/(main)/teams/[teamId]/TeamMemberEditButton';
+export * from '@/app/(main)/teams/[teamId]/TeamMemberEditForm';
+export * from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton';
+export * from '@/app/(main)/teams/[teamId]/TeamMembersDataTable';
+export * from '@/app/(main)/teams/[teamId]/TeamMembersTable';
+export * from '@/app/(main)/teams/[teamId]/TeamSettings';
+export * from '@/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton';
+export * from '@/app/(main)/teams/[teamId]/TeamWebsitesDataTable';
+export * from '@/app/(main)/teams/[teamId]/TeamWebsitesTable';
-export * from '@/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton';
-export * from '@/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm';
-export * from '@/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton';
-export * from '@/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable';
-export * from '@/app/(main)/teams/[teamId]/settings/members/TeamMembersTable';
+export * from '@/app/(main)/teams/TeamAddForm';
+export * from '@/app/(main)/teams/TeamJoinForm';
+export * from '@/app/(main)/teams/TeamLeaveButton';
+export * from '@/app/(main)/teams/TeamLeaveForm';
+export * from '@/app/(main)/teams/TeamMemberAddForm';
+export * from '@/app/(main)/teams/TeamProvider';
+export * from '@/app/(main)/teams/TeamsAddButton';
+export * from '@/app/(main)/teams/TeamsDataTable';
+export * from '@/app/(main)/teams/TeamsHeader';
+export * from '@/app/(main)/teams/TeamsJoinButton';
+export * from '@/app/(main)/teams/TeamsMemberAddButton';
+export * from '@/app/(main)/teams/TeamsTable';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteData';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteEditForm';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteResetForm';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettings';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteShareForm';
+export * from '@/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode';
-export * from '@/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm';
-export * from '@/app/(main)/teams/[teamId]/settings/team/TeamDetails';
-export * from '@/app/(main)/teams/[teamId]/settings/team/TeamEditForm';
-export * from '@/app/(main)/teams/[teamId]/settings/team/TeamManage';
+export * from '@/app/(main)/websites/WebsiteAddButton';
+export * from '@/app/(main)/websites/WebsiteAddForm';
+export * from '@/app/(main)/websites/WebsiteProvider';
+export * from '@/app/(main)/websites/WebsitesDataTable';
+export * from '@/app/(main)/websites/WebsitesHeader';
+export * from '@/app/(main)/websites/WebsitesTable';
-export * from '@/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton';
-export * from '@/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable';
-export * from '@/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable';
-
-export * from '@/app/(main)/settings/teams/TeamAddForm';
-export * from '@/app/(main)/settings/teams/TeamJoinForm';
-export * from '@/app/(main)/settings/teams/TeamLeaveButton';
-export * from '@/app/(main)/settings/teams/TeamLeaveForm';
-export * from '@/app/(main)/settings/teams/TeamsAddButton';
-export * from '@/app/(main)/settings/teams/TeamsDataTable';
-export * from '@/app/(main)/settings/teams/TeamsHeader';
-export * from '@/app/(main)/settings/teams/TeamsJoinButton';
-export * from '@/app/(main)/settings/teams/TeamsTable';
-export * from '@/app/(main)/settings/teams/WebsiteTags';
-
-export * from '@/app/(main)/settings/websites/[websiteId]/ShareUrl';
-export * from '@/app/(main)/settings/websites/[websiteId]/TrackingCode';
-export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteData';
-export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteDeleteForm';
-export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteEditForm';
-export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteResetForm';
-export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteSettings';
-
-export * from '@/app/(main)/settings/websites/WebsiteAddButton';
-export * from '@/app/(main)/settings/websites/WebsiteAddForm';
-export * from '@/app/(main)/settings/websites/WebsitesDataTable';
-export * from '@/app/(main)/settings/websites/WebsitesHeader';
-export * from '@/app/(main)/settings/websites/WebsitesTable';
-
-export * from '@/app/(main)/teams/[teamId]/TeamProvider';
-export * from '@/app/(main)/websites/[websiteId]/WebsiteProvider';
+export * from '@/components/charts/BarChart';
+export * from '@/components/charts/BubbleChart';
+export * from '@/components/charts/Chart';
+export * from '@/components/charts/ChartTooltip';
+export * from '@/components/charts/PieChart';
+export * from '@/components/common/ActionForm';
export * from '@/components/common/ConfirmationForm';
-export * from '@/components/common/DataTable';
+export * from '@/components/common/DataGrid';
+export * from '@/components/common/DateDisplay';
+export * from '@/components/common/DateDistance';
export * from '@/components/common/Empty';
+export * from '@/components/common/EmptyPlaceholder';
export * from '@/components/common/ErrorBoundary';
export * from '@/components/common/ErrorMessage';
+export * from '@/components/common/ExternalLink';
export * from '@/components/common/Favicon';
-export * from '@/components/common/FilterButtons';
-export * from '@/components/common/FilterLink';
-export * from '@/components/common/HamburgerButton';
-export * from '@/components/common/HoverTooltip';
export * from '@/components/common/LinkButton';
-export * from '@/components/common/MobileMenu';
+export * from '@/components/common/LoadingPanel';
+export * from '@/components/common/NavMenu';
+export * from '@/components/common/PageBody';
+export * from '@/components/common/PageHeader';
export * from '@/components/common/Pager';
+export * from '@/components/common/Panel';
+export * from '@/components/common/SectionHeader';
export * from '@/components/common/TypeConfirmationForm';
-
+export * from '@/components/hooks';
+export * from '@/components/input/DateFilter';
+export * from '@/components/input/DialogButton';
+export * from '@/components/input/DownloadButton';
+export * from '@/components/input/ExportButton';
+export * from '@/components/input/FilterButtons';
+export * from '@/components/input/ProfileButton';
export * from '@/components/input/TeamsButton';
-export * from '@/components/input/ThemeButton';
-
-export { ROLES } from '@/lib/constants';
+export * from '@/components/input/WebsiteSelect';
+export * from '@/components/metrics/ChangeLabel';
+export * from '@/components/metrics/ListTable';
+export * from '@/components/metrics/MetricCard';
+export * from '@/components/metrics/MetricLabel';
+export * from '@/components/metrics/MetricsBar';
diff --git a/src/lang/am-ET.json b/src/lang/am-ET.json
deleted file mode 100644
index ab3112185..000000000
--- a/src/lang/am-ET.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Actions",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Add website",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "All",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Back",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "Cancel",
- "label.change-password": "Change password",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Confirm password",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Countries",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Current password",
- "label.custom-range": "Custom range",
- "label.dashboard": "Dashboard",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Date range",
- "label.day": "Day",
- "label.default-date-range": "Default date range",
- "label.delete": "Delete",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Delete website",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Devices",
- "label.dismiss": "Dismiss",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "Edit",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Enable share URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event Data",
- "label.events": "Events",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combined",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "Last {x} days",
- "label.last-hours": "Last {x} hours",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Login",
- "label.logout": "Logout",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "More",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Name",
- "label.new-password": "New password",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Page views",
- "label.pageTitle": "Page title",
- "label.pages": "Pages",
- "label.password": "Password",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profile",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Realtime",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Refresh",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Required",
- "label.reset": "Reset",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Save",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Settings",
- "label.share-url": "Share URL",
- "label.single-day": "Single day",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "This month",
- "label.this-week": "This week",
- "label.this-year": "This year",
- "label.timezone": "Timezone",
- "label.title": "Title",
- "label.today": "Today",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Tracking code",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unique visitors",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Unknown",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Username",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "View details",
- "label.view-only": "View only",
- "label.views": "Views",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Visitors",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Websites",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Are you sure you want to delete {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are you sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All website data will be deleted.",
- "message.error": "Something went wrong.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Go to settings",
- "message.incorrect-username-password": "Incorrect username/password.",
- "message.invalid-domain": "Invalid domain. Do not include http/https.",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "No data available.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Passwords do not match.",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "You do not have any websites configured.",
- "message.page-not-found": "Page not found.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
- "message.saved": "Saved.",
- "message.share-url": "This is the publicly shared URL for {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "To track stats for this website, place the following code in the ... section of your HTML.",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/ar-SA.json b/src/lang/ar-SA.json
deleted file mode 100644
index cfc3d502c..000000000
--- a/src/lang/ar-SA.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "label.access-code": "كود الدعوة",
- "label.actions": "الإجراءات",
- "label.activity": "سجل الأحداث",
- "label.add": "أضِف",
- "label.add-description": "أضِف وصف",
- "label.add-member": "أضِف عضو",
- "label.add-step": "إضافة خطوة",
- "label.add-website": "إضافة موقع",
- "label.admin": "مدير",
- "label.after": "يعد",
- "label.all": "الكل",
- "label.all-time": "كل الوقت",
- "label.analytics": "تحليلات",
- "label.attribution": "الإسناد",
- "label.attribution-description": "شاهد كيف يتفاعل المستخدمون مع حملاتك التسويقية وما الذي يحفز التحويلات.",
- "label.average": "المتوسط",
- "label.back": "للخلف",
- "label.before": "قبل",
- "label.bounce-rate": "معدل الارتداد",
- "label.breakdown": "التصنيف",
- "label.browser": "المتصفح",
- "label.browsers": "المتصفحات",
- "label.cancel": "إلغاء",
- "label.change-password": "تغيير كلمة المرور",
- "label.cities": "المدن",
- "label.city": "المدينة",
- "label.clear-all": "مسح الكل",
- "label.compare": "المقارنة",
- "label.confirm": "تأكيد",
- "label.confirm-password": "تأكيد كلمة المرور",
- "label.contains": "يحتوي على",
- "label.continue": "تابع",
- "label.count": "العدد",
- "label.countries": "الدول",
- "label.country": "الدولة",
- "label.create": "أنشِئ",
- "label.create-report": "أنشِئ تقرير",
- "label.create-team": "أنشِئ فريق",
- "label.create-user": "أنشِئ مستخدم",
- "label.created": "أُنشئت",
- "label.created-by": "أُنشئ من قبل",
- "label.current": "الحالي",
- "label.current-password": "كلمة المرور الحالية",
- "label.custom-range": "فترة مخصّصة",
- "label.dashboard": "لوحة التحكم",
- "label.data": "البيانات",
- "label.date": "التاريخ",
- "label.date-range": "فترة مخصّصة",
- "label.day": "يوم",
- "label.default-date-range": "الفترة المخصّصة الافتراضية",
- "label.delete": "حذف",
- "label.delete-report": "احذف التقرير",
- "label.delete-team": "حذف الفريق",
- "label.delete-user": "جذف مستخدم",
- "label.delete-website": "حذف الموقع",
- "label.description": "الوصف",
- "label.desktop": "كمبيوتر",
- "label.details": "تفاصيل",
- "label.device": "الجهاز",
- "label.devices": "الأجهزة",
- "label.dismiss": "تجاهل",
- "label.does-not-contain": "لا يحتوي على",
- "label.domain": "النطاق",
- "label.dropoff": "إنزال",
- "label.edit": "تعديل",
- "label.edit-dashboard": "عدّل لوحة التحكم",
- "label.edit-member": "عدّل العضو",
- "label.enable-share-url": "فعّل مشاركة الرابط",
- "label.end-step": "الخطوة الأخيرة",
- "label.entry": "رابط الدخول",
- "label.event": "الحدث",
- "label.event-data": "تاريخ الحدث",
- "label.events": "الأحداث",
- "label.exit": "رابط المغادرة",
- "label.false": "خطأ",
- "label.field": "الحقل",
- "label.fields": "الحقول",
- "label.filter": "تصفيَة",
- "label.filter-combined": "مُجمّعة",
- "label.filter-raw": "خام",
- "label.filters": "التصفيات",
- "label.first-seen": "أول ظهور",
- "label.funnel": "قمع",
- "label.funnel-description": "فهم معدل التحويل والانقطاع عن المستخدمين.",
- "label.goal": "الهدف",
- "label.goals": "الأهداف",
- "label.goals-description": "تابع تحقق أهدافك المرتبطة بمشاهدات الصفحات والأحداث.",
- "label.greater-than": "أكبَر مِن",
- "label.greater-than-equals": "أكبَر مِن أو يساوي",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "نتائج التحليلات",
- "label.insights-description": "تعمق في بياناتك باستخدام الشرائح والتصفيات.",
- "label.is": "يساوي",
- "label.is-not": "لا يساوي",
- "label.is-not-set": "لم ضُبط",
- "label.is-set": "ضُبط",
- "label.join": "انضم",
- "label.join-team": "انضم للفريق",
- "label.journey": "رحلة المستخدم",
- "label.journey-description": "تعرّف على كيفية تنقّل المستخدمين داخل موقعك.",
- "label.language": "اللغة",
- "label.languages": "اللغات",
- "label.laptop": "لابتوب",
- "label.last-days": "آخر {x} يوم/ايام",
- "label.last-hours": "آخر {x} ساعة",
- "label.last-months": "آخر {x} شهر/أشهر",
- "label.last-seen": "آخر ظهور",
- "label.leave": "غادر",
- "label.leave-team": "مغادرة المجموعة",
- "label.less-than": "أقل مِن",
- "label.less-than-equals": "أقل مِن أو يساوي",
- "label.login": "تسجيل الدخول",
- "label.logout": "تسجيل الخروج",
- "label.manage": "التحكم",
- "label.manager": "مدير",
- "label.max": "الحد الأقصى",
- "label.member": "عضو",
- "label.members": "الأعضاء",
- "label.min": "الحد الأدنى",
- "label.mobile": "جوال",
- "label.more": "المزيد",
- "label.my-account": "حسابي",
- "label.my-websites": "مواقعي",
- "label.name": "الاسم",
- "label.new-password": "كلمة مرور جديدة",
- "label.none": "غير معرّف",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "نعم",
- "label.os": "نظام التشغيل",
- "label.overview": "نظرة عامة",
- "label.owner": "المالك",
- "label.page-of": "صفحة {current} من {total}",
- "label.page-views": "مشاهدات الصفحة",
- "label.pageTitle": "عنوان الصفحة",
- "label.pages": "الصفحات",
- "label.password": "كلمة المرور",
- "label.path": "المسار",
- "label.paths": "المسارات",
- "label.powered-by": "مشغل بواسطة {name}",
- "label.previous": "السابق",
- "label.previous-period": "الفترة السابقة",
- "label.previous-year": "العام السابق",
- "label.profile": "الملف الشخصي",
- "label.properties": "الخصائص",
- "label.property": "الخاصية",
- "label.queries": "استعلامات",
- "label.query": "استعلام",
- "label.query-parameters": "متغيرات الرابط",
- "label.realtime": "الوقت الفعلي",
- "label.referrer": "المرجع",
- "label.referrers": "التحويلات",
- "label.refresh": "تحديث",
- "label.regenerate": "إعادة توليد",
- "label.region": "المنطقة",
- "label.regions": "المناطق",
- "label.remove": "أزِل",
- "label.remove-member": "احذف عضو",
- "label.reports": "التقارير",
- "label.required": "اجباري",
- "label.reset": "اعادة تعيين",
- "label.reset-website": "اعادة تعيين الإحصائيات",
- "label.retention": "الاحتفاظ",
- "label.retention-description": "قس مدى ثبات موقعك على الويب من خلال تتبع عدد مرات عودة المستخدمين.",
- "label.revenue": "الإيرادات",
- "label.revenue-description": "قم بإلقاء نظرة على بيانات إيراداتك وكيفية إنفاق المستخدمين.",
- "label.revenue-property": "خاصية الإيرادات",
- "label.role": "الصلاحية",
- "label.run-query": "شغّل الاستعلام",
- "label.save": "حفظ",
- "label.screens": "الشاشات",
- "label.search": "بحث",
- "label.select": "اختر",
- "label.select-date": "حدد التاريخ",
- "label.select-role": "حدد الدور",
- "label.select-website": "حدد موقع",
- "label.session": "الزيارة",
- "label.sessions": "الزيارات",
- "label.settings": "الإعدادات",
- "label.share-url": "مشاركة الرابط",
- "label.single-day": "يوم واحد",
- "label.start-step": "الخطوة الأولى",
- "label.steps": "الخطوات",
- "label.sum": "المجموع",
- "label.tablet": "تابلت",
- "label.tag": "الوسم",
- "label.tags": "الوسوم",
- "label.team": "الفريق",
- "label.team-id": "معرّف الفريق",
- "label.team-manager": "مدير الفريق",
- "label.team-member": "عضو الفريق",
- "label.team-name": "اسم الفريق",
- "label.team-owner": "مدير الفريق",
- "label.team-view-only": "عرض الفريق فقط",
- "label.team-websites": "مواقع الفريق",
- "label.teams": "الفرق",
- "label.theme": "السمة",
- "label.this-month": "الشهر الحالي",
- "label.this-week": "الاسبوع الحالي",
- "label.this-year": "السنة الحالية",
- "label.timezone": "المنطقة الزمنية",
- "label.title": "العنوان",
- "label.today": "اليوم",
- "label.toggle-charts": "تغيير الإحصائيات",
- "label.total": "الإجمالي",
- "label.total-records": "إجمالي السجلات",
- "label.tracking-code": "كود التتبع",
- "label.transactions": "المعاملات",
- "label.transfer": "نقل",
- "label.transfer-website": "انقل الموقع",
- "label.true": "حقيقي",
- "label.type": "النوع",
- "label.unique": "فريد",
- "label.unique-visitors": "زائرون فريدون",
- "label.uniqueCustomers": "العملاء الفريدون",
- "label.unknown": "غير معروف",
- "label.untitled": "بدون عنوان",
- "label.update": "تحديث",
- "label.url": "الرابط",
- "label.urls": "الروابط",
- "label.user": "المستخدم",
- "label.user-property": "سمات المستخدم",
- "label.username": "اسم المستخدم",
- "label.users": "المستخدمين",
- "label.utm": "UTM",
- "label.utm-description": "تابع حملاتك التسويقية باستخدام معلمات UTM.",
- "label.value": "القيمة",
- "label.view": "عرض",
- "label.view-details": "عرض التفاصيل",
- "label.view-only": "عرض فقط",
- "label.views": "المشاهدات",
- "label.views-per-visit": "مشاهدات لكل زيارة",
- "label.visit-duration": "متوسط وقت الزيارة",
- "label.visitors": "الزوار",
- "label.visits": "الزيارات",
- "label.website": "الموقع",
- "label.website-id": "معرّف الموقع",
- "label.websites": "المواقع",
- "label.window": "النافذة",
- "label.yesterday": "الأمس",
- "message.action-confirmation": "اكتب {confirmation} في المربع أدناه للتأكيد.",
- "message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}",
- "message.collected-data": "البيانات المجمعة",
- "message.confirm-delete": "هل أنت متأكد من حذف {target}?",
- "message.confirm-leave": "هل أنت متأكد من مغادرة {target}?",
- "message.confirm-remove": "هل انت متأكد من حذف {target}?",
- "message.confirm-reset": "هل أنت متأكد من اعادة تعيين الإحصائيات لـ {target}؟",
- "message.delete-team-warning": "سيؤدي حذف الفريق أيضًا إلى حذف كافة مواقع الفريق",
- "message.delete-website-warning": "سيتم حذف كافة بيانات الموقع.",
- "message.error": "حدث خطأ ما.",
- "message.event-log": "{event} في {url}",
- "message.go-to-settings": "الذهاب إلى الإعدادات",
- "message.incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.",
- "message.invalid-domain": "النطاق غير صحيح",
- "message.min-password-length": "اقل عدد مسموح به {n} حرف/أحرف",
- "message.new-version-available": "إصدار جديد من Umami {version} متاح!",
- "message.no-data-available": "لا توجد بيانات متاحة.",
- "message.no-event-data": "لا توجد بيانات الحدث متاحة.",
- "message.no-match-password": "كلمة المرور غير متطابقة",
- "message.no-results-found": "لا توجد نتائج.",
- "message.no-team-websites": "هذا الفريق ليس لديه أي مواقع.",
- "message.no-teams": "لم تنشِئ اي فرق.",
- "message.no-users": "لا يوجد مستخدمين.",
- "message.no-websites-configured": "لم تقم بإعداد اي موقع.",
- "message.page-not-found": "الصفحة غير موجودة.",
- "message.reset-website": "لإعادة ضبط موقع الويب هذا، اكتب {confirmation} في المربع أدناه للتأكيد.",
- "message.reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تغيير كود التتبع",
- "message.saved": "تم الحفظ بنجاح.",
- "message.share-url": "إحصائيات موقعك متاحة للجميع على الرابط التالي:",
- "message.team-already-member": "أنت عضو في الفريق",
- "message.team-not-found": "لم يتم العثور على الفريق",
- "message.team-websites-info": "يمكن مشاهدة الموقع من اي عضو في الفريق.",
- "message.tracking-code": "كود التتبع",
- "message.transfer-team-website-to-user": "نقل هذا الموقع إلى حسابك؟",
- "message.transfer-user-website-to-team": "اختر الفريق الذي تريد نقل الموقع إليه.",
- "message.transfer-website": "نقل ملكية الموقع لحسابك أو فريق أخر.",
- "message.triggered-event": "أُطلق الحدث",
- "message.user-deleted": "تم حذف المستخدم.",
- "message.viewed-page": "شوهدت الصفحة",
- "message.visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}",
- "message.visitors-dropped-off": "أنخفض عدد الزوار"
-}
diff --git a/src/lang/be-BY.json b/src/lang/be-BY.json
deleted file mode 100644
index b417afaa4..000000000
--- a/src/lang/be-BY.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Код доступу",
- "label.actions": "Дзеянні",
- "label.activity": "Журнал актыўнасці",
- "label.add": "Дадаць",
- "label.add-description": "Дадаць апісанне",
- "label.add-member": "Дадаць удзельніка",
- "label.add-step": "Дадаць крок",
- "label.add-website": "Дадаць сайт",
- "label.admin": "Адміністратар",
- "label.after": "Пасля",
- "label.all": "Усё",
- "label.all-time": "Увесь час",
- "label.analytics": "Аналітыка",
- "label.average": "Сярэдняе",
- "label.back": "Назад",
- "label.before": "Да",
- "label.bounce-rate": "Паказчык адмоваў",
- "label.breakdown": "Разбіўка",
- "label.browser": "Браўзер",
- "label.browsers": "Браўзеры",
- "label.cancel": "Адмена",
- "label.change-password": "Змяніць пароль",
- "label.cities": "Гарады",
- "label.city": "Горад",
- "label.clear-all": "Ачысціць усё",
- "label.compare": "Параўнаць",
- "label.confirm": "Падцвердзіць",
- "label.confirm-password": "Падцвердзіць пароль",
- "label.contains": "Уключае",
- "label.continue": "Працягнуць",
- "label.count": "Колькасць",
- "label.countries": "Краіны",
- "label.country": "Краіна",
- "label.create": "Стварыць",
- "label.create-report": "Стварыць справаздачу",
- "label.create-team": "Стварыць каманду",
- "label.create-user": "Стварыць карыстальніка",
- "label.created": "Створана",
- "label.created-by": "Створана",
- "label.current": "Цяперашні",
- "label.current-password": "Цяперашні пароль",
- "label.custom-range": "Іншы дыяпазон",
- "label.dashboard": "Інфармацыйная панэль",
- "label.data": "Дадзеныя",
- "label.date": "Дата",
- "label.date-range": "Дыяпазон дат",
- "label.day": "Дзень",
- "label.default-date-range": "Дыяпазон дат па змаўчанню",
- "label.delete": "Выдаліць",
- "label.delete-report": "Выдаліць справаздачу",
- "label.delete-team": "Выдаліць каманду",
- "label.delete-user": "Выдаліць карыстальніка",
- "label.delete-website": "Выдаліць сайт",
- "label.description": "Апісанне",
- "label.desktop": "Настольны ПК",
- "label.details": "Дэталі",
- "label.device": "Прылада",
- "label.devices": "Прылады",
- "label.dismiss": "Адхіліць",
- "label.does-not-contain": "Не ўключае",
- "label.domain": "Дамен",
- "label.dropoff": "Адмовы",
- "label.edit": "Змяніць",
- "label.edit-dashboard": "Змяніць інфармацыйную панэль",
- "label.edit-member": "Рэдагаваць удзельніка",
- "label.enable-share-url": "Дазволіць дзяліцца спасылкай",
- "label.end-step": "Канчатковы крок",
- "label.entry": "URL уваходу",
- "label.event": "Падзея",
- "label.event-data": "Дадзеныя падзеі",
- "label.events": "Падзеі",
- "label.exit": "URL выхаду",
- "label.false": "Ложна",
- "label.field": "Поле",
- "label.fields": "Палі",
- "label.filter": "Фільтр",
- "label.filter-combined": "Камбініраваны",
- "label.filter-raw": "Сырыя",
- "label.filters": "Фільтры",
- "label.first-seen": "First seen",
- "label.funnel": "Варонка",
- "label.funnel-description": "Разумець паказчыкі канверсіі і адмоваў.",
- "label.goal": "Мэта",
- "label.goals": "Мэты",
- "label.goals-description": "Сачыць за мэтамі па праглядах старонак і падзеях.",
- "label.greater-than": "Больш чым",
- "label.greater-than-equals": "Больш чым або роўна",
- "label.host": "Хост",
- "label.hosts": "Хасты",
- "label.insights": "Інсайты",
- "label.insights-description": "Даследваць дадзеныя з дапамогай сегментаў і фільтраў.",
- "label.is": "З'яўляецца",
- "label.is-not": "Не з'яўляецца",
- "label.is-not-set": "Не ўстаноўлена",
- "label.is-set": "Устаноўлена",
- "label.join": "Далучыцца",
- "label.join-team": "Далучыцца да каманды",
- "label.journey": "Маршрут карыстальніка",
- "label.journey-description": "Разумець як карыстальнікі навігуюць па сайце.",
- "label.language": "Мова",
- "label.languages": "Мовы",
- "label.laptop": "Ноўтбук",
- "label.last-days": "Апошнія {x} дзён",
- "label.last-hours": "Апошнія {x} гадзіны",
- "label.last-months": "Апошнія {x} месяцаў",
- "label.last-seen": "Last seen",
- "label.leave": "Пакінуць",
- "label.leave-team": "Пакінуць каманду",
- "label.less-than": "Менш чым",
- "label.less-than-equals": "Менш чым або роўна",
- "label.login": "Увайсці",
- "label.logout": "Выйсці",
- "label.manage": "Кіраваць",
- "label.manager": "Кіраўнік",
- "label.max": "Максімум",
- "label.member": "Удзельнік",
- "label.members": "Удзельнікі",
- "label.min": "Мінімум",
- "label.mobile": "Мабільны",
- "label.more": "Болей",
- "label.my-account": "Мой уліковы запіс",
- "label.my-websites": "Мае сайты",
- "label.name": "Імя",
- "label.new-password": "Новы пароль",
- "label.none": "Няма",
- "label.number-of-records": "{x} {x, plural, one {запіс} other {запісаў}}",
- "label.ok": "ОК",
- "label.os": "Аперацыйная сістэма",
- "label.overview": "Агляд",
- "label.owner": "Уласнік",
- "label.page-of": "Старонка {current} з {total}",
- "label.page-views": "Прагляды старонкі",
- "label.pageTitle": "Загаловак старонкі",
- "label.pages": "Старонкі",
- "label.password": "Пароль",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Зроблена {name}",
- "label.previous": "Папярэдні",
- "label.previous-period": "Папярэдні перыяд",
- "label.previous-year": "Папярэдні год",
- "label.profile": "Профіль",
- "label.properties": "Properties",
- "label.property": "Уласцівасць",
- "label.queries": "Запыты",
- "label.query": "Запыт",
- "label.query-parameters": "Параметры запыту",
- "label.realtime": "У рэяльным часе",
- "label.referrer": "Рэферэр",
- "label.referrers": "Рэферэры",
- "label.refresh": "Аднавіць",
- "label.regenerate": "Рэгенераваць",
- "label.region": "Рэгіён",
- "label.regions": "Рэгіёны",
- "label.remove": "Выдаліць",
- "label.remove-member": "Выдаліць удзельніка",
- "label.reports": "Справаздачы",
- "label.required": "Абавязкова",
- "label.reset": "Скінуць",
- "label.reset-website": "Скінуць статыстыку",
- "label.retention": "Утрыманне",
- "label.retention-description": "Ацаніць прыцягальнасць сайта, адсочваючы павяртанні карыстальнікаў.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Роля",
- "label.run-query": "Запусціць запыт",
- "label.save": "Захаваць",
- "label.screens": "Экраны",
- "label.search": "Пошук",
- "label.select": "Выбраць",
- "label.select-date": "Выбраць дату",
- "label.select-role": "Выбраць ролю",
- "label.select-website": "Выбраць сайт",
- "label.session": "Session",
- "label.sessions": "Сесіі",
- "label.settings": "Налады",
- "label.share-url": "Падзяліцца спасылкай",
- "label.single-day": "Адзін дзень",
- "label.start-step": "Першы кроку",
- "label.steps": "Крокі",
- "label.sum": "Сума",
- "label.tablet": "Планшэт",
- "label.team": "Каманда",
- "label.team-id": "Ідэнтыфікатар каманды",
- "label.team-manager": "Кіраўнік каманды",
- "label.team-member": "Удзельнік каманды",
- "label.team-name": "Назва каманды",
- "label.team-owner": "Уласнік каманды",
- "label.team-view-only": "Толькі для каманднага прагляду",
- "label.team-websites": "Сайты каманды",
- "label.teams": "Каманды",
- "label.theme": "Тэма",
- "label.this-month": "Гэты месяц",
- "label.this-week": "Гэты тыдзень",
- "label.this-year": "Гэты год",
- "label.timezone": "Часавы пояс",
- "label.title": "Загаловак",
- "label.today": "Сёння",
- "label.toggle-charts": "Пераключыць графікі",
- "label.total": "Агульная колькасць",
- "label.total-records": "Агульная колькасць запісаў",
- "label.tracking-code": "Код адсочвання",
- "label.transactions": "Transactions",
- "label.transfer": "Перадаць",
- "label.transfer-website": "Перадаць сайт",
- "label.true": "Ісціна",
- "label.type": "Тып",
- "label.unique": "Унікальны",
- "label.unique-visitors": "Унікальныя наведвальнікі",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Невядома",
- "label.untitled": "Без назвы",
- "label.update": "Абнавіць",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Карыстальнік",
- "label.user-property": "User Property",
- "label.username": "Імя карыстальніка",
- "label.users": "Карыстальнікі",
- "label.utm": "UTM",
- "label.utm-description": "Сачыць за кампаніямі з дапамогай UTM-метак.",
- "label.value": "Значэнне",
- "label.view": "Паглядзець",
- "label.view-details": "Паглядзець дэталі",
- "label.view-only": "Толькі прагляд",
- "label.views": "Прагляды",
- "label.views-per-visit": "Прагляды за наведванне",
- "label.visit-duration": "Сярэдняя даўжыня наведвання",
- "label.visitors": "Наведвальнікі",
- "label.visits": "Наведванні",
- "label.website": "Сайт",
- "label.website-id": "Ідэнтыфікатар сайта",
- "label.websites": "Сайты",
- "label.window": "Вакно",
- "label.yesterday": "Учора",
- "message.action-confirmation": "Увядзіце {confirmation} у поле ніжэй, каб пацвердзіць.",
- "message.active-users": "{x} цякучых {x, plural, one {наведвальнік} other {наведвальнікаў}}",
- "message.collected-data": "Сабраныя дадзеныя",
- "message.confirm-delete": "Вы дакладна хочаце выдаліць {target}?",
- "message.confirm-leave": "Вы дакладна хочаце пакінуць {target}?",
- "message.confirm-remove": "Вы дакладна хочаце выдаліць {target}?",
- "message.confirm-reset": "Вы дакладна хочаце скінуць {target} статыстыку?",
- "message.delete-team-warning": "Выдаленне каманды таксама выдаліць усе сайты каманды.",
- "message.delete-website-warning": "Усе асацыяваныя дадзеныя будуць таксама выдалены.",
- "message.error": "Нешта пайшло не так.",
- "message.event-log": "{event} на {url}",
- "message.go-to-settings": "Да налад",
- "message.incorrect-username-password": "Некарэктнае імя карыстальніка/пароль.",
- "message.invalid-domain": "Некарэктны дамен",
- "message.min-password-length": "Мінімальная даўжыня {n} знакаў",
- "message.new-version-available": "Даступная новая версія Umami {version}!",
- "message.no-data-available": "Няма дадзеных.",
- "message.no-event-data": "Дадзеныя падзеі недаступныя.",
- "message.no-match-password": "Паролі не супадаюць",
- "message.no-results-found": "Вынікаў не знойдзена.",
- "message.no-team-websites": "Гэтая каманда не мае ніводнага сайта.",
- "message.no-teams": "Вы не стварылі ніводнай каманды.",
- "message.no-users": "Няма карыстальнікаў.",
- "message.no-websites-configured": "Вы не наладзілі ніводнага сайта.",
- "message.page-not-found": "Старонка не знойдзена.",
- "message.reset-website": "Каб скінуць гэты сайт, увядзіце {confirmation} у поле ніжэй для пацверджання.",
- "message.reset-website-warning": "Уся статыстыка для гэтага сайта будзе выдалена, але код адсочвання будзе працягваць працаваць.",
- "message.saved": "Захавана паспяхова.",
- "message.share-url": "Гэта публічная спасылка для {target}.",
- "message.team-already-member": "Вы ўжо ўдзельнік каманды.",
- "message.team-not-found": "Каманда не знойдзена.",
- "message.team-websites-info": "Сайты могуць быць праглядацца любым удзельнікам каманды.",
- "message.tracking-code": "Код адсочвання",
- "message.transfer-team-website-to-user": "Перадаць гэты сайт на ваш уліковы запіс?",
- "message.transfer-user-website-to-team": "Выберыце каманду для перадачы гэтага сайта.",
- "message.transfer-website": "Перадача сайта на ваш уліковы запіс або іншай камандзе.",
- "message.triggered-event": "Падзея якая спрацавала",
- "message.user-deleted": "Карыстальнік выдалены.",
- "message.viewed-page": "Праглядзеў старонку",
- "message.visitor-log": "Наведвальнік з {country} праз {browser} на {os} {device}",
- "message.visitors-dropped-off": "Наведвальнікі сышлі"
-}
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
deleted file mode 100644
index 1fd87de2e..000000000
--- a/src/lang/bg-BG.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Код за достъп",
- "label.actions": "Действия",
- "label.activity": "Активностти",
- "label.add": "Добави",
- "label.add-description": "Добави описание",
- "label.add-member": "Добави член",
- "label.add-step": "Добави стъпка",
- "label.add-website": "Добави уебсайт",
- "label.admin": "Администратор",
- "label.after": "След",
- "label.all": "Всички",
- "label.all-time": "За всички времена",
- "label.analytics": "Анализи",
- "label.average": "Средно",
- "label.back": "Назад",
- "label.before": "Преди",
- "label.bounce-rate": "Kоефициент на отказ",
- "label.breakdown": "Разбивка",
- "label.browser": "Браузър",
- "label.browsers": "Браузъри",
- "label.cancel": "Отмени",
- "label.change-password": "Смени парола",
- "label.cities": "Градове",
- "label.city": "Град",
- "label.clear-all": "Изчисти всички",
- "label.compare": "Compare",
- "label.confirm": "Потвърди",
- "label.confirm-password": "Потвърди парола",
- "label.contains": "Съдържа",
- "label.continue": "Продължи",
- "label.count": "Count",
- "label.countries": "Държави",
- "label.country": "Държава",
- "label.create": "Създай",
- "label.create-report": "Създай отчет",
- "label.create-team": "Създай екип",
- "label.create-user": "Създай потребител",
- "label.created": "Създадено",
- "label.created-by": "Създадено от",
- "label.current": "Current",
- "label.current-password": "Текуща парола",
- "label.custom-range": "Обхват",
- "label.dashboard": "Табло",
- "label.data": "Данни",
- "label.date": "Дата",
- "label.date-range": "Диапазон от дати",
- "label.day": "Ден",
- "label.default-date-range": "Диапазон от дати по подразбиране",
- "label.delete": "Изтрий",
- "label.delete-report": "Изтрий отчет",
- "label.delete-team": "Изтрий екип",
- "label.delete-user": "Изтрий потребител",
- "label.delete-website": "Изтрий уебсайт",
- "label.description": "Описание",
- "label.desktop": "Десктоп",
- "label.details": "Детайли",
- "label.device": "Устройство",
- "label.devices": "Устройства",
- "label.dismiss": "Отхвърли",
- "label.does-not-contain": "Не съдържа",
- "label.domain": "Домейн",
- "label.dropoff": "Отпадане",
- "label.edit": "Редактирай",
- "label.edit-dashboard": "Редактирай табло",
- "label.edit-member": "Редактирай член",
- "label.enable-share-url": "Активирай Линк за споделяне",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Събитие",
- "label.event-data": "Данни за събитие",
- "label.events": "Събития",
- "label.exit": "Exit URL",
- "label.false": "Грешно",
- "label.field": "Поле",
- "label.fields": "Полета",
- "label.filter": "Филтър",
- "label.filter-combined": "Комбиниран",
- "label.filter-raw": "Суров",
- "label.filters": "Филтри",
- "label.first-seen": "First seen",
- "label.funnel": "Фуния",
- "label.funnel-description": "Разберете процента на конверсия и отпадане на потребителите.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "По-голямо от",
- "label.greater-than-equals": "По-голямо или равно на",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Изводи",
- "label.insights-description": "Навлезте по-дълбоко в данните си, като използвате сегменти и филтри.",
- "label.is": "Е",
- "label.is-not": "Не е",
- "label.is-not-set": "Не е зададено",
- "label.is-set": "Зададено е",
- "label.join": "Присъедини се",
- "label.join-team": "Присъедини се към екип",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Език",
- "label.languages": "Езици",
- "label.laptop": "Лаптоп",
- "label.last-days": "Последните {x} дни",
- "label.last-hours": "Последните {x} часа",
- "label.last-months": "Последните {x} месеца",
- "label.last-seen": "Last seen",
- "label.leave": "Напусни",
- "label.leave-team": "Напусни екип",
- "label.less-than": "По-малко от",
- "label.less-than-equals": "По-малко или равно на",
- "label.login": "Вход",
- "label.logout": "Изход",
- "label.manage": "Управлявай",
- "label.manager": "Manager",
- "label.max": "Максимум",
- "label.member": "Член",
- "label.members": "Членове",
- "label.min": "Минимум",
- "label.mobile": "Мобилен",
- "label.more": "Още",
- "label.my-account": "Моят акаунт",
- "label.my-websites": "Моите уебсайтове",
- "label.name": "Име",
- "label.new-password": "Нова парола",
- "label.none": "Няма",
- "label.number-of-records": "{x} {x, plural, one {един} other {други}}",
- "label.ok": "Добре",
- "label.os": "ОС",
- "label.overview": "Общ преглед",
- "label.owner": "Собственик",
- "label.page-of": "Страница {current} от {total}",
- "label.page-views": "Прегледи на страницата",
- "label.pageTitle": "Заглавие на страница",
- "label.pages": "Страници",
- "label.password": "Парола",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Поддържано от {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Профил",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Запитвания",
- "label.query": "Запитване",
- "label.query-parameters": "Параметри на търсене",
- "label.realtime": "В реално време",
- "label.referrer": "Референт",
- "label.referrers": "Референти",
- "label.refresh": "Обнови",
- "label.regenerate": "Регенерирай",
- "label.region": "Регион",
- "label.regions": "Региони",
- "label.remove": "Премахни",
- "label.remove-member": "Премахни член",
- "label.reports": "Отчети",
- "label.required": "Задължително",
- "label.reset": "Нулирай",
- "label.reset-website": "Нулирай уебсайт",
- "label.retention": "Привързване",
- "label.retention-description": "Измерете привързаността към вашия уебсайт, като проследявате колко често потребителите се връщат.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Роля",
- "label.run-query": "Изпълни запитване",
- "label.save": "Запази",
- "label.screens": "Екрани",
- "label.search": "Търсене",
- "label.select": "Избери",
- "label.select-date": "Избери дата",
- "label.select-role": "Избери роля",
- "label.select-website": "Избери уебсайт",
- "label.session": "Session",
- "label.sessions": "Сесии",
- "label.settings": "Настройки",
- "label.share-url": "Сподели Линк",
- "label.single-day": "Един ден",
- "label.start-step": "Start Step",
- "label.steps": "Стъпки",
- "label.sum": "Сума",
- "label.tablet": "Таблет",
- "label.team": "Екип",
- "label.team-id": "ID на екип",
- "label.team-manager": "Team manager",
- "label.team-member": "Член на екипа",
- "label.team-name": "Име на екипа",
- "label.team-owner": "Собственик на екипа",
- "label.team-view-only": "Видимо само за членове на екипа",
- "label.team-websites": "Уебсайтове на екипа",
- "label.teams": "Екипи",
- "label.theme": "Тема",
- "label.this-month": "Този месец",
- "label.this-week": "Тази седмица",
- "label.this-year": "Тази година",
- "label.timezone": "Часова зона",
- "label.title": "Заглавие",
- "label.today": "Днес",
- "label.toggle-charts": "Виж диаграми",
- "label.total": "Общо",
- "label.total-records": "Общо записи",
- "label.tracking-code": "Код за проследяване",
- "label.transactions": "Transactions",
- "label.transfer": "Прехвърли",
- "label.transfer-website": "Прехвърляне на уебсайт",
- "label.true": "Вярно",
- "label.type": "Вид",
- "label.unique": "Уникален",
- "label.unique-visitors": "Уникални посетители",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Неизвестен",
- "label.untitled": "Без заглавие",
- "label.update": "Актуализирай",
- "label.url": "URL адрес",
- "label.urls": "URL адреси",
- "label.user": "Потребител",
- "label.user-property": "User Property",
- "label.username": "Потребителско име",
- "label.users": "Потребители",
- "label.utm": "UTM",
- "label.utm-description": "Следете кампаниите си чрез UTM параметри.",
- "label.value": "Стойност",
- "label.view": "Преглед",
- "label.view-details": "Преглед на детайлите",
- "label.view-only": "Само за преглед",
- "label.views": "Прегледи",
- "label.views-per-visit": "Прегледи на посещение",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Посетители",
- "label.visits": "Посещения",
- "label.website": "Уебсайт",
- "label.website-id": "Идентификатор на уебсайт",
- "label.websites": "Уебсайтове",
- "label.window": "Прозорец",
- "label.yesterday": "Вчера",
- "message.action-confirmation": "Въведете {confirmation} в полето по-долу, за да потвърдите.",
- "message.active-users": "{x} {x, plural, one {активен един} other {активни други}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Сигурни ли сте, че искате да изтриете {target}?",
- "message.confirm-leave": "Сигурни ли сте, че искате да напуснете {target}?",
- "message.confirm-remove": "Сигурни ли сте, че искате да премахнете {target}?",
- "message.confirm-reset": "Сигурни ли сте, че искате да нулирате {target}?",
- "message.delete-team-warning": "Изтриването на екип ще изтрие и всички уебсайтове създадени от екипа.",
- "message.delete-website-warning": "Всички данни за уебсайта ще бъдат изтрити.",
- "message.error": "Възникна грешка.",
- "message.event-log": "{event} на {url}",
- "message.go-to-settings": "Отидете в настройките",
- "message.incorrect-username-password": "Неправилно потребителско име и/или парола.",
- "message.invalid-domain": "Невалиден домейн. Не включвайте http/https.",
- "message.min-password-length": "Минимална дължина от {n} символа",
- "message.new-version-available": "Има нова версия на Umami {version}!",
- "message.no-data-available": "Няма налични данни.",
- "message.no-event-data": "Няма налични данни за събитие.",
- "message.no-match-password": "Паролите не съвпадат.",
- "message.no-results-found": "Няма намерени резултати.",
- "message.no-team-websites": "Този екип няма никакви уебсайтове.",
- "message.no-teams": "Няма създадени екипи.",
- "message.no-users": "Няма потребители.",
- "message.no-websites-configured": "Нямате конфигурирани уебсайтове.",
- "message.page-not-found": "Страницата не е намерена",
- "message.reset-website": "За да нулирате този уебсайт, въведете {confirmation} в полето по-долу, за да потвърдите.",
- "message.reset-website-warning": "Всички статистически данни за този уебсайт ще бъдат изтрити, но вашите настройки ще останат непроменени.",
- "message.saved": "Запазено.",
- "message.share-url": "Статистиката за вашия уебсайт е публично достъпна на следния URL адрес:",
- "message.team-already-member": "Вече сте член на екипа.",
- "message.team-not-found": "Екипът не е намерен.",
- "message.team-websites-info": "Уебсайтовете могат да бъдат преглеждани от всеки член на екипа.",
- "message.tracking-code": "За активирате проследяването на статистиката във вашият уебсайт, поставете следния код в секцията ... намираща се в вашия HTML.",
- "message.transfer-team-website-to-user": "Искате да прехвърлите този уебсайт към вашия акаунт?",
- "message.transfer-user-website-to-team": "Изберете екипът на който да бъде прехвърлен уебсайта.",
- "message.transfer-website": "Прехвърли собствеността на уебсайта към вашия акаунт или към друг екип.",
- "message.triggered-event": "Активирано събитие",
- "message.user-deleted": "Потребителят е изтрит.",
- "message.viewed-page": "Страницата е видяна",
- "message.visitor-log": "Посетител от {country}, използващ {browser} на {os} {device}",
- "message.visitors-dropped-off": "Спад на посетителите"
-}
diff --git a/src/lang/bn-BD.json b/src/lang/bn-BD.json
deleted file mode 100644
index 7a22d76c1..000000000
--- a/src/lang/bn-BD.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "এক্সেস কোড",
- "label.actions": "অ্যাকশনস",
- "label.activity": "একটিভিটি দেখুন",
- "label.add": "যুক্ত করুন",
- "label.add-description": "বর্ননা যোগ করুন",
- "label.add-member": "সদস্য যোগ করুন",
- "label.add-step": "পদ যোগ করুন",
- "label.add-website": "ওয়েবসাইট যুক্ত করুন",
- "label.admin": "অ্যাডমিন",
- "label.after": "পরে",
- "label.all": "সবগুলো",
- "label.all-time": "সব সময়",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "পেছনে",
- "label.before": "পূর্বে",
- "label.bounce-rate": "উপরে উঠার হার",
- "label.breakdown": "ভাঙ্গন",
- "label.browser": "ব্রাউজার",
- "label.browsers": "ব্রাউজার সমূহ",
- "label.cancel": "বাতিল",
- "label.change-password": "পাসওয়ার্ড পরিবর্তন করুন",
- "label.cities": "শহরসমূহ",
- "label.city": "শহর",
- "label.clear-all": "সব মুছে ফেলুন",
- "label.compare": "Compare",
- "label.confirm": "নিশ্চিত করুন",
- "label.confirm-password": "পাসওয়ার্ড নিশ্চিত করুন",
- "label.contains": "রয়েছে",
- "label.continue": "পরবর্তিতে",
- "label.count": "Count",
- "label.countries": "দেশসমূহ",
- "label.country": "দেশ",
- "label.create": "তৈরি করুন",
- "label.create-report": "রিপোর্ট তৈরি করুন",
- "label.create-team": "দল তৈরি করুন",
- "label.create-user": "ব্যবহারকারী তৈরি করুন",
- "label.created": "তৈরি করা হয়েছে",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "বর্তমান পাসওয়ার্ড",
- "label.custom-range": "কাস্টম রেঞ্জ",
- "label.dashboard": "ড্যাশবোর্ড",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "তারিখের পরিসীমা",
- "label.day": "Day",
- "label.default-date-range": "ডিফল্ট তারিখের পরিসীমা",
- "label.delete": "মুছে ফেলুন",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "ওয়েবসাইট মুছুন",
- "label.description": "Description",
- "label.desktop": "ডেস্কটপ",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "ডিভাইস গুলো",
- "label.dismiss": "বাতিল",
- "label.does-not-contain": "Does not contain",
- "label.domain": "ডোমেইন",
- "label.dropoff": "Dropoff",
- "label.edit": "সম্পাদনা করুন",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "শেয়ার ইউআরএল শেয়ার করুন",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "ঘটনা",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "সম্মিলিত",
- "label.filter-raw": "অপরিশোধিত",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "ভাষা",
- "label.languages": "ভাষা",
- "label.laptop": "ল্যাপটপ",
- "label.last-days": "শেষ {x} দিন",
- "label.last-hours": "শেষ {x} ঘন্টা",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "লগিন",
- "label.logout": "লগ আউট",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "মুঠোফোন",
- "label.more": "আরও",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "নাম",
- "label.new-password": "নতুন পাসওয়ার্ড",
- "label.none": "কিছুই না",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "মালিক",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "পৃষ্ঠা পরিদর্শন গুলো",
- "label.pageTitle": "Page title",
- "label.pages": "পৃষ্ঠাগুলি",
- "label.password": "পাসওয়ার্ড",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "{name} দ্বারা চালিত",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "প্রোফাইল",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "সরাসরি",
- "label.referrer": "Referrer",
- "label.referrers": "রেফারার্স",
- "label.refresh": "রিফ্রেশ",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "প্রয়োজনীয়",
- "label.reset": "রিসেট",
- "label.reset-website": "ওয়েবসাইট রিসেট করুন",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "সংরক্ষণ",
- "label.screens": "স্ক্রিনগুলি",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "সেটিংস",
- "label.share-url": "ইউআরএল শেয়ার করুন",
- "label.single-day": "একদিন",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "ট্যাবলেট",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "থিম",
- "label.this-month": "এই মাস",
- "label.this-week": "এই সপ্তাহ",
- "label.this-year": "এই বছর",
- "label.timezone": "সময়স্থান",
- "label.title": "Title",
- "label.today": "আজ",
- "label.toggle-charts": "চার্ট পরিবর্তন করুন",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "ট্র্যাকিং কোড",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "অনন্য ভিজিটর",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "অজানা",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "ব্যবহারকারীর নাম",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "বিস্তারিত দেখুন",
- "label.view-only": "View only",
- "label.views": "ভিউস",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "গড় পরিদর্শনের সময়",
- "label.visitors": "পরিদর্শনার্থী",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "সবগুলো ওয়েবসাইট",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} বর্তমান {x, plural, one {visitor} other {visitors}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "আপনি কি নিশ্চিত যে আপনি {target} মুছতে চান?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "আপনি কি নিশ্চিত যে আপনি {target} এর পরিসংখ্যান পুনরায় সেট করতে চান?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "সমস্ত সম্পর্কিত ডেটা পাশাপাশি মুছে ফেলা হবে।",
- "message.error": "কিছু ভুল হয়েছে।",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "সেটিংস এ যান",
- "message.incorrect-username-password": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।",
- "message.invalid-domain": "ভুল ডোমেন",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "কোন তথ্য নেই।",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "পাসওয়ার্ড মেলে না",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "কোনও ওয়েবসাইট কনফিগার করা নেই।",
- "message.page-not-found": "পৃষ্ঠা খুঁজে পাওয়া যায়নি।",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "এই ওয়েবসাইটের সমস্ত পরিসংখ্যান মুছে ফেলা হবে, তবে আপনার ট্র্যাকিং কোডটি অক্ষত থাকবে।",
- "message.saved": "সংরক্ষিত হয়েছে।",
- "message.share-url": "এটি {target} এর জন্য প্রকাশ্যে শেয়ার করার ইউআরএল।",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "ট্র্যাকিং কোড",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "{country} থেকে একজন ভিসিটর {ব্রাউজার}, ব্যবহার করছেন {os} {device} এর মধ্যে।",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/bs-BA.json b/src/lang/bs-BA.json
deleted file mode 100644
index b9d9e8a8e..000000000
--- a/src/lang/bs-BA.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Pristupni kod",
- "label.actions": "Akcije",
- "label.activity": "Log aktivnosti",
- "label.add": "Dodaj",
- "label.add-description": "Dodaj opis",
- "label.add-member": "Dodaj člana",
- "label.add-step": "Dodaj korak",
- "label.add-website": "Dodaj web stranicu",
- "label.admin": "Administrator",
- "label.after": "Nakon",
- "label.all": "Sve",
- "label.all-time": "Cijelo vrijeme",
- "label.analytics": "Analitike",
- "label.average": "Prosjek",
- "label.back": "Nazad",
- "label.before": "Prije",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Pregled po kategorijama",
- "label.browser": "Browser",
- "label.browsers": "Browseri",
- "label.cancel": "Otkaži",
- "label.change-password": "Promijeni šifru",
- "label.cities": "Gradovi",
- "label.city": "Grad",
- "label.clear-all": "Očisti sve",
- "label.compare": "Compare",
- "label.confirm": "Potvrdi",
- "label.confirm-password": "Potvrdi šifru",
- "label.contains": "Sadrži",
- "label.continue": "Nastavi",
- "label.count": "Count",
- "label.countries": "Zemlje",
- "label.country": "Zemlja",
- "label.create": "Kreiraj",
- "label.create-report": "Kreiraj izvještaj",
- "label.create-team": "Kreiraj tim",
- "label.create-user": "Kreiraj korisnika",
- "label.created": "Kreiraj",
- "label.created-by": "Kreirao",
- "label.current": "Current",
- "label.current-password": "Trenutna šifra",
- "label.custom-range": "Proizvoljni raspon",
- "label.dashboard": "Dashboard",
- "label.data": "Podaci",
- "label.date": "Datum",
- "label.date-range": "Datumski raspon",
- "label.day": "Dan",
- "label.default-date-range": "Defaultni datumski raspon",
- "label.delete": "Izbriši",
- "label.delete-report": "Izbriši report",
- "label.delete-team": "Izbriši tim",
- "label.delete-user": "Izbriši korisnika",
- "label.delete-website": "Izbriši web stranicu",
- "label.description": "Opis",
- "label.desktop": "Desktop",
- "label.details": "Detalji",
- "label.device": "Uređaj",
- "label.devices": "Uređaji",
- "label.dismiss": "Odbaci",
- "label.does-not-contain": "Ne sadrži",
- "label.domain": "Domena",
- "label.dropoff": "Dropoff",
- "label.edit": "Uredi",
- "label.edit-dashboard": "Uredi dashboard",
- "label.edit-member": "Uredi člana",
- "label.enable-share-url": "Omogući URL za dijeljenje",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Događaj",
- "label.event-data": "Podaci o događaju",
- "label.events": "Događaji",
- "label.exit": "Exit URL",
- "label.false": "Ne",
- "label.field": "Polje",
- "label.fields": "Polja",
- "label.filter": "Filter",
- "label.filter-combined": "Kombinovano",
- "label.filter-raw": "Sirovo",
- "label.filters": "Filtri",
- "label.first-seen": "First seen",
- "label.funnel": "Lijevak",
- "label.funnel-description": "Razumite koverziju i drop-off učestalost korisnika.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Veće od",
- "label.greater-than-equals": "Veće od ili jednako",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Uvidi",
- "label.insights-description": "Zaronite dublje u vaše podatke korištenjem segmenata i filtera",
- "label.is": "Jeste",
- "label.is-not": "Nije",
- "label.is-not-set": "Nije setano",
- "label.is-set": "Jeste setano",
- "label.join": "Učlani se",
- "label.join-team": "Učlani se u tim",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Jezik",
- "label.languages": "Jezici",
- "label.laptop": "Laptop",
- "label.last-days": "Zadnjih {x} dana",
- "label.last-hours": "Zadnjih {x} sati",
- "label.last-months": "Zadnjih {x} mjeseci",
- "label.last-seen": "Last seen",
- "label.leave": "Napusti",
- "label.leave-team": "Napusti tim",
- "label.less-than": "Manje od",
- "label.less-than-equals": "Manje od ili jednako",
- "label.login": "Login",
- "label.logout": "Logout",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Član",
- "label.members": "Članovi",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "Više",
- "label.my-account": "Moj račun",
- "label.my-websites": "Moje web stranice",
- "label.name": "Ime",
- "label.new-password": "Nova šifra",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Pregled",
- "label.owner": "Vlasnik",
- "label.page-of": "Strana {current} od {total}",
- "label.page-views": "Pregleda stranica",
- "label.pageTitle": "Naslov stranice",
- "label.pages": "Stranice",
- "label.password": "Šifra",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Omogućeno s {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queryji",
- "label.query": "Query",
- "label.query-parameters": "Query parametri",
- "label.realtime": "Realno vrijeme",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Refresh",
- "label.regenerate": "Regeneriši",
- "label.region": "Region",
- "label.regions": "Regioni",
- "label.remove": "Ukloni",
- "label.remove-member": "Ukloni člana",
- "label.reports": "Izvještaji",
- "label.required": "Required",
- "label.reset": "Resetuj",
- "label.reset-website": "Resetuj web stranicu",
- "label.retention": "Retention",
- "label.retention-description": "Izmjeri 'ljepljivost' svoje web stranice praćenjem koliko često set korisnici vraćaju.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rola",
- "label.run-query": "Pokreni query",
- "label.save": "Sačuvaj",
- "label.screens": "Ekrani",
- "label.search": "Traži",
- "label.select": "Odaberi",
- "label.select-date": "Odaberi datum",
- "label.select-role": "Odaberi rolu",
- "label.select-website": "Odaberi web stranicu",
- "label.session": "Session",
- "label.sessions": "Sesije",
- "label.settings": "Postavke",
- "label.share-url": "Share URL",
- "label.single-day": "Jedan dan",
- "label.start-step": "Start Step",
- "label.steps": "Koraci",
- "label.sum": "Suma",
- "label.tablet": "Tablet",
- "label.team": "Tim",
- "label.team-id": "Tim ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Član tima",
- "label.team-name": "Naziv tima",
- "label.team-owner": "Vlasnik tima",
- "label.team-view-only": "Samo tim može vidjeti",
- "label.team-websites": "Timske web stranice",
- "label.teams": "Timovi",
- "label.theme": "Teme",
- "label.this-month": "Ovaj mjesec",
- "label.this-week": "Ova sedmica",
- "label.this-year": "Ova godina",
- "label.timezone": "Vremenska zona",
- "label.title": "Naslov",
- "label.today": "Danas",
- "label.toggle-charts": "Uklj/isklj grafikone",
- "label.total": "Ukupno",
- "label.total-records": "Ukupno redova",
- "label.tracking-code": "Kod za praćenje",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer web stranice",
- "label.true": "Da",
- "label.type": "Tip",
- "label.unique": "Jedinstveno",
- "label.unique-visitors": "Jedinstvenih posjetitelja",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Nepoznato",
- "label.untitled": "Bezimeno",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Korisnik",
- "label.user-property": "User Property",
- "label.username": "Korisničko ime",
- "label.users": "Korisnici",
- "label.utm": "UTM",
- "label.utm-description": "Pratite vaše kampanje kroz UTM parametre.",
- "label.value": "Vrijednost",
- "label.view": "Pregled",
- "label.view-details": "Pogledaj detalje",
- "label.view-only": "Samo gledanje",
- "label.views": "Pregledi",
- "label.views-per-visit": "Pregledi po posjeti",
- "label.visit-duration": "Prosječno vrijeme posjete",
- "label.visitors": "Posjetitelji",
- "label.visits": "Posjete",
- "label.website": "Web stranica",
- "label.website-id": "ID web stranice",
- "label.websites": "Web stranice",
- "label.window": "Prozor",
- "label.yesterday": "Jučer",
- "message.action-confirmation": "Unesite {confirmation} ispod da potvrdite.",
- "message.active-users": "{x} trenutno {x, plural, one {posjetitelj} other {posjetitelja}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Jeste li sigurni da želite obrisati {target}?",
- "message.confirm-leave": "Jeste li sigurni da želite napustiti {target}?",
- "message.confirm-remove": "Jeste li sigurni da želite ukloniti {target}?",
- "message.confirm-reset": "Jeste li sigurni da želite resetovati {target}?",
- "message.delete-team-warning": "Brisanje tima će također obrisati sve web stranice tima.",
- "message.delete-website-warning": "Svi podaci web stranice biće obrisani.",
- "message.error": "Nešto je pošlo po zlu.",
- "message.event-log": "{event} na {url}",
- "message.go-to-settings": "Idi na postavke",
- "message.incorrect-username-password": "Pogrešno korisničko ime i/ili šifra.",
- "message.invalid-domain": "Nevalidna domena. Ne uključujte http/https.",
- "message.min-password-length": "Minimalna dužina od {n} karaktera",
- "message.new-version-available": "Nova verzija Umami {version} je dostupna!",
- "message.no-data-available": "Nema dostupnih podataka.",
- "message.no-event-data": "Nema dostupnih podataka o događajima.",
- "message.no-match-password": "Šifre se ne poklapaju.",
- "message.no-results-found": "Nema rezultata.",
- "message.no-team-websites": "Ovaj tim nema nikakvih web stranica.",
- "message.no-teams": "Niste kreirali nijedan tim.",
- "message.no-users": "Nema nikakvih korisnika.",
- "message.no-websites-configured": "Nemate iskonfigurisanu nijednu web stranicu.",
- "message.page-not-found": "Stranica nije pronađena",
- "message.reset-website": "Da resetujete ovu web stranicu, upišite {confirmation} dole da potvrdite.",
- "message.reset-website-warning": "Sve statistike o ovoj web stranici će biti obrisane, ali vaše postavke neće biti dirane.",
- "message.saved": "Sačuvano.",
- "message.share-url": "Statistike vaše web stranice su javno dostupne na sljedećem URLu:",
- "message.team-already-member": "Već ste član tima.",
- "message.team-not-found": "Tim nije pronađen.",
- "message.team-websites-info": "Web stranice može vidjeti bilo ko iz tima.",
- "message.tracking-code": "Da pratite statistike ove web stranice, stavite sljedeći kod u ... sekciju vašeg HTMLa.",
- "message.transfer-team-website-to-user": "Prebacite ovu web stranicu na vaš račun?",
- "message.transfer-user-website-to-team": "Odaberite tim u koji želite prebaciti ovu web stranicu.",
- "message.transfer-website": "Prebacite vlasništvo web stranice na vaš račun ili drugi tim.",
- "message.triggered-event": "Trigerovani događaj",
- "message.user-deleted": "Korisnik obrisan.",
- "message.viewed-page": "Pogledana stranica",
- "message.visitor-log": "Posjetitelj iz {country} koristi {browser} na {os} {device}",
- "message.visitors-dropped-off": "Posjetitelji koji su napustili stranicu"
-}
diff --git a/src/lang/ca-ES.json b/src/lang/ca-ES.json
deleted file mode 100644
index 3b6333379..000000000
--- a/src/lang/ca-ES.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Codi d'accés",
- "label.actions": "Accions",
- "label.activity": "Registre d'activitat",
- "label.add": "Afegir",
- "label.add-description": "Afegir descripció",
- "label.add-member": "Afegir membre",
- "label.add-step": "Afegir pas",
- "label.add-website": "Afegir lloc web",
- "label.admin": "Administrador",
- "label.after": "Després",
- "label.all": "Tots",
- "label.all-time": "Sempre",
- "label.analytics": "Analítiques",
- "label.average": "Mitjana",
- "label.back": "Enrere",
- "label.before": "Abans",
- "label.bounce-rate": "Percentatge de rebot",
- "label.breakdown": "Desglossament",
- "label.browser": "Navegador",
- "label.browsers": "Navegadors",
- "label.cancel": "Cancel·la",
- "label.change-password": "Canvia la contrasenya",
- "label.cities": "Ciutats",
- "label.city": "Ciutat",
- "label.clear-all": "Netejar tot",
- "label.compare": "Comparar",
- "label.confirm": "Confirmar",
- "label.confirm-password": "Confirma la contrasenya",
- "label.contains": "Conté",
- "label.continue": "Continuar",
- "label.count": "Recompte",
- "label.countries": "Països",
- "label.country": "País",
- "label.create": "Crear",
- "label.create-report": "Crear informe",
- "label.create-team": "Crear equip",
- "label.create-user": "Crear usuari",
- "label.created": "Creat",
- "label.created-by": "Creat Per",
- "label.current": "Actual",
- "label.current-password": "Contrasenya actual",
- "label.custom-range": "Rang personalitzat",
- "label.dashboard": "Panell",
- "label.data": "Dades",
- "label.date": "Data",
- "label.date-range": "Interval de dates",
- "label.day": "Dia",
- "label.default-date-range": "Interval de dates per defecte",
- "label.delete": "Esborra",
- "label.delete-report": "Eliminar informe",
- "label.delete-team": "Eliminar equip",
- "label.delete-user": "Eliminar usuari",
- "label.delete-website": "Esborra el lloc web",
- "label.description": "Descripció",
- "label.desktop": "Escriptori",
- "label.details": "Detalls",
- "label.device": "Dispositiu",
- "label.devices": "Dispositius",
- "label.dismiss": "Descarta",
- "label.does-not-contain": "No conté",
- "label.domain": "Domini",
- "label.dropoff": "Abandonament",
- "label.edit": "Edita",
- "label.edit-dashboard": "Edita panell",
- "label.edit-member": "Edita membre",
- "label.enable-share-url": "Activa l'enllaç per compartir",
- "label.end-step": "Pas Final",
- "label.entry": "URL d'entrada",
- "label.event": "Esdeveniment",
- "label.event-data": "Dades de l'esdeveniment",
- "label.events": "Esdeveniments",
- "label.exit": "URL de sortida",
- "label.false": "Fals",
- "label.field": "Camp",
- "label.fields": "Camps",
- "label.filter": "Filtre",
- "label.filter-combined": "Combinat",
- "label.filter-raw": "En cru",
- "label.filters": "Filtres",
- "label.first-seen": "Vist per primer cop",
- "label.funnel": "Embut",
- "label.funnel-description": "Entengui la taxa de conversió i abandonament dels usuaris.",
- "label.goal": "Meta",
- "label.goals": "Metes",
- "label.goals-description": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments.",
- "label.greater-than": "Més gran que",
- "label.greater-than-equals": "Més gran que o igual a",
- "label.host": "Amfitrió",
- "label.hosts": "Amfitrions",
- "label.insights": "Insights",
- "label.insights-description": "Aprofundeixi en les seves dades mitjançant l'ús de segments i filtres.",
- "label.is": "És igual a",
- "label.is-not": "No és igual a",
- "label.is-not-set": "No està establert",
- "label.is-set": "Està establert",
- "label.join": "Unir",
- "label.join-team": "Unir-se al equip",
- "label.journey": "Trajecte",
- "label.journey-description": "Entengui com naveguen els usuaris pel seu lloc web.",
- "label.language": "Idioma",
- "label.languages": "Idiomes",
- "label.laptop": "Portàtil",
- "label.last-days": "Últims {x} dies",
- "label.last-hours": "Últimes {x} hores",
- "label.last-months": "Últims {x} mesos",
- "label.last-seen": "Vist per últim cop",
- "label.leave": "Abandonar",
- "label.leave-team": "Abandonar equip",
- "label.less-than": "Menor que",
- "label.less-than-equals": "Menor que o igual a",
- "label.login": "Connecta't",
- "label.logout": "Desconnecta't",
- "label.manage": "Administrar",
- "label.manager": "Manager",
- "label.max": "Màx",
- "label.member": "Membre",
- "label.members": "Membres",
- "label.min": "Mín",
- "label.mobile": "Mòbil",
- "label.more": "Més",
- "label.my-account": "El meu compte",
- "label.my-websites": "Els meus llocs web",
- "label.name": "Nom",
- "label.new-password": "Contrasenya nova",
- "label.none": "Cap",
- "label.number-of-records": "{x} {x, plural, one {registre} other {registres}}",
- "label.ok": "OK",
- "label.os": "SO",
- "label.overview": "Resum",
- "label.owner": "Propietari",
- "label.page-of": "Pàgina {current} de {total}",
- "label.page-views": "Pàgines vistes",
- "label.pageTitle": "Títol de la pàgina",
- "label.pages": "Pàgines",
- "label.password": "Contrasenya",
- "label.path": "Camí",
- "label.paths": "Camins",
- "label.powered-by": "Funciona amb {name}",
- "label.previous": "Anterior",
- "label.previous-period": "Període anterior",
- "label.previous-year": "Any anterior",
- "label.profile": "Perfil",
- "label.properties": "Propietats",
- "label.property": "Propietat",
- "label.queries": "Consultes",
- "label.query": "Consulta",
- "label.query-parameters": "Paràmetres de consulta",
- "label.realtime": "Temps real",
- "label.referrer": "Referent",
- "label.referrers": "Referents",
- "label.refresh": "Refresca",
- "label.regenerate": "Regenerar",
- "label.region": "Regió",
- "label.regions": "Regions",
- "label.remove": "Treure",
- "label.remove-member": "Eliminar membre",
- "label.reports": "Informes",
- "label.required": "Obligatori",
- "label.reset": "Restableix",
- "label.reset-website": "Restableix estadístiques",
- "label.retention": "Retenció",
- "label.retention-description": "Mesuri la retenció del seu lloc web fent un seguiment de la freqüència amb què tornen els usuaris.",
- "label.revenue": "Ingressos",
- "label.revenue-description": "Observi els seus ingressos al llarg del temps.",
- "label.revenue-property": "Propietat d'Ingressos",
- "label.role": "Rol",
- "label.run-query": "Executar consulta",
- "label.save": "Desa",
- "label.screens": "Pantalles",
- "label.search": "Buscar",
- "label.select": "Seleccionar",
- "label.select-date": "Seleccionar data",
- "label.select-role": "Seleccionar rol",
- "label.select-website": "Seleccionar lloc web",
- "label.session": "Sessió",
- "label.sessions": "Sessions",
- "label.settings": "Configuració",
- "label.share-url": "Enllaç per compartir",
- "label.single-day": "Un sol dia",
- "label.start-step": "Pas inicial",
- "label.steps": "Pasos",
- "label.sum": "Suma",
- "label.tablet": "Tauleta",
- "label.team": "Equip",
- "label.team-id": "ID del equip",
- "label.team-manager": "Responsable d'equip",
- "label.team-member": "Membre de l'equip",
- "label.team-name": "Nom de l'equip",
- "label.team-owner": "Propietari de l'equip",
- "label.team-view-only": "Vista només de l'equip",
- "label.team-websites": "Llocs web de l'equip",
- "label.teams": "Equips",
- "label.theme": "Tema",
- "label.this-month": "Aquest mes",
- "label.this-week": "Aquesta setmana",
- "label.this-year": "Aquest any",
- "label.timezone": "Zona horària",
- "label.title": "Títol",
- "label.today": "Avui",
- "label.toggle-charts": "Mostra/amaga gràfics",
- "label.total": "Total",
- "label.total-records": "Total de registres",
- "label.tracking-code": "Codi de seguiment",
- "label.transactions": "Transaccions",
- "label.transfer": "Transferir",
- "label.transfer-website": "Transferir lloc web",
- "label.true": "Cert",
- "label.type": "Tipus",
- "label.unique": "Únic",
- "label.unique-visitors": "Visitants únics",
- "label.uniqueCustomers": "Clients Únics",
- "label.unknown": "Desconegut",
- "label.untitled": "Sense títol",
- "label.update": "Actualitzar",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Usuari",
- "label.user-property": "Propietat d'Usuari",
- "label.username": "Nom d'usuari",
- "label.users": "Usuaris",
- "label.utm": "UTM",
- "label.utm-description": "Rastreji les seves campanyes a través de paràmetres UTM.",
- "label.value": "Valor",
- "label.view": "Visualitzar",
- "label.view-details": "Veure els detalls",
- "label.view-only": "Només veure",
- "label.views": "Vistes",
- "label.views-per-visit": "Vistes per visita",
- "label.visit-duration": "Temps mitjà de visita",
- "label.visitors": "Visitants",
- "label.visits": "Visites",
- "label.website": "Lloc web",
- "label.website-id": "ID del lloc web",
- "label.websites": "Llocs web",
- "label.window": "Finestra",
- "label.yesterday": "Ahir",
- "message.action-confirmation": "Escrigui {confirmation} al cuadre inferior per confirmar.",
- "message.active-users": "{x} {x, plural, one {visitant actual} other {visitants actuals}}",
- "message.collected-data": "Dades recol·lectades",
- "message.confirm-delete": "Segur que vol esborrar {target}?",
- "message.confirm-leave": "Segur que vol abandonar {target}?",
- "message.confirm-remove": "Segur que vol eliminar {target}?",
- "message.confirm-reset": "Segur que vol restablir les estadístiques de {target}?",
- "message.delete-team-warning": "Al eliminar un equip també s'eliminaran tots els llocs web de l'equip.",
- "message.delete-website-warning": "També s'esborraran totes les dades relacionades.",
- "message.error": "S'ha produït un error.",
- "message.event-log": "{event} a {url}",
- "message.go-to-settings": "Vés a la configuració",
- "message.incorrect-username-password": "Nom d'usuari o contrasenya incorrectes.",
- "message.invalid-domain": "Domini invàlid",
- "message.min-password-length": "Longitud mínima de {n} caràcters",
- "message.new-version-available": "Una nova versió d'Umami {version} està disponible!",
- "message.no-data-available": "No hi ha dades disponibles.",
- "message.no-event-data": "No hi ha dades d'esdeveniments disponibles.",
- "message.no-match-password": "Les contrasenyes no coincideixen",
- "message.no-results-found": "No s'han trobat resultats.",
- "message.no-team-websites": "Aquest equip no té cap lloc web.",
- "message.no-teams": "No ha creat cap equip.",
- "message.no-users": "No hi ha cap usuari.",
- "message.no-websites-configured": "No hi ha cap lloc web configurat.",
- "message.page-not-found": "No s'ha trobat la pàgina.",
- "message.reset-website": "Per restablir aquest lloc web, escrigui {confirmation} al cuadre inferior per confirmar.",
- "message.reset-website-warning": "S'esborraran totes les estadístiques per aquest lloc web, però el codi de seguiment es mantindrà.",
- "message.saved": "S'ha desat amb èxit.",
- "message.share-url": "Aquest és l'enllaç públic per compartir de {target}.",
- "message.team-already-member": "Ja és membre d'aquest equip.",
- "message.team-not-found": "Equip no trobat.",
- "message.team-websites-info": "Els llocs web poden ser visualitzats per qualsevol membre de l'equip.",
- "message.tracking-code": "Codi de seguiment",
- "message.transfer-team-website-to-user": "Transferir aquest lloc web al seu compte?",
- "message.transfer-user-website-to-team": "Seleccioni l'equip al qui transferir aquest lloc web.",
- "message.transfer-website": "Transferir la propietat del lloc web al seu compte o a un altre equip.",
- "message.triggered-event": "Esdeveniment desencadenat",
- "message.user-deleted": "Usuari eliminat.",
- "message.viewed-page": "Pàgina vista",
- "message.visitor-log": "Visitant de {country} usant {browser} a {os} {device}",
- "message.visitors-dropped-off": "Visitants han sortit"
-}
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
deleted file mode 100644
index 8adc5e368..000000000
--- a/src/lang/cs-CZ.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Přístupový kód",
- "label.actions": "Akce",
- "label.activity": "Log aktivity",
- "label.add": "Přidat",
- "label.add-description": "Přidat popis",
- "label.add-member": "Přidat člena",
- "label.add-step": "Přidat krok",
- "label.add-website": "Přidat web",
- "label.admin": "Administrátor",
- "label.after": "Po",
- "label.all": "Vše",
- "label.all-time": "Celá doba",
- "label.analytics": "Analytics",
- "label.average": "Průměr",
- "label.back": "Zpět",
- "label.before": "Před",
- "label.bounce-rate": "Okamžité opuštění",
- "label.breakdown": "Breakdown",
- "label.browser": "Prohlížeč",
- "label.browsers": "Prohlížeče",
- "label.cancel": "Zrušit",
- "label.change-password": "Změnit heslo",
- "label.cities": "Města",
- "label.city": "Město",
- "label.clear-all": "Vyčistit vše",
- "label.compare": "Porovnat",
- "label.confirm": "Potvrdit",
- "label.confirm-password": "Potvrdit heslo",
- "label.contains": "Obsahuje",
- "label.continue": "Pokračovat",
- "label.count": "Počet",
- "label.countries": "Státy",
- "label.country": "Stát",
- "label.create": "Vytvořit",
- "label.create-report": "Vytvořit hlášení",
- "label.create-team": "Vytvořit tým",
- "label.create-user": "Vytvořit uživatele",
- "label.created": "Vytvořeno",
- "label.created-by": "Created By",
- "label.current": "Aktuální",
- "label.current-password": "Aktuální heslo",
- "label.custom-range": "Vlastní rozsah",
- "label.dashboard": "Přehled",
- "label.data": "Data",
- "label.date": "Datum",
- "label.date-range": "Období",
- "label.day": "Den",
- "label.default-date-range": "Výchozí období",
- "label.delete": "Smazat",
- "label.delete-report": "Smazat hlášení",
- "label.delete-team": "Smazat tým",
- "label.delete-user": "Smazat uživatele",
- "label.delete-website": "Smazat web",
- "label.description": "Popis",
- "label.desktop": "Stolní počítač",
- "label.details": "Detaily",
- "label.device": "Zařízení",
- "label.devices": "Zařízení",
- "label.dismiss": "Odejít",
- "label.does-not-contain": "Neobsahuje",
- "label.domain": "Doména",
- "label.dropoff": "Dropoff",
- "label.edit": "Upravit",
- "label.edit-dashboard": "Upravit dashboard",
- "label.edit-member": "Upravit člena",
- "label.enable-share-url": "Povolit sdílení URL",
- "label.end-step": "End Step",
- "label.entry": "Vstupní URL",
- "label.event": "Událost",
- "label.event-data": "Event data",
- "label.events": "Události",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Pole",
- "label.fields": "Fields",
- "label.filter": "Filtr",
- "label.filter-combined": "Kombinace",
- "label.filter-raw": "Nezpracované",
- "label.filters": "Filtry",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Cíl",
- "label.goals": "Cíle",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Jazyk",
- "label.languages": "Jazyky",
- "label.laptop": "Přenosný počítač",
- "label.last-days": "Posledních {x} dnů",
- "label.last-hours": "Posledních {x} hodin",
- "label.last-months": "Posledních {x} měsíců",
- "label.last-seen": "Last seen",
- "label.leave": "Opustit",
- "label.leave-team": "Opustit tým",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Přihlásit",
- "label.logout": "Odhlásit",
- "label.manage": "Spravovat",
- "label.manager": "Správce",
- "label.max": "Max",
- "label.member": "Člen",
- "label.members": "Členové",
- "label.min": "Min",
- "label.mobile": "Mobilní telefon",
- "label.more": "Více",
- "label.my-account": "Můj účet",
- "label.my-websites": "Mé weby",
- "label.name": "Jméno",
- "label.new-password": "Nové heslo",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Přehled",
- "label.owner": "Vlastník",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Zobrazení stránek",
- "label.pageTitle": "Název stránky",
- "label.pages": "Stránky",
- "label.password": "Heslo",
- "label.path": "Cesta",
- "label.paths": "Cesty",
- "label.powered-by": "Běží na {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Aktuálně",
- "label.referrer": "Referrer",
- "label.referrers": "Odkazy",
- "label.refresh": "Obnovit",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Vyžadováno",
- "label.reset": "Reset",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Uložit",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Nastavení",
- "label.share-url": "Sdílet URL",
- "label.single-day": "Jeden den",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Tento měsíc",
- "label.this-week": "Tento týden",
- "label.this-year": "Tento rok",
- "label.timezone": "Časová zóna",
- "label.title": "Title",
- "label.today": "Dnes",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Sledovací kód",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Jedinečné návštěvy",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Neznámý",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Uživatelské jméno",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Zobrazit detaily",
- "label.view-only": "View only",
- "label.views": "Zobrazení",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Průměrný čas návštěvy",
- "label.visitors": "Návštěvníci",
- "label.visits": "Návštěvy",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Weby",
- "label.window": "Okno",
- "label.yesterday": "Včera",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} aktuálně {x, plural, one {návštěvník} other {návštěvníci}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Opravdu smazat {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Všechna související data budou také smazána.",
- "message.error": "Něco se pokazilo.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Jít do nastavení",
- "message.incorrect-username-password": "Nesprávné jméno/heslo.",
- "message.invalid-domain": "Neplatná doména",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Žádná data.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Hesla se neschodují",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Nemáte nastavený žádný web.",
- "message.page-not-found": "Stránka nenalezena.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Úspěšně uloženo.",
- "message.share-url": "Toto je sdílené URL pro {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Sledovací kód",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Návštěvník z {country} s prohlížečem {browser} na {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
deleted file mode 100644
index 143d079dc..000000000
--- a/src/lang/da-DK.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Handlinger",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Tilføj hjemmeside",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "Alle",
- "label.all-time": "Altid",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Tilbage",
- "label.before": "Before",
- "label.bounce-rate": "Afvisningsprocent",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsere",
- "label.cancel": "Afvis",
- "label.change-password": "Skift adgangskode",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Godkendt adgangskode",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Lande",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Nuværende adgangskode",
- "label.custom-range": "Tilpasset interval",
- "label.dashboard": "Betjeningspanel",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Datointerval",
- "label.day": "Day",
- "label.default-date-range": "Standard datointerval",
- "label.delete": "Slet",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Slet hjemmeside",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Enheder",
- "label.dismiss": "Afvis",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domæne",
- "label.dropoff": "Dropoff",
- "label.edit": "Rediger",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Aktivér delings-URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Hændelser",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Kombineret",
- "label.filter-raw": "Rå",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Sprog",
- "label.languages": "Sprog",
- "label.laptop": "Laptop",
- "label.last-days": "Sidste {x} dage",
- "label.last-hours": "Sidste {x} timer",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Log ind",
- "label.logout": "Log ud",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobil",
- "label.more": "Mere",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Navn",
- "label.new-password": "Ny adgangskode",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Ejer",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Sidevisninger",
- "label.pageTitle": "Page title",
- "label.pages": "Sider",
- "label.password": "Adgangskode",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Drevet af {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Realtid",
- "label.referrer": "Referrer",
- "label.referrers": "Henvisninger",
- "label.refresh": "Opdater",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Påkrævet",
- "label.reset": "Nulstil",
- "label.reset-website": "Nulstil statistikker",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Gem",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Indstillinger",
- "label.share-url": "Del URL",
- "label.single-day": "Enkelt dag",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Tema",
- "label.this-month": "Denne måned",
- "label.this-week": "Denne uge",
- "label.this-year": "Dette år",
- "label.timezone": "Tidszone",
- "label.title": "Title",
- "label.today": "Idag",
- "label.toggle-charts": "Ændre graf",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Sporingskode",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unikke besøgende",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Ukendt",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Brugernavn",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Vis detajler",
- "label.view-only": "View only",
- "label.views": "Visninger",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Gennemsnitlig besøgstid",
- "label.visitors": "Besøgende",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Hjemmesider",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} nuværende {x, plural, one {bruger} other {brugere}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Er du sikker på at du vil slette {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Er du sikker på at du ville nulstille {target}'s statistikker?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Alle tilknyttede data slettes også.",
- "message.error": "Noget gik galt.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Gå til betjeningspanel",
- "message.incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
- "message.invalid-domain": "Ugyldigt domæne",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Ingen data tilgængelig.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Adgangskoderne matcher ikke",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Du har ikke konfigureret nogen hjemmesider.",
- "message.page-not-found": "Side ikke fundet.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "Alle statistikker for denne hjemmeside ville blive slettet, men sporingskode ville forblive intakt.",
- "message.saved": "Gemt!",
- "message.share-url": "Dette er den offentlige delings-URL til {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Sporingskode",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Besøgende fra {country} bruger {browser} på {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
deleted file mode 100644
index e99ecaca2..000000000
--- a/src/lang/de-CH.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Zuegangscode",
- "label.actions": "Aktione",
- "label.activity": "Aktivitätsverlauf",
- "label.add": "hinzuefüege",
- "label.add-description": "Beschriibig hinzuefüege",
- "label.add-member": "Mitglied hinzuefüege",
- "label.add-step": "Schritt hinzuefüege",
- "label.add-website": "Websiite hinzuefüege",
- "label.admin": "Administrator",
- "label.after": "Nach",
- "label.all": "Alli",
- "label.all-time": "Gsamte Zitruum",
- "label.analytics": "Analytics",
- "label.average": "Durchschnitt",
- "label.back": "Zrugg",
- "label.before": "Vor",
- "label.bounce-rate": "Absprungsrate",
- "label.breakdown": "Uufschlüsselig",
- "label.browser": "Browser",
- "label.browsers": "Browser",
- "label.cancel": "Abbreche",
- "label.change-password": "Passwort ändere",
- "label.cities": "Städt",
- "label.city": "Stadt",
- "label.clear-all": "Alles lösche",
- "label.compare": "Vergliiche",
- "label.confirm": "Bestätige",
- "label.confirm-password": "Passwort widerhole",
- "label.contains": "Enthaltet",
- "label.continue": "Wiiter",
- "label.count": "Azahl",
- "label.countries": "Länder",
- "label.country": "Land",
- "label.create": "Erstelle",
- "label.create-report": "Bricht erstelle",
- "label.create-team": "Team erstelle",
- "label.create-user": "Benutzer erstelle",
- "label.created": "Erstellt",
- "label.created-by": "Created By",
- "label.current": "Aktuell",
- "label.current-password": "Aktuells Passwort",
- "label.custom-range": "Benutzerdefinierte Bereich",
- "label.dashboard": "Übersicht",
- "label.data": "Datä",
- "label.date": "Datum",
- "label.date-range": "Datumsbereich",
- "label.day": "Tag",
- "label.default-date-range": "Voriigstellte Datumsbereich",
- "label.delete": "Lösche",
- "label.delete-report": "Bricht lösche",
- "label.delete-team": "Team lösche",
- "label.delete-user": "Benutzer lösche",
- "label.delete-website": "Websiite lösche",
- "label.description": "Beschriibig",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Grät",
- "label.devices": "Grät",
- "label.dismiss": "Verwärfe",
- "label.does-not-contain": "Enthaltet nid",
- "label.domain": "Domain",
- "label.dropoff": "Absprung",
- "label.edit": "Bearbeite",
- "label.edit-dashboard": "Dashboard bearbeite",
- "label.edit-member": "Mitglied bearbeite",
- "label.enable-share-url": "Freigab-URL aktiviere",
- "label.end-step": "Schlussschritt",
- "label.entry": "Iigangs URL",
- "label.event": "Ereigniss",
- "label.event-data": "Ereigniss Date",
- "label.events": "Ereigniss",
- "label.exit": "Uusgangs URL",
- "label.false": "Falsch",
- "label.field": "Fäld",
- "label.fields": "Fälder",
- "label.filter": "Filter",
- "label.filter-combined": "Kombiniert",
- "label.filter-raw": "Rohdate",
- "label.filters": "Filters",
- "label.first-seen": "Erstmal gse",
- "label.funnel": "Tunnel",
- "label.funnel-description": "Verstönd Sie d Konversions- und Abspruungsrate vo Nutzer.",
- "label.goal": "Ziel",
- "label.goals": "Ziele",
- "label.goals-description": "verfolged Sie Ihri Ziel für Siitenufrüef und Ereigniss.",
- "label.greater-than": "Grösser als",
- "label.greater-than-equals": "Grösser oder gliich",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Iiblick",
- "label.insights-description": "Vertüfed Sie sich i Ihri Date, mit Hilf vo Segment und Filter.",
- "label.is": "Isch",
- "label.is-not": "Isch nid",
- "label.is-not-set": "Isch ned gsetzt",
- "label.is-set": "Isch gsetzt",
- "label.join": "Biträte",
- "label.join-team": "Team biträte",
- "label.journey": "Reis",
- "label.journey-description": "Verstönd Sie, wie Nutzer dur Ihri Website navigiered.",
- "label.language": "Sprach",
- "label.languages": "Sprache",
- "label.laptop": "Laptop",
- "label.last-days": "Letzti {x} Täg",
- "label.last-hours": "Letzti {x} Stunde",
- "label.last-months": "Letzti {x} Mönet",
- "label.last-seen": "Zletzt gse",
- "label.leave": "Verlah",
- "label.leave-team": "Team verlah",
- "label.less-than": "Kliiner als",
- "label.less-than-equals": "Kliiner oder gliich",
- "label.login": "Aamälde",
- "label.logout": "Abmälde",
- "label.manage": "Verwalte",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Mitglied",
- "label.members": "Mitglieder",
- "label.min": "Min",
- "label.mobile": "Händy",
- "label.more": "Meh",
- "label.my-account": "Min Account",
- "label.my-websites": "Mini Websiite",
- "label.name": "Name",
- "label.new-password": "Neus Passwort",
- "label.none": "Keis",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Übersicht",
- "label.owner": "Bsitzer",
- "label.page-of": "Siite {current} vo {total}",
- "label.page-views": "Siitenufrüef",
- "label.pageTitle": "Siitetitel",
- "label.pages": "Siite",
- "label.password": "Passwort",
- "label.path": "Pfad",
- "label.paths": "Pfade",
- "label.powered-by": "Betriibe dur {name}",
- "label.previous": "Vorherig",
- "label.previous-period": "Vorherigi Periode",
- "label.previous-year": "Vorherigs Jahr",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Abfrage",
- "label.query": "Abfrag",
- "label.query-parameters": "Abfragparameter",
- "label.realtime": "Echtzit",
- "label.referrer": "Verwiiser",
- "label.referrers": "Verwiisendi",
- "label.refresh": "Aktualisiere",
- "label.regenerate": "Erneuere",
- "label.region": "Region",
- "label.regions": "Regionä",
- "label.remove": "Entferne",
- "label.remove-member": "Mitglied entferne",
- "label.reports": "Brichte",
- "label.required": "Erforderlich",
- "label.reset": "Zruggsetze",
- "label.reset-website": "Statistik zruggsetze",
- "label.retention": "Retention",
- "label.retention-description": "Mässed Sie d Verwiilduur vo Ihrere Website, indem Sie verfolged wie oft ihri Nutzer zruggkehred.",
- "label.revenue": "Umsatz",
- "label.revenue-description": "Lueged Sie sich Ihre Umsatz im Lauf vor Ziit a.",
- "label.revenue-property": "Umsatzeigenschafte",
- "label.role": "Rollä",
- "label.run-query": "Abfrag starte",
- "label.save": "Speichere",
- "label.screens": "Bildschirmuflösige",
- "label.search": "Sueche",
- "label.select": "Auswähle",
- "label.select-date": "Datä uuswähle",
- "label.select-role": "Rollä uuswähle",
- "label.select-website": "Websiite uuswähle",
- "label.session": "Sitzig",
- "label.sessions": "Sitzige",
- "label.settings": "Istellige",
- "label.share-url": "Freigab-URL",
- "label.single-day": "Ein Tag",
- "label.start-step": "Startschritt",
- "label.steps": "Schritt",
- "label.sum": "Summe",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team Manager",
- "label.team-member": "Team Mitglied",
- "label.team-name": "Team Name",
- "label.team-owner": "Team Bsitzer",
- "label.team-view-only": "Nur für Teammitglieder sichtbar",
- "label.team-websites": "Team Websiite",
- "label.teams": "Teams",
- "label.theme": "Thema",
- "label.this-month": "Dä Monet",
- "label.this-week": "Diä Wuuche",
- "label.this-year": "Das Johr",
- "label.timezone": "Ziitzone",
- "label.title": "Titel",
- "label.today": "Hüt",
- "label.toggle-charts": "Charts umschalte",
- "label.total": "Total",
- "label.total-records": "Gsamti Datesätz",
- "label.tracking-code": "Tracking Code",
- "label.transactions": "Transaktione",
- "label.transfer": "Transferiere",
- "label.transfer-website": "Websiite transferiere",
- "label.true": "Wahr",
- "label.type": "Typ",
- "label.unique": "Einzigartigi",
- "label.unique-visitors": "Einzigartigi Bsuecher",
- "label.uniqueCustomers": "Einzigartigi Kunde",
- "label.unknown": "Unbekannt",
- "label.untitled": "Unbennant",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Benutzer",
- "label.user-property": "Benutzereigeschafte",
- "label.username": "Benutzername",
- "label.users": "Benutzer",
- "label.utm": "UTM",
- "label.utm-description": "Tracked Sie Ihri Kampagnen mit UTM Parameters.",
- "label.value": "Wärt",
- "label.view": "Azeige",
- "label.view-details": "Details azeige",
- "label.view-only": "Nume aluege",
- "label.views": "Ufrüef",
- "label.views-per-visit": "Ufrüef pro Bsuech",
- "label.visit-duration": "Durchschn. Bsuechsziit",
- "label.visitors": "Bsuecher",
- "label.visits": "Bsüech",
- "label.website": "Website",
- "label.website-id": "Websiite ID",
- "label.websites": "Websiite",
- "label.window": "Fenster",
- "label.yesterday": "Gester",
- "message.action-confirmation": "Typed Sie {confirmation} is Feld underhalb um z bestätige.",
- "message.active-users": "{x} {x, plural, one {aktive Bsuecher} other {aktivi Bsuecher}}",
- "message.collected-data": "Gsammleti Date",
- "message.confirm-delete": "Sind Sie sich sicher, {target} zlösche?",
- "message.confirm-leave": "Sind Sie sich sicher, {target} zverlah?",
- "message.confirm-remove": "Sind Sie sich sicher, dass Sie {target} wänd entferne?",
- "message.confirm-reset": "Sind Sie sicher, dass Sie d Statistike vo {target} zruggsetze wänd?",
- "message.delete-team-warning": "Es Team lösche dued ebefalls alli team Websiite lösche.",
- "message.delete-website-warning": "Alli dezueghörige Date werded ebefalls glöscht.",
- "message.error": "Es isch en Fehler ufträte.",
- "message.event-log": "{event} uf {url}",
- "message.go-to-settings": "Zu de Istellige",
- "message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
- "message.invalid-domain": "Ungültigi Domain",
- "message.min-password-length": "Miminamli längi vo {n} Zeiche",
- "message.new-version-available": "Es isch en neue Version vo Umami {version} verfügbar!",
- "message.no-data-available": "Kei Date vorhande.",
- "message.no-event-data": "Es sind kei Event Date verfügbar.",
- "message.no-match-password": "Passwörter stimmed ned überi",
- "message.no-results-found": "Kei Ergäbnis gfunde.",
- "message.no-team-websites": "Dem Team sind kei Websiite zuegordnet.",
- "message.no-teams": "Bisher sind no kei Teams erstellt worde.",
- "message.no-users": "Da gits kei Benutzer",
- "message.no-websites-configured": "Es isch kei Websiite vorhande.",
- "message.page-not-found": "Siite ned gfunde.",
- "message.reset-website": "Um die Websiite zruggzsetze, typed Sie {confirmation} is Feld unde dran.",
- "message.reset-website-warning": "Alli Date für die Websiite werdet glöscht, nur de Tracking Code blibt bestah.",
- "message.saved": "Erfolgrich gspeichert.",
- "message.share-url": "Ihri Websiitestatistik isch under de folgende URL öffentlich zuegänglich:",
- "message.team-already-member": "Sie sind bereits es Mitglied vo däm Team.",
- "message.team-not-found": "Team nöd gfunde.",
- "message.team-websites-info": "Websiite chöi vo jedem im Team agluegt werde",
- "message.tracking-code": "Tracking Code",
- "message.transfer-team-website-to-user": "Websiite uf zu Ihrem Account transferiere?",
- "message.transfer-user-website-to-team": "Wähled Sie s Team zum däm Websiite transferiert werde söll.",
- "message.transfer-website": "Übertraged Sie d Websiite Eigetümerrecht uf Ihre Account oder uf es anders Team",
- "message.triggered-event": "Usglösts Ereigniss",
- "message.user-deleted": "Bnutzer glöscht.",
- "message.viewed-page": "Siite agluegt",
- "message.visitor-log": "Bsuecher us {country} nutzt {browser} uf {os} {device}",
- "message.visitors-dropped-off": "Bsuercher verlore"
-}
\ No newline at end of file
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
deleted file mode 100644
index 36090a848..000000000
--- a/src/lang/de-DE.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Zugangscode",
- "label.actions": "Aktionen",
- "label.activity": "Aktivitätsverlauf",
- "label.add": "Hinzufügen",
- "label.add-description": "Beschreibung hinzufügen",
- "label.add-member": "Mitglied hinzufügen",
- "label.add-step": "Schritt hinzufügen",
- "label.add-website": "Website hinzufügen",
- "label.admin": "Administrator",
- "label.after": "Nach",
- "label.all": "Alle",
- "label.all-time": "Gesamter Zeitraum",
- "label.analytics": "Analysen",
- "label.average": "Durchschnitt",
- "label.back": "Zurück",
- "label.before": "Vor",
- "label.bounce-rate": "Absprungrate",
- "label.breakdown": "Aufschlüsselung",
- "label.browser": "Browser",
- "label.browsers": "Browser",
- "label.cancel": "Abbrechen",
- "label.change-password": "Passwort ändern",
- "label.cities": "Städte",
- "label.city": "Stadt",
- "label.clear-all": "Alles löschen",
- "label.compare": "Vergleichen",
- "label.confirm": "Bestätigen",
- "label.confirm-password": "Passwort wiederholen",
- "label.contains": "Enthält",
- "label.continue": "Weiter",
- "label.count": "Anzahl",
- "label.countries": "Länder",
- "label.country": "Land",
- "label.create": "Erstellen",
- "label.create-report": "Bericht erstellen",
- "label.create-team": "Team erstellen",
- "label.create-user": "Benutzer erstellen",
- "label.created": "Erstellt",
- "label.created-by": "Erstellt von",
- "label.current": "Aktuell",
- "label.current-password": "Derzeitiges Passwort",
- "label.custom-range": "Benutzerdefinierter Bereich",
- "label.dashboard": "Übersicht",
- "label.data": "Daten",
- "label.date": "Datum",
- "label.date-range": "Datumsbereich",
- "label.day": "Tag",
- "label.default-date-range": "Voreingestellter Datumsbereich",
- "label.delete": "Löschen",
- "label.delete-report": "Bericht löschen",
- "label.delete-team": "Team löschen",
- "label.delete-user": "Benutzer löschen",
- "label.delete-website": "Website löschen",
- "label.description": "Beschreibung",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Gerät",
- "label.devices": "Geräte",
- "label.dismiss": "Verwerfen",
- "label.does-not-contain": "Enthält nicht",
- "label.domain": "Domain",
- "label.dropoff": "Absprung",
- "label.edit": "Bearbeiten",
- "label.edit-dashboard": "Dashboard bearbeiten",
- "label.edit-member": "Mitglied bearbeiten",
- "label.enable-share-url": "Freigabe-URL aktivieren",
- "label.end-step": "Schlussschritt",
- "label.entry": "Eingangs-URL",
- "label.event": "Ereignis",
- "label.event-data": "Ereignisdaten",
- "label.events": "Ereignisse",
- "label.exit": "Ausgangs-URL",
- "label.false": "Falsch",
- "label.field": "Feld",
- "label.fields": "Felder",
- "label.filter": "Filter",
- "label.filter-combined": "Kombiniert",
- "label.filter-raw": "Rohdaten",
- "label.filters": "Filter",
- "label.first-seen": "Erstmalig gesehen",
- "label.funnel": "Trichter",
- "label.funnel-description": "Verstehen Sie die Konversions- und Absprungrate Ihrer Nutzer.",
- "label.goal": "Ziel",
- "label.goals": "Ziele",
- "label.goals-description": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse.",
- "label.greater-than": "Größer als",
- "label.greater-than-equals": "Größer oder gleich",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Einblicke",
- "label.insights-description": "Vertiefen Sie sich mit Hilfe von Segmenten und Filtern in Ihre Daten.",
- "label.is": "Ist",
- "label.is-not": "Ist nicht",
- "label.is-not-set": "Ist nicht gesetzt",
- "label.is-set": "Ist gesetzt",
- "label.join": "Beitreten",
- "label.join-team": "Team beitreten",
- "label.journey": "Reise",
- "label.journey-description": "Verstehen Sie, wie Nutzer auf Ihrer Website navigieren.",
- "label.language": "Sprache",
- "label.languages": "Sprachen",
- "label.laptop": "Laptop",
- "label.last-days": "Letzten {x} Tage",
- "label.last-hours": "Letzten {x} Stunden",
- "label.last-months": "Letzten {x} Monate",
- "label.last-seen": "Zuletzt gesehen",
- "label.leave": "Verlassen",
- "label.leave-team": "Team verlassen",
- "label.less-than": "Kleiner als",
- "label.less-than-equals": "Kleiner oder gleich",
- "label.login": "Anmelden",
- "label.logout": "Abmelden",
- "label.manage": "Verwalten",
- "label.manager": "Verwaltung",
- "label.max": "Max",
- "label.member": "Mitglied",
- "label.members": "Mitglieder",
- "label.min": "Min",
- "label.mobile": "Handy",
- "label.more": "Mehr",
- "label.my-account": "Mein Account",
- "label.my-websites": "Meine Websites",
- "label.name": "Name",
- "label.new-password": "Neues Passwort",
- "label.none": "Keine",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Übersicht",
- "label.owner": "Besitzer",
- "label.page-of": "Seite {current} von {total}",
- "label.page-views": "Seitenaufrufe",
- "label.pageTitle": "Seitentitel",
- "label.pages": "Seiten",
- "label.password": "Passwort",
- "label.path": "Pfad",
- "label.paths": "Pfade",
- "label.powered-by": "Betrieben durch {name}",
- "label.previous": "Vorherig",
- "label.previous-period": "Vorherige Periode",
- "label.previous-year": "Vorheriges Jahr",
- "label.profile": "Profil",
- "label.properties": "Eigenschaften",
- "label.property": "Eigentum",
- "label.queries": "Abfragen",
- "label.query": "Abfrage",
- "label.query-parameters": "Abfrageparameter",
- "label.realtime": "Echtzeit",
- "label.referrer": "Übermittler",
- "label.referrers": "Übermittler",
- "label.refresh": "Aktualisieren",
- "label.regenerate": "Erneuern",
- "label.region": "Region",
- "label.regions": "Regionen",
- "label.remove": "Entfernen",
- "label.remove-member": "Mitglied entfernen",
- "label.reports": "Berichte",
- "label.required": "Erforderlich",
- "label.reset": "Zurücksetzen",
- "label.reset-website": "Statistik zurücksetzen",
- "label.retention": "Erhalt",
- "label.retention-description": "Messen Sie die Verweildauer auf Ihrer Website, indem Sie verfolgen, wie oft die Nutzer zurückkehren.",
- "label.revenue": "Umsatz",
- "label.revenue-description": "Haben Sie einen Blick auf Ihre Umsätze im Laufe der Zeit.",
- "label.revenue-property": "Umsatzeigenschaften",
- "label.role": "Rolle",
- "label.run-query": "Abfrage starten",
- "label.save": "Speichern",
- "label.screens": "Bildschirmauflösungen",
- "label.search": "Suche",
- "label.select": "Auswählen",
- "label.select-date": "Datum auswählen",
- "label.select-role": "Rolle auswählen",
- "label.select-website": "Website auswählen",
- "label.session": "Sitzung",
- "label.sessions": "Sitzungen",
- "label.settings": "Einstellungen",
- "label.share-url": "Freigabe-URL",
- "label.single-day": "Ein Tag",
- "label.start-step": "Startschritt",
- "label.steps": "Schritte",
- "label.sum": "Summe",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team-ID",
- "label.team-manager": "Team-Manager",
- "label.team-member": "Team-Mitglied",
- "label.team-name": "Name des Teams",
- "label.team-owner": "Team-Eigentümer",
- "label.team-view-only": "Nur für Team-Mitglieder sichtbar",
- "label.team-websites": "Team-Websites",
- "label.teams": "Teams",
- "label.theme": "Thema",
- "label.this-month": "Diesen Monat",
- "label.this-week": "Diese Woche",
- "label.this-year": "Dieses Jahr",
- "label.timezone": "Zeitzone",
- "label.title": "Titel",
- "label.today": "Heute",
- "label.toggle-charts": "Schaubilder umschalten",
- "label.total": "Gesamt",
- "label.total-records": "Datensätze insgesamt",
- "label.tracking-code": "Tracking Code",
- "label.transactions": "Transaktionen",
- "label.transfer": "Übertragung",
- "label.transfer-website": "Website übertragen",
- "label.true": "Wahr",
- "label.type": "Typ",
- "label.unique": "Einzigartig",
- "label.unique-visitors": "Einzigartige Besucher",
- "label.uniqueCustomers": "Einzigartige Kunden",
- "label.unknown": "Unbekannt",
- "label.untitled": "Unbenannt",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Benutzer",
- "label.user-property": "Benutzereigenschaften",
- "label.username": "Benutzername",
- "label.users": "Benutzer",
- "label.utm": "UTM",
- "label.utm-description": "Tracken Sie Ihre Kampagnen mit UTM Parametern.",
- "label.value": "Wert",
- "label.view": "Anzeigen",
- "label.view-details": "Details anzeigen",
- "label.view-only": "Nur ansehen",
- "label.views": "Aufrufe",
- "label.views-per-visit": "Aufrufe pro Besuch",
- "label.visit-duration": "Durchschn. Besuchszeit",
- "label.visitors": "Besucher",
- "label.visits": "Besuche",
- "label.website": "Website",
- "label.website-id": "Website-ID",
- "label.websites": "Websites",
- "label.window": "Fenster",
- "label.yesterday": "Gestern",
- "message.action-confirmation": "Schreibe {confirmation} in die Box zur bestätigung.",
- "message.active-users": "{x} {x, plural, one {aktiver Besucher} other {aktive Besucher}}",
- "message.collected-data": "Gesammelte Daten",
- "message.confirm-delete": "Sind Sie sich sicher, {target} zu löschen?",
- "message.confirm-leave": "Sind Sie sicher, dass die {target} verlassen möchten?",
- "message.confirm-remove": "Sind Sie sicher, {target} zu entfernen?",
- "message.confirm-reset": "Sind Sie sicher, dass Sie die Statistiken von {target} zurücksetzen wollen?",
- "message.delete-team-warning": "Ein Team zu löschen, wird auch alle Team-Websites löschen.",
- "message.delete-website-warning": "Alle zugehörigen Daten werden ebenfalls gelöscht.",
- "message.error": "Es ist ein Fehler aufgetreten.",
- "message.event-log": "{event} auf {url}",
- "message.go-to-settings": "Zu den Einstellungen",
- "message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
- "message.invalid-domain": "Ungültige Domain",
- "message.min-password-length": "Minimale Länge von {n} Zeichen",
- "message.new-version-available": "Eine neue Version von Umami ist verfügbar: {version}",
- "message.no-data-available": "Keine Daten vorhanden.",
- "message.no-event-data": "Es sind keine Ereignisdaten verfügbar.",
- "message.no-match-password": "Passwörter stimmen nicht überein",
- "message.no-results-found": "Keine Ergebnisse gefunden.",
- "message.no-team-websites": "Diesem Team sind keine Websites zugeordnet.",
- "message.no-teams": "Bisher wurden keine Teams erstellt.",
- "message.no-users": "Hier gibt es keine Benutzer.",
- "message.no-websites-configured": "Es ist keine Website vorhanden.",
- "message.page-not-found": "Seite nicht gefunden.",
- "message.reset-website": "Um diese Website zurückzusetzen, geben Sie zur Bestätigung {confirmation} in das Feld unten ein.",
- "message.reset-website-warning": "Alle Daten für diese Website werden gelöscht, jedoch bleibt der Tracking Code bestehen.",
- "message.saved": "Erfolgreich gespeichert.",
- "message.share-url": "Die Statistiken Ihrer Website sind unter folgender URL öffentlich zugänglich:",
- "message.team-already-member": "Sie sind bereits Mitglied des Teams.",
- "message.team-not-found": "Team nicht gefunden.",
- "message.team-websites-info": "Websites können von jedem im Team eingesehen werden.",
- "message.tracking-code": "Tracking Code",
- "message.transfer-team-website-to-user": "Diese Website zu Ihrem Account transferieren?",
- "message.transfer-user-website-to-team": "Wählen Sie ein Team aus, zu dem die Website transferiert werden soll.",
- "message.transfer-website": "Übertragen Sie die Eigentümerrechte zu Ihrem Account oder einem anderen Team.",
- "message.triggered-event": "Ereignis ausgelöst",
- "message.user-deleted": "Benutzer gelöscht.",
- "message.viewed-page": "Seite besucht",
- "message.visitor-log": "Besucher aus {country} benutzt {browser} auf {os} {device}",
- "message.visitors-dropped-off": "Besucherverlust"
-}
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
deleted file mode 100644
index 263ea7e9f..000000000
--- a/src/lang/el-GR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Ενέργειες",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Προσθήκη ιστότοπου",
- "label.admin": "Διαχειριστής",
- "label.after": "After",
- "label.all": "All",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Πίσω",
- "label.before": "Before",
- "label.bounce-rate": "Ποσοστό αναπήδησης",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Προγράμματα περιήγησης",
- "label.cancel": "Ακύρωση",
- "label.change-password": "Αλλαγή κωδικού",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Επιβεβαίωση κωδικού",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Χώρες",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Τωρινός κωδικός πρόσβασης",
- "label.custom-range": "Προσαρμοσμένο εύρος",
- "label.dashboard": "Πίνακας",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Εύρος ημερομηνιών",
- "label.day": "Day",
- "label.default-date-range": "Προεπιλεγμένο εύρος ημερομηνιών",
- "label.delete": "Διαγραφή",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Διαγραφή ιστότοπου",
- "label.description": "Description",
- "label.desktop": "Σταθερός υπολογιστής",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Συσκευές",
- "label.dismiss": "Dismiss",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Τομέας",
- "label.dropoff": "Dropoff",
- "label.edit": "Επεξεργασία",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Ενεργοποίηση κοινής χρήσης URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Γεγονότα",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Σε συνδυασμό",
- "label.filter-raw": "Ακατέργαστο",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Λάπτοπ",
- "label.last-days": "Τελευταίες {x} ημέρες",
- "label.last-hours": "Τελευταίες {x} ώρες",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Είσοδος",
- "label.logout": "Αποσύνδεση",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Κινητό",
- "label.more": "Περισσότερα",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Όνομα",
- "label.new-password": "Νέος κωδικός",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Προβολές σελίδας",
- "label.pageTitle": "Page title",
- "label.pages": "Σελίδες",
- "label.password": "Κωδικός",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Με την υποστήριξη του {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Προφίλ",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Realtime",
- "label.referrer": "Referrer",
- "label.referrers": "Παραπομπές",
- "label.refresh": "Ανανέωση",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Απαιτείται",
- "label.reset": "Επαναφορά",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Αποθήκευση",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Ρυθμίσεις",
- "label.share-url": "Κοινοποίηση διεύθυνσης URL",
- "label.single-day": "Ημερήσια",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Τάμπλετ",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Αυτο το μήνα",
- "label.this-week": "Αυτή την εβδομάδα",
- "label.this-year": "Αυτή την χρονιά",
- "label.timezone": "Ζώνη ώρας",
- "label.title": "Title",
- "label.today": "Σήμερα",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Κωδικός παρακολούθησης",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Μοναδικοί επισκέπτες",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Άγνωστο",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Όνομα χρήστη",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Λεπτομέρειες",
- "label.view-only": "View only",
- "label.views": "Προβολές",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Μέσος χρόνος επίσκεψης",
- "label.visitors": "Επισκέπτες",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Ιστότοποι",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} ενεργοί {x, plural, one {επισκέπτης} other {επισκέπτες}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το {target};",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Όλα τα σχετικά δεδομένα θα διαγραφούν επίσης.",
- "message.error": "Κάτι πήγε στραβά.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Μεταβείτε στις ρυθμίσεις",
- "message.incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.",
- "message.invalid-domain": "Μη έγκυρος τομέας",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
- "message.page-not-found": "Η σελίδα δεν βρέθηκε.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Αποθηκεύτηκε επιτυχώς.",
- "message.share-url": "Αυτό είναι το κοινόχρηστο URL για το {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Κωδικός παρακολούθησης",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/en-GB.json b/src/lang/en-GB.json
deleted file mode 100644
index 80bbbd7b8..000000000
--- a/src/lang/en-GB.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Actions",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Add website",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "All",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Back",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "Cancel",
- "label.change-password": "Change password",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Confirm password",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Countries",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Current password",
- "label.custom-range": "Custom range",
- "label.dashboard": "Dashboard",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Date range",
- "label.day": "Day",
- "label.default-date-range": "Default date range",
- "label.delete": "Delete",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Delete website",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Devices",
- "label.dismiss": "Dismiss",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "Edit",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Enable share URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Events",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combined",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "Last {x} days",
- "label.last-hours": "Last {x} hours",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Login",
- "label.logout": "Logout",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "More",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Name",
- "label.new-password": "New password",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Page views",
- "label.pageTitle": "Page title",
- "label.pages": "Pages",
- "label.password": "Password",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profile",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Realtime",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Refresh",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Required",
- "label.reset": "Reset",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Save",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Settings",
- "label.share-url": "Share URL",
- "label.single-day": "Single day",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "This month",
- "label.this-week": "This week",
- "label.this-year": "This year",
- "label.timezone": "Timezone",
- "label.title": "Title",
- "label.today": "Today",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Tracking code",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unique visitors",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Unknown",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Username",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "View details",
- "label.view-only": "View only",
- "label.views": "Views",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Visitors",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Websites",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Are you sure you want to delete {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are you sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All associated data will be deleted as well.",
- "message.error": "Something went wrong.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Go to settings",
- "message.incorrect-username-password": "Incorrect username/password.",
- "message.invalid-domain": "Invalid domain",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "No data available.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Passwords don't match",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "You don't have any websites configured.",
- "message.page-not-found": "Page not found.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Saved successfully.",
- "message.share-url": "This is the publicly shared URL for {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Tracking code",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/en-US.json b/src/lang/en-US.json
deleted file mode 100644
index 8fe331459..000000000
--- a/src/lang/en-US.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Actions",
- "label.activity": "Activity",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Add website",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "All",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Back",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "Cancel",
- "label.change-password": "Change password",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Confirm password",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Countries",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Current password",
- "label.custom-range": "Custom range",
- "label.dashboard": "Dashboard",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Date range",
- "label.day": "Day",
- "label.default-date-range": "Default date range",
- "label.delete": "Delete",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Delete website",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Devices",
- "label.dismiss": "Dismiss",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "Edit",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Enable share URL",
- "label.end-step": "End Step",
- "label.entry": "Entry path",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Events",
- "label.exit": "Exit path",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combined",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "Last {x} days",
- "label.last-hours": "Last {x} hours",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Login",
- "label.logout": "Logout",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "More",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Name",
- "label.new-password": "New password",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Page views",
- "label.pageTitle": "Page title",
- "label.pages": "Pages",
- "label.password": "Password",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profile",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Realtime",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Refresh",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Required",
- "label.reset": "Reset",
- "label.reset-website": "Reset website",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Save",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Settings",
- "label.share-url": "Share URL",
- "label.single-day": "Single day",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "This month",
- "label.this-week": "This week",
- "label.this-year": "This year",
- "label.timezone": "Timezone",
- "label.title": "Title",
- "label.today": "Today",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Tracking code",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unique visitors",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Unknown",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Username",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "View details",
- "label.view-only": "View only",
- "label.views": "Views",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Visitors",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Websites",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Are you sure you want to delete {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are you sure you want to reset {target}?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All website data will be deleted.",
- "message.error": "Something went wrong.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Go to settings",
- "message.incorrect-username-password": "Incorrect username and/or password.",
- "message.invalid-domain": "Invalid domain. Do not include http/https.",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "No data available.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Passwords do not match.",
- "message.no-results-found": "No results found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "You do not have any websites configured.",
- "message.page-not-found": "Page not found",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
- "message.saved": "Saved.",
- "message.share-url": "Your website stats are publicly available at the following URL:",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "To track stats for this website, place the following code in the ... section of your HTML.",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
deleted file mode 100644
index 9bcfab503..000000000
--- a/src/lang/es-ES.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Código de acceso",
- "label.actions": "Acciones",
- "label.activity": "Registro de actividad",
- "label.add": "Añadir",
- "label.add-description": "Añadir descripción",
- "label.add-member": "Añadir miembro",
- "label.add-step": "Añadir paso",
- "label.add-website": "Nuevo sitio web",
- "label.admin": "Administrador",
- "label.after": "Después",
- "label.all": "Todos",
- "label.all-time": "Todos los tiempos",
- "label.analytics": "Analíticas",
- "label.average": "Media",
- "label.back": "Atrás",
- "label.before": "Antes",
- "label.bounce-rate": "Porcentaje de rebote",
- "label.breakdown": "Desglose",
- "label.browser": "Navegador",
- "label.browsers": "Navegadores",
- "label.cancel": "Cancelar",
- "label.change-password": "Cambiar contraseña",
- "label.cities": "Ciudades",
- "label.city": "Ciudad",
- "label.clear-all": "Limpiar todo",
- "label.compare": "Comparar",
- "label.confirm": "Confirmar",
- "label.confirm-password": "Confirmar contraseña",
- "label.contains": "Contiene",
- "label.continue": "Continuar",
- "label.count": "Contar",
- "label.countries": "Países",
- "label.country": "País",
- "label.create": "Crear",
- "label.create-report": "Crear informe",
- "label.create-team": "Crear equipo",
- "label.create-user": "Crear usuario",
- "label.created": "Creado",
- "label.created-by": "Creado por",
- "label.current": "Actual",
- "label.current-password": "Contraseña actual",
- "label.custom-range": "Intervalo personalizado",
- "label.dashboard": "Panel de control",
- "label.data": "Datos",
- "label.date": "Fecha",
- "label.date-range": "Intervalo de fechas",
- "label.day": "Día",
- "label.default-date-range": "Intervalo por defecto",
- "label.delete": "Eliminar",
- "label.delete-report": "Eliminar reporte",
- "label.delete-team": "Eliminar equipo",
- "label.delete-user": "Eliminar usuario",
- "label.delete-website": "Eliminar sitio",
- "label.description": "Descripción",
- "label.desktop": "Escritorio",
- "label.details": "Detalles",
- "label.device": "Dispositivo",
- "label.devices": "Dispositivos",
- "label.dismiss": "Cerrar",
- "label.does-not-contain": "No contiene",
- "label.domain": "Dominio",
- "label.dropoff": "Abandono",
- "label.edit": "Editar",
- "label.edit-dashboard": "Editar panel",
- "label.edit-member": "Editar miembro",
- "label.enable-share-url": "Habilitar compartir URL",
- "label.end-step": "Paso final",
- "label.entry": "URL de entrada",
- "label.event": "Evento",
- "label.event-data": "Datos de evento",
- "label.events": "Eventos",
- "label.exit": "URL de salida",
- "label.false": "Falso",
- "label.field": "Campo",
- "label.fields": "Campos",
- "label.filter": "Filtro",
- "label.filter-combined": "Combinado",
- "label.filter-raw": "En crudo",
- "label.filters": "Filtros",
- "label.first-seen": "Visto por primera vez",
- "label.funnel": "Embudo",
- "label.funnel-description": "Comprender conversión y abandono de usuarios.",
- "label.goal": "Objetivo",
- "label.goals": "Objetivos",
- "label.goals-description": "Realice un seguimiento de sus objetivos de páginas vistas y eventos.",
- "label.greater-than": "Mayor que",
- "label.greater-than-equals": "Mayor que o igual a",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Profundice en sus datos mediante el uso de segmentos y filtros.",
- "label.is": "Es igual a",
- "label.is-not": "No es igual a",
- "label.is-not-set": "No está establecido",
- "label.is-set": "Está establecido",
- "label.join": "Unir",
- "label.join-team": "Unirse al equipo",
- "label.journey": "Viaje",
- "label.journey-description": "Comprenda cómo los usuarios navegan por su sitio web.",
- "label.language": "Idioma",
- "label.languages": "Idiomas",
- "label.laptop": "Portátil",
- "label.last-days": "Últimos {x} días",
- "label.last-hours": "Últimas {x} horas",
- "label.last-months": "Últimos {x} meses",
- "label.last-seen": "Visto por última vez",
- "label.leave": "Abandonar",
- "label.leave-team": "Abandonar equipo",
- "label.less-than": "Menor que",
- "label.less-than-equals": "Menor que o igual a",
- "label.login": "Iniciar sesión",
- "label.logout": "Cerrar sesión",
- "label.manage": "Administrar",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Miembro",
- "label.members": "Miembros",
- "label.min": "Min",
- "label.mobile": "Móvil",
- "label.more": "Más",
- "label.my-account": "Mi cuenta",
- "label.my-websites": "Mis sitios web",
- "label.name": "Nombre",
- "label.new-password": "Nueva contraseña",
- "label.none": "Ninguno",
- "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}",
- "label.ok": "OK",
- "label.os": "Sistema",
- "label.overview": "Resumen",
- "label.owner": "Propietario",
- "label.page-of": "Página {current} de {total}",
- "label.page-views": "Vistas",
- "label.pageTitle": "Título de página",
- "label.pages": "Páginas",
- "label.password": "Contraseña",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Analíticas de {name}",
- "label.previous": "Anterior",
- "label.previous-period": "Periodo anterior",
- "label.previous-year": "Año anterior",
- "label.profile": "Perfil",
- "label.properties": "Propiedades",
- "label.property": "Propiedad",
- "label.queries": "Consultas",
- "label.query": "Consulta",
- "label.query-parameters": "Parámetros de petición",
- "label.realtime": "Tiempo real",
- "label.referrer": "Referido",
- "label.referrers": "Referido desde",
- "label.refresh": "Actualizar",
- "label.regenerate": "Regenerar",
- "label.region": "Región",
- "label.regions": "Regiones",
- "label.remove": "Quitar",
- "label.remove-member": "Eliminar miembro",
- "label.reports": "Informes",
- "label.required": "Obligatorio",
- "label.reset": "Reiniciar",
- "label.reset-website": "Reiniciar analíticas",
- "label.retention": "Retención",
- "label.retention-description": "Medir la frecuencia con la que los usuarios vuelven a tu sitio web.",
- "label.revenue": "Ganancias",
- "label.revenue-description": "Analice sus ganancias a lo largo del tiempo.",
- "label.revenue-property": "Propiedad de ganancias",
- "label.role": "Rol",
- "label.run-query": "Ejecutar consulta",
- "label.save": "Guardar",
- "label.screens": "Pantallas",
- "label.search": "Buscar",
- "label.select": "Seleccionar",
- "label.select-date": "Seleccionar fecha",
- "label.select-role": "Seleccionar rol",
- "label.select-website": "Seleccionar sitio web",
- "label.session": "Sesión",
- "label.sessions": "Sesiones",
- "label.settings": "Ajustes",
- "label.share-url": "Compartir URL",
- "label.single-day": "Un solo día",
- "label.start-step": "Paso inical",
- "label.steps": "Pasos",
- "label.sum": "Suma",
- "label.tablet": "Tableta",
- "label.team": "Equipo",
- "label.team-id": "ID del equipo",
- "label.team-manager": "Jefe de equipo",
- "label.team-member": "Miembro del equipo",
- "label.team-name": "Nombre del equipo",
- "label.team-owner": "Admin. del equipo",
- "label.team-view-only": "Vista solo del equipo",
- "label.team-websites": "Sitios web del equipo",
- "label.teams": "Equipos",
- "label.theme": "Tema",
- "label.this-month": "Este mes",
- "label.this-week": "Esta semana",
- "label.this-year": "Este año",
- "label.timezone": "Zona horaria",
- "label.title": "Título",
- "label.today": "Hoy",
- "label.toggle-charts": "Alternar gráficas",
- "label.total": "Total",
- "label.total-records": "Total de registros",
- "label.tracking-code": "Código de rastreo",
- "label.transactions": "Transacciones",
- "label.transfer": "Transferir",
- "label.transfer-website": "Transferir sitio web",
- "label.true": "Verdadero",
- "label.type": "Tipo",
- "label.unique": "Único",
- "label.unique-visitors": "Visitantes únicos",
- "label.uniqueCustomers": "Clientes únicos",
- "label.unknown": "Desconocida",
- "label.untitled": "Sin título",
- "label.update": "Actualizar",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Usuario",
- "label.user-property": "Propiedad de usuario",
- "label.username": "Nombre de usuario",
- "label.users": "Usuarios",
- "label.utm": "UTM",
- "label.utm-description": "Realice un seguimiento de sus campañas a través de parámetros UTM.",
- "label.value": "Valor",
- "label.view": "Visualizar",
- "label.view-details": "Ver detalles",
- "label.view-only": "Ver sólo",
- "label.views": "Vistas",
- "label.views-per-visit": "Vistas por visita",
- "label.visit-duration": "Tiempo promedio de visita",
- "label.visitors": "Visitantes",
- "label.visits": "Visitas",
- "label.website": "Sitio web",
- "label.website-id": "ID del sitio web",
- "label.websites": "Sitios web",
- "label.window": "Ventana",
- "label.yesterday": "Ayer",
- "message.action-confirmation": "Escriba {confirmation} en el cuadro a continuación para confirmar.",
- "message.active-users": "{x} {x, plural, one {activo} other {activos}}",
- "message.collected-data": "Datos obtenidos",
- "message.confirm-delete": "¿Seguro que quieres eliminar {target}?",
- "message.confirm-leave": "¿Seguro que quieres abandonar {target}?",
- "message.confirm-remove": "¿Estás seguro de que desea eliminar {target}?",
- "message.confirm-reset": "¿Seguro que quieres BORRAR las analíticas de {target}?",
- "message.delete-team-warning": "Al eliminar un equipo, también se eliminarán todos los sitios web del equipo.",
- "message.delete-website-warning": "Toda la información relacionada será eliminada.",
- "message.error": "Algo falló.",
- "message.event-log": "{event} en {url}",
- "message.go-to-settings": "Ir a la configuración",
- "message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
- "message.invalid-domain": "Dominio inválido",
- "message.min-password-length": "Longitud mínima de {n} caracteres",
- "message.new-version-available": "Una nueva versión de Umami {version} está disponible",
- "message.no-data-available": "No hay información disponible.",
- "message.no-event-data": "No hay datos de eventos disponibles.",
- "message.no-match-password": "Las contraseñas no coinciden",
- "message.no-results-found": "No se encontraron resultados.",
- "message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
- "message.no-teams": "No has creado ningún equipo.",
- "message.no-users": "No hay usuarios.",
- "message.no-websites-configured": "No tienes ningún sitio web configurado.",
- "message.page-not-found": "Página no encontrada",
- "message.reset-website": "Para reiniciar este sitio web, escribe {confirmation} a continuación para confirmar.",
- "message.reset-website-warning": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto.",
- "message.saved": "Guardado",
- "message.share-url": "Esta es la URL pública para {target}.",
- "message.team-already-member": "Ya eres miembro de este equipo.",
- "message.team-not-found": "Equipo no encontrado.",
- "message.team-websites-info": "Las analíticas de tus sitios web pueden ser vistas por cualquier miembro del equipo.",
- "message.tracking-code": "Código de rastreo",
- "message.transfer-team-website-to-user": "¿Transferir este sitio web a su cuenta?",
- "message.transfer-user-website-to-team": "Seleccione el equipo al que transferir este sitio web.",
- "message.transfer-website": "Seleccione el equipo al que transferir este sitio web.",
- "message.triggered-event": "Evento lanzado",
- "message.user-deleted": "Usuario eliminado.",
- "message.viewed-page": "Página vista",
- "message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
- "message.visitors-dropped-off": "Los visitantes salieron"
-}
diff --git a/src/lang/fa-IR.json b/src/lang/fa-IR.json
deleted file mode 100644
index 493ca4875..000000000
--- a/src/lang/fa-IR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "کد دسترسی",
- "label.actions": "اقدامات",
- "label.activity": "فعالیت",
- "label.add": "افزودن",
- "label.add-description": "افزودن توضیحات",
- "label.add-member": "افزودن عضو",
- "label.add-step": "افزودن قدم",
- "label.add-website": "افزودن وبسایت",
- "label.admin": "مدیر",
- "label.after": "بعد",
- "label.all": "همه",
- "label.all-time": "تمامی زمانها",
- "label.analytics": "تجزیه و تحلیل",
- "label.average": "میانگین",
- "label.back": "بازگشت",
- "label.before": "قبل از",
- "label.bounce-rate": "نرخ ریزش",
- "label.breakdown": "تفکیک",
- "label.browser": "مرورگر",
- "label.browsers": "مرورگرها",
- "label.cancel": "انصراف",
- "label.change-password": "تغییر رمز",
- "label.cities": "شهرها",
- "label.city": "شهر",
- "label.clear-all": "پاک کردن همه",
- "label.compare": "مقایسه",
- "label.confirm": "تأیید",
- "label.confirm-password": "تأیید رمز",
- "label.contains": "شامل",
- "label.continue": "ادامه",
- "label.count": "تعداد",
- "label.countries": "کشورها",
- "label.country": "کشور",
- "label.create": "ایجاد",
- "label.create-report": "ایجاد گزارش",
- "label.create-team": "ایجاد تیم",
- "label.create-user": "ایجاد کاربر",
- "label.created": "ایجاد شد",
- "label.created-by": "ایجاد شده توسط",
- "label.current": "فعلی",
- "label.current-password": "رمز فعلی",
- "label.custom-range": "محدودهی دلخواه",
- "label.dashboard": "داشبورد",
- "label.data": "داده",
- "label.date": "تاریخ",
- "label.date-range": "محدودهی تاریخ",
- "label.day": "روز",
- "label.default-date-range": "محدودهی پیشفرض تاریخ",
- "label.delete": "حذف",
- "label.delete-report": "حذف گزارش",
- "label.delete-team": "حذف تیم",
- "label.delete-user": "حذف کاربر",
- "label.delete-website": "حذف وبسایت",
- "label.description": "توضیحات",
- "label.desktop": "دسکتاپ",
- "label.details": "جزئیات",
- "label.device": "دستگاه",
- "label.devices": "دستگاهها",
- "label.dismiss": "رد کردن",
- "label.does-not-contain": "شامل نمیشود",
- "label.domain": "دامنه",
- "label.dropoff": "رها کردن",
- "label.edit": "ویرایش",
- "label.edit-dashboard": "ویرایش داشبورد",
- "label.edit-member": "ویرایش عضو",
- "label.enable-share-url": "فعال کردن اشتراک گذاری آدرس اینترنتی",
- "label.end-step": "قدم پایانی",
- "label.entry": "آدرس اینترنتی ورودی",
- "label.event": "رویداد",
- "label.event-data": "دادههای رویداد",
- "label.events": "رویدادها",
- "label.exit": "آدرس اینترنتی خروجی",
- "label.false": "نادرست",
- "label.field": "فیلد",
- "label.fields": "فیلدها",
- "label.filter": "فیلتر",
- "label.filter-combined": "ترکیب شده",
- "label.filter-raw": "خام",
- "label.filters": "فیلترها",
- "label.first-seen": "اولین بار دیده شده",
- "label.funnel": "فانل",
- "label.funnel-description": "نرخ تبدیل و رها کردن کاربران را درک کنید.",
- "label.goal": "هدف",
- "label.goals": "اهداف",
- "label.goals-description": "اهداف خود را برای بازدید از صفحه و رویدادها دنبال کنید.",
- "label.greater-than": "بزرگتر از",
- "label.greater-than-equals": "بزرگتر یا مساوی",
- "label.host": "هاست",
- "label.hosts": "هاستها",
- "label.insights": "بینش",
- "label.insights-description": "با استفاده از بخشها و فیلترها، در دادههای خود عمیقتر شوید.",
- "label.is": "برابر است با",
- "label.is-not": "برابر نیست با",
- "label.is-not-set": "تعیین نشده",
- "label.is-set": "تعیین شده",
- "label.join": "پیوستن",
- "label.join-team": "پیوستن به تیم",
- "label.journey": "مسیر",
- "label.journey-description": "درک کنید که کاربران چگونه در وبسایت شما حرکت می کنند.",
- "label.language": "زبان",
- "label.languages": "زبانها",
- "label.laptop": "لپتاپ",
- "label.last-days": "{x} روز گذشته",
- "label.last-hours": "{x} ساعت گذشته",
- "label.last-months": "{x} ماه گذشته",
- "label.last-seen": "آخرین بار دیده شده",
- "label.leave": "ترک کردن",
- "label.leave-team": "ترک تیم",
- "label.less-than": "کمتر از",
- "label.less-than-equals": "کمتر یا مساوی",
- "label.login": "ورود",
- "label.logout": "خروج",
- "label.manage": "مدیریت",
- "label.manager": "مدیر",
- "label.max": "حداکثر",
- "label.member": "عضو",
- "label.members": "اعضا",
- "label.min": "حداقل",
- "label.mobile": "موبایل",
- "label.more": "بیشتر",
- "label.my-account": "حساب کاربری من",
- "label.my-websites": "وبسایتهای من",
- "label.name": "نام",
- "label.new-password": "رمز جدید",
- "label.none": "هیچ",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "تایید",
- "label.os": "سیستم عامل",
- "label.overview": "بررسی کلی",
- "label.owner": "مالک",
- "label.page-of": "صفحه {current} از {total}",
- "label.page-views": "بازدید صفحه",
- "label.pageTitle": "عنوان صفحه",
- "label.pages": "صفحهها",
- "label.password": "رمز",
- "label.path": "مسیر",
- "label.paths": "مسیرها",
- "label.powered-by": "قدرت گرفته توسط {name}",
- "label.previous": "قبلی",
- "label.previous-period": "دورهی قبل",
- "label.previous-year": "سال قبل",
- "label.profile": "پروفایل",
- "label.properties": "ویژگیها",
- "label.property": "ویژگی",
- "label.queries": "کوئریها",
- "label.query": "کوئری",
- "label.query-parameters": "پارامترهای کوئری",
- "label.realtime": "آمار زنده",
- "label.referrer": "ارجاع دهنده",
- "label.referrers": "ارجاع دهندگان",
- "label.refresh": "بهروزرسانی",
- "label.regenerate": "تولید مجدد",
- "label.region": "منطقه",
- "label.regions": "مناطق",
- "label.remove": "حذف",
- "label.remove-member": "حذف عضو",
- "label.reports": "گزارشها",
- "label.required": "ضروری",
- "label.reset": "بازنشانی",
- "label.reset-website": "بازنشانی وبسایت",
- "label.retention": "نرخ بازگشت",
- "label.retention-description": "چسبندگی وبسایت خود را با دنبال کردن تعداد دفعات بازگشت کاربران اندازهگیری کنید.",
- "label.revenue": "درآمد",
- "label.revenue-description": "به درآمد خود در طول زمان نگاه کنید.",
- "label.revenue-property": "ویژگی درآمد",
- "label.role": "نقش",
- "label.run-query": "اجرای کوئری",
- "label.save": "ذخیره",
- "label.screens": "صفحه",
- "label.search": "جستجو",
- "label.select": "انتخاب",
- "label.select-date": "انتخاب تاریخ",
- "label.select-role": "انتخاب نقش",
- "label.select-website": "انتخاب وبسایت",
- "label.session": "نشست",
- "label.sessions": "نشستها",
- "label.settings": "تنظیمات",
- "label.share-url": "به اشتراک گذاری آدرس اینترنتی",
- "label.single-day": "یک روز",
- "label.start-step": "قدم شروع",
- "label.steps": "قدمها",
- "label.sum": "جمع",
- "label.tablet": "تبلت",
- "label.team": "تیم",
- "label.team-id": "شناسه تیم",
- "label.team-manager": "مدیر تیم",
- "label.team-member": "عضو تیم",
- "label.team-name": "نام تیم",
- "label.team-owner": "مالک تیم",
- "label.team-view-only": "فقط مشاهدهی تیم",
- "label.team-websites": "وبسایتهای تیم",
- "label.teams": "تیمها",
- "label.theme": "تم",
- "label.this-month": "این ماه",
- "label.this-week": "این هفته",
- "label.this-year": "امسال",
- "label.timezone": "منطقهی زمانی",
- "label.title": "عنوان",
- "label.today": "امروز",
- "label.toggle-charts": "نمایش / عدم نمایش نمودارها",
- "label.total": "جمع",
- "label.total-records": "جمع رکوردها",
- "label.tracking-code": "کد رهگیری",
- "label.transactions": "تراکنشها",
- "label.transfer": "انتقال",
- "label.transfer-website": "انتقال وبسایت",
- "label.true": "درست",
- "label.type": "نوع",
- "label.unique": "یکتا",
- "label.unique-visitors": "بازدیدکنندههای یکتا",
- "label.uniqueCustomers": "مشتریان یکتا",
- "label.unknown": "ناشناخته",
- "label.untitled": "بدون عنوان",
- "label.update": "بهروزرسانی",
- "label.url": "آدرس اینترنتی",
- "label.urls": "آدرسهای اینترنتی",
- "label.user": "کاربر",
- "label.user-property": "ویژگی کاربر",
- "label.username": "نام کاربری",
- "label.users": "کاربران",
- "label.utm": "UTM",
- "label.utm-description": "با استفاده از پارامترهای UTM، کمپینهای خود را بررسی کنید.",
- "label.value": "مقدار",
- "label.view": "مشاهده",
- "label.view-details": "مشاهدهی جزئیات",
- "label.view-only": "فقط مشاهده",
- "label.views": "بازدید",
- "label.views-per-visit": "نمایشها در هر بازدید",
- "label.visit-duration": "میانگین زمان بازدید",
- "label.visitors": "بازدیدکننده",
- "label.visits": "بازدیدها",
- "label.website": "وبسایت",
- "label.website-id": "شناسه وبسایت",
- "label.websites": "وبسایتها",
- "label.window": "پنجره",
- "label.yesterday": "دیروز",
- "message.action-confirmation": "برای تأیید این عملیات، لطفاً {confirmation} را تایپ کنید.",
- "message.active-users": "{x} فعلی {x, plural, one {یک} other {از میان}}",
- "message.collected-data": "دادههای جمعآوری شده",
- "message.confirm-delete": "آیا مطمئن هستید میخواهید {target} را حذف کنید؟",
- "message.confirm-leave": "آیا مطمئن هستید میخواهید از {target} خارج شوید؟",
- "message.confirm-remove": "آیا مطمئن هستید میخواهید {target} را حذف کنید؟",
- "message.confirm-reset": "آیا مطمئن هستید میخواهید {target} را بازنشانی کنید؟",
- "message.delete-team-warning": "با حذف تیم، تمامی وبسایتهای تیم هم حذف خواهند شد.",
- "message.delete-website-warning": "همهی دادههای وبسایت هم حذف خواهد شد.",
- "message.error": "مشکلی پیش آمده است.",
- "message.event-log": "{event} در {url}",
- "message.go-to-settings": "رفتن به تنظیمات",
- "message.incorrect-username-password": "نام کاربری / رمز نادرست است.",
- "message.invalid-domain": "دامنه نامعتبر است.",
- "message.min-password-length": "حداقل طول {n} کاراکتر است.",
- "message.new-version-available": "نسخهی جدیدی از Umami {version} در دسترس است.",
- "message.no-data-available": "اطلاعاتی موجود نیست.",
- "message.no-event-data": "هیچ دادهای برای این رویداد وجود ندارد.",
- "message.no-match-password": "رمزها یکسان نیستند",
- "message.no-results-found": "نتیجهای یافت نشد.",
- "message.no-team-websites": "هیچ وبسایتی برای این تیم وجود ندارد.",
- "message.no-teams": "شما هیچ تیمی را ایجاد نکردهاید.",
- "message.no-users": "هیچ کاربری وجود ندارد.",
- "message.no-websites-configured": "شما هیچ وبسایتی را پیکربندی نکردهاید.",
- "message.page-not-found": "صفحه یافت نشد.",
- "message.reset-website": "برای بازنشانی وبسایت، لطفاً {confirmation} را تایپ کنید.",
- "message.reset-website-warning": "تمامی آمارهای این وبسایت حذف خواهد شد اما کدهای رهگیری بدون تغییر باقی میماند.",
- "message.saved": "ذخیره شد.",
- "message.share-url": "آمار وبسایت شما به صورت عمومی در آدرس زیر قابل مشاهده است.",
- "message.team-already-member": "شما از قبل عضو این تیم هستید.",
- "message.team-not-found": "تیم یافت نشد.",
- "message.team-websites-info": "وبسایتها توسط تمامی اعضای تیم قابل مشاهده هستند.",
- "message.tracking-code": "کد رهگیری",
- "message.transfer-team-website-to-user": "آیا میخواهید این وبسایت را به حساب خود منتقل کنید؟",
- "message.transfer-user-website-to-team": "تیم مورد نظر را برای انتقال وبسایت انتخاب کنید.",
- "message.transfer-website": "مالکیت وبسایت را به حساب خودت یا یک تیم دیگر منتقل کنید.",
- "message.triggered-event": "رویداد فعال شده",
- "message.user-deleted": "کاربر حذف شد.",
- "message.viewed-page": "صفحه مشاهده شد",
- "message.visitor-log": "بازدیدکننده از کشور {country} با مروگر {browser} در {os} {device}",
- "message.visitors-dropped-off": "ریزش بازدیدکنندهها"
-}
diff --git a/src/lang/fi-FI.json b/src/lang/fi-FI.json
deleted file mode 100644
index a47df265d..000000000
--- a/src/lang/fi-FI.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Toiminnat",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Lisää verkkosivu",
- "label.admin": "Järjestelmänvalvoja",
- "label.after": "After",
- "label.all": "Kaikki",
- "label.all-time": "Alusta lähtien",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Takaisin",
- "label.before": "Before",
- "label.bounce-rate": "Välitön poistuminen",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Selaimet",
- "label.cancel": "Peruuta",
- "label.change-password": "Vaihda salasana",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Vahvista salasana",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Maat",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Nykyinen salasana",
- "label.custom-range": "Mukautettu ajanjakso",
- "label.dashboard": "Ohjauspaneeli",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Ajanjakso",
- "label.day": "Day",
- "label.default-date-range": "Oletusajanjakso",
- "label.delete": "Poista",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Poista verkkosivu",
- "label.description": "Description",
- "label.desktop": "Pöytäkone",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Laitteet",
- "label.dismiss": "Hylkää",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Verkkotunnus",
- "label.dropoff": "Dropoff",
- "label.edit": "Muokkaa",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Ota jakamisen URL-osoite käyttöön",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Tapahtumat",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Yhdistetty",
- "label.filter-raw": "Käsittelemätön",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Kieli",
- "label.languages": "Kielet",
- "label.laptop": "Kannettava tietokone",
- "label.last-days": "Viimeisimmät {x} päivää",
- "label.last-hours": "Viimeisimmät {x} tuntia",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Kirjaudu sisään",
- "label.logout": "Kirjaudu ulos",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Puhelin",
- "label.more": "Lisää",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Nimi",
- "label.new-password": "Uusi salasana",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Omistaja",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Sivun näyttökerrat",
- "label.pageTitle": "Page title",
- "label.pages": "Sivut",
- "label.password": "Salasana",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Voimanlähteenä {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profiili",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Juuri nyt",
- "label.referrer": "Referrer",
- "label.referrers": "Viittaajat",
- "label.refresh": "Päivitä",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Vaaditaan",
- "label.reset": "Nollaa",
- "label.reset-website": "Nollaa tilastot",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Tallenna",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Asetukset",
- "label.share-url": "Jaa URL",
- "label.single-day": "Yksi päivä",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tabletti",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Teema",
- "label.this-month": "Tämä kuukausi",
- "label.this-week": "Tämä viikko",
- "label.this-year": "Tämä vuosi",
- "label.timezone": "Aikavyöhyke",
- "label.title": "Title",
- "label.today": "Tänään",
- "label.toggle-charts": "Kytke kaaviot päälle/pois",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Seurantakoodi",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Yksittäiset kävijät",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Tuntematon",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Käyttäjänimi",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Katso tiedot",
- "label.view-only": "View only",
- "label.views": "Näyttökerrat",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Keskimääräinen vierailuaika",
- "label.visitors": "Vierailijat",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Verkkosivut",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} {x, plural, one {vierailija} other {vierailijaa}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Haluatko varmasti poistaa sivuston {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Haluatko varmasti poistaa sivuston {target} tilastot?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Kaikki siihen liittyvät tiedot poistetaan.",
- "message.error": "Jotain meni pieleen.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Mene asetuksiin",
- "message.incorrect-username-password": "Väärä käyttäjänimi/salasana.",
- "message.invalid-domain": "Virheellinen verkkotunnus",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Tietoja ei ole käytettävissä.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Salasanat eivät täsmää",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.",
- "message.page-not-found": "Sivua ei löydetty.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana.",
- "message.saved": "Tallennettu onnistuneesti.",
- "message.share-url": "Tämä on julkisesti jaettu URL sivustolle {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Seurantakoodi",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/fo-FO.json b/src/lang/fo-FO.json
deleted file mode 100644
index 231753029..000000000
--- a/src/lang/fo-FO.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Gerðir",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Legg heimasíðu afturat",
- "label.admin": "Fyrisitari",
- "label.after": "After",
- "label.all": "Alt",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Aftur",
- "label.before": "Before",
- "label.bounce-rate": "Bounce prosenttal",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Kagar",
- "label.cancel": "Strika",
- "label.change-password": "Skift loyniorð",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Vátta loyniorð",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Lond",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Núverandi loyniorð",
- "label.custom-range": "Tillaga spenni",
- "label.dashboard": "Yvirlitsskíggi",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Vel dato",
- "label.day": "Day",
- "label.default-date-range": "Forsett dato",
- "label.delete": "Sletta",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Sletta heimasíðu",
- "label.description": "Description",
- "label.desktop": "Borðtelda",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Tóleindir",
- "label.dismiss": "Lat fara",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Økisnavn",
- "label.dropoff": "Dropoff",
- "label.edit": "Ger broyting",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Virkja deili leinki",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Hendingar/tiltøk",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Samansett",
- "label.filter-raw": "Óviðgjørt",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Fartelda",
- "label.last-days": "Seinastu {x} dagarnar",
- "label.last-hours": "Seinastu {x} tímarnar",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Rita inn",
- "label.logout": "Rita út",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Telefon",
- "label.more": "Meira",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Navn",
- "label.new-password": "Nýtt loyniorð",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Opnaðar síðir",
- "label.pageTitle": "Page title",
- "label.pages": "Síðir",
- "label.password": "Loyniorð",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Vangi",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Beinleiðis",
- "label.referrer": "Referrer",
- "label.referrers": "Framsendingar",
- "label.refresh": "Endurskapa",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Kravt",
- "label.reset": "Nulstilla",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Goym",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Stillingar",
- "label.share-url": "Deil leinku",
- "label.single-day": "Einkultur dagur",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Teldil",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Hendan mánan",
- "label.this-week": "Hesa vikuna",
- "label.this-year": "Hetta árið",
- "label.timezone": "Tíðarsona",
- "label.title": "Title",
- "label.today": "Í dag",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Spori kota",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Einsýna vitjanir",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Ókent",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Brúkaranavn",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Vís frágreiðing",
- "label.view-only": "View only",
- "label.views": "Sýningar",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Miðal vitjurnartíð ",
- "label.visitors": "Vitjandi",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Heimasíður",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} í løtuni {x, plural, one {vitjandi} other { vitjandi }}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Ert tú sikkur at tú ynskir at strika {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Øll data ið er knýtt at verður eisini strika.",
- "message.error": "Okkurt bleiv gali.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Far til stillingar",
- "message.incorrect-username-password": "Skeivt brúkaranavn/loyniorð.",
- "message.invalid-domain": "Ógilt økisnavn",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Einki data tøk.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Loyniorðini eru ikki eins",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
- "message.page-not-found": "Síðan bleiv ikki funnin.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Goymt.",
- "message.share-url": "Hettar er tann almenna leinkan av {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Spori kota",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Vitjandi frá {country} brúkar {browser} á {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
deleted file mode 100644
index 55911dcc2..000000000
--- a/src/lang/fr-FR.json
+++ /dev/null
@@ -1,307 +0,0 @@
-{
- "label.access-code": "Code d'accès",
- "label.actions": "Actions",
- "label.activity": "Journal d'activité",
- "label.add": "Ajouter",
- "label.add-description": "Ajouter une description",
- "label.add-member": "Ajouter un membre",
- "label.add-step": "Ajouter une étape",
- "label.add-website": "Ajouter un site",
- "label.admin": "Administrateur",
- "label.affiliate": "Affiliation",
- "label.after": "Après",
- "label.all": "Tout",
- "label.all-time": "Toutes les données",
- "label.analytics": "Analytics",
- "label.attribution": "Attribution",
- "label.attribution-description": "Découvrez comment les utilisateurs s'engagent avec votre marketing et ce qui génère des conversions.",
- "label.average": "Moyenne",
- "label.back": "Retour",
- "label.before": "Avant",
- "label.bounce-rate": "Taux de rebond",
- "label.breakdown": "Répartition",
- "label.browser": "Navigateur",
- "label.browsers": "Navigateurs",
- "label.campaigns": "Campagnes",
- "label.cancel": "Annuler",
- "label.change-password": "Changer le mot de passe",
- "label.channels": "Canaux",
- "label.cities": "Villes",
- "label.city": "Ville",
- "label.clear-all": "Réinitialiser",
- "label.compare": "Comparer",
- "label.confirm": "Confirmer",
- "label.confirm-password": "Confirmation du mot de passe",
- "label.contains": "Contient",
- "label.content": "Contenu",
- "label.continue": "Continuer",
- "label.conversion-step": "Étape de conversion",
- "label.count": "Compte",
- "label.countries": "Pays",
- "label.country": "Pays",
- "label.create": "Créer",
- "label.create-report": "Créer un rapport",
- "label.create-team": "Créer une équipe",
- "label.create-user": "Créer un utilisateur",
- "label.created": "Créé",
- "label.created-by": "Créé par",
- "label.currency": "Devise",
- "label.current": "Actuel",
- "label.current-password": "Mot de passe actuel",
- "label.custom-range": "Période personnalisée",
- "label.dashboard": "Tableau de bord",
- "label.data": "Données",
- "label.date": "Date",
- "label.date-range": "Période",
- "label.day": "Jour",
- "label.default-date-range": "Période par défaut",
- "label.delete": "Supprimer",
- "label.delete-report": "Supprimer le rapport",
- "label.delete-team": "Supprimer l'équipe",
- "label.delete-user": "Supprimer l'utilisateur",
- "label.delete-website": "Supprimer le site",
- "label.description": "Description",
- "label.desktop": "Ordinateur",
- "label.details": "Détails",
- "label.device": "Appareil",
- "label.devices": "Appareils",
- "label.direct": "Direct",
- "label.dismiss": "Ignorer",
- "label.does-not-contain": "Ne contient pas",
- "label.domain": "Domaine",
- "label.dropoff": "Abandons",
- "label.edit": "Modifier",
- "label.edit-dashboard": "Modifier le tableau de bord",
- "label.edit-member": "Modifier le membre",
- "label.email": "E-mail",
- "label.enable-share-url": "Activer l'URL de partage",
- "label.end-step": "Étape de fin",
- "label.entry": "Chemin d'entrée",
- "label.event": "Évènement",
- "label.event-data": "Données d'évènements",
- "label.events": "Évènements",
- "label.exit": "Chemin de sortie",
- "label.false": "Faux",
- "label.field": "Champ",
- "label.fields": "Champs",
- "label.filter": "Filtrer",
- "label.filter-combined": "Combiné",
- "label.filter-raw": "Brut",
- "label.filters": "Filtres",
- "label.first-seen": "Vu pour la première fois",
- "label.funnel": "Entonnoir",
- "label.funnel-description": "Comprenez les taux de conversions et d'abandons des utilisateurs.",
- "label.goal": "Objectif",
- "label.goals": "Objectifs",
- "label.goals-description": "Suivez vos objectifs en matière de pages vues et d'événements.",
- "label.greater-than": "Supérieur à",
- "label.greater-than-equals": "Supérieur ou égal à",
- "label.grouped": "Groupé",
- "label.host": "Hôte",
- "label.hosts": "Hôtes",
- "label.insights": "Insights",
- "label.insights-description": "Analysez précisément vos données en utilisant des segments et des filtres.",
- "label.is": "Est",
- "label.is-not": "N'est pas",
- "label.is-not-set": "N'est pas défini",
- "label.is-set": "Est défini",
- "label.join": "Rejoindre",
- "label.join-team": "Rejoindre une équipe",
- "label.journey": "Parcours",
- "label.journey-description": "Comprennez comment les utilisateurs naviguent sur votre site.",
- "label.language": "Langue",
- "label.languages": "Langues",
- "label.laptop": "Portable",
- "label.last-days": "{x} derniers jours",
- "label.last-hours": "{x} dernières heures",
- "label.last-months": "{x} derniers mois",
- "label.last-seen": "Vu pour la dernière fois",
- "label.leave": "Quitter",
- "label.leave-team": "Quitter l'équipe",
- "label.less-than": "Inférieur à",
- "label.less-than-equals": "Inférieur ou égal à",
- "label.login": "Connexion",
- "label.logout": "Déconnexion",
- "label.manage": "Gérer",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.medium": "Support",
- "label.member": "Membre",
- "label.members": "Membres",
- "label.min": "Min",
- "label.mobile": "Téléphone",
- "label.model": "Modèle",
- "label.more": "Plus",
- "label.my-account": "Mon compte",
- "label.my-websites": "Mes sites",
- "label.name": "Nom",
- "label.new-password": "Nouveau mot de passe",
- "label.none": "Aucun",
- "label.number-of-records": "{x} {x, plural, one {enregistrement} other {enregistrements}}",
- "label.ok": "OK",
- "label.organic-search": "Recherche organique",
- "label.organic-shopping": "E-commerce organique",
- "label.organic-social": "Réseau social organique",
- "label.organic-video": "Vidéo organique",
- "label.os": "OS",
- "label.other": "Autre",
- "label.overview": "Vue d'ensemble",
- "label.owner": "Propriétaire",
- "label.page-of": "Page {current} sur {total}",
- "label.page-views": "Pages vues",
- "label.pageTitle": "Titre de page",
- "label.pages": "Pages",
- "label.paid-ads": "Publicités payantes",
- "label.paid-search": "Recherche payante",
- "label.paid-shopping": "E-commerce payant",
- "label.paid-social": "Réseau social payant",
- "label.paid-video": "Vidéo payante",
- "label.password": "Mot de passe",
- "label.path": "Chemin",
- "label.paths": "Chemins",
- "label.powered-by": "Propulsé par {name}",
- "label.previous": "Précédent",
- "label.previous-period": "Période précédente",
- "label.previous-year": "Année précédente",
- "label.profile": "Profil",
- "label.properties": "Propriétés",
- "label.property": "Propriété",
- "label.queries": "Requêtes",
- "label.query": "Requête",
- "label.query-parameters": "Paramètres de requête",
- "label.realtime": "Temps réel",
- "label.referral": "Référent",
- "label.referrer": "Site référent",
- "label.referrers": "Sites référents",
- "label.refresh": "Rafraîchir",
- "label.regenerate": "Régénérer",
- "label.region": "Région",
- "label.regions": "Régions",
- "label.remove": "Retirer",
- "label.remove-member": "Retirer le membre",
- "label.reports": "Rapports",
- "label.required": "Requis",
- "label.reset": "Réinitialiser",
- "label.reset-website": "Réinitialiser les statistiques",
- "label.retention": "Rétention",
- "label.retention-description": "Mesurez l'attractivité de votre site en suivant la fréquence de retour des utilisateurs.",
- "label.revenue": "Recettes",
- "label.revenue-description": "Examinez vos recettes et comment dépensent vos utilisateurs.",
- "label.role": "Rôle",
- "label.run-query": "Exécuter la requête",
- "label.save": "Enregistrer",
- "label.screens": "Résolutions d'écran",
- "label.search": "Rechercher",
- "label.select": "Sélectionner",
- "label.select-date": "Choisir une période",
- "label.select-role": "Choisir un rôle",
- "label.select-website": "Choisir un site",
- "label.session": "Session",
- "label.session-data": "Session data",
- "label.sessions": "Sessions",
- "label.settings": "Paramètres",
- "label.share-url": "URL de partage",
- "label.single-day": "Journée",
- "label.sms": "SMS",
- "label.sources": "Sources",
- "label.start-step": "Étape de départ",
- "label.steps": "Étapes",
- "label.sum": "Somme",
- "label.tablet": "Tablette",
- "label.tag": "Tag",
- "label.tags": "Tags",
- "label.team": "Équipe",
- "label.team-id": "ID d'équipe",
- "label.team-manager": "Manager de l'équipe",
- "label.team-member": "Membre de l'équipe",
- "label.team-name": "Nom de l'équipe",
- "label.team-owner": "Propriétaire de l'équipe",
- "label.team-view-only": "Vue d'équipe uniquement",
- "label.team-websites": "Sites d'équipes",
- "label.teams": "Équipes",
- "label.terms": "Mots clés",
- "label.theme": "Thème",
- "label.this-month": "Ce mois",
- "label.this-week": "Cette semaine",
- "label.this-year": "Cette année",
- "label.timezone": "Fuseau horaire",
- "label.title": "Titre",
- "label.today": "Aujourd'hui",
- "label.toggle-charts": "Afficher/Masquer les graphiques",
- "label.total": "Total",
- "label.total-records": "Nombre d'enregistrements",
- "label.tracking-code": "Code de suivi",
- "label.transactions": "Transactions",
- "label.transfer": "Transférer",
- "label.transfer-website": "Transférer le site",
- "label.true": "Vrai",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Visiteurs uniques",
- "label.uniqueCustomers": "Clients uniques",
- "label.unknown": "Inconnu",
- "label.untitled": "Sans titre",
- "label.update": "Modifier",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Utilisateur",
- "label.username": "Nom d'utilisateur",
- "label.users": "Utilisateurs",
- "label.utm": "UTM",
- "label.utm-description": "Suivez vos campagnes via les paramètres UTM.",
- "label.value": "Valeur",
- "label.view": "Voir",
- "label.view-details": "Voir les détails",
- "label.view-only": "Consultation",
- "label.views": "Vues",
- "label.views-per-visit": "Vues par visite",
- "label.visit-duration": "Temps de visite",
- "label.visitors": "Visiteurs",
- "label.visits": "Visites",
- "label.website": "Site",
- "label.website-id": "ID de site",
- "label.websites": "Sites",
- "label.window": "Fenêtre",
- "label.yesterday": "Hier",
- "message.action-confirmation": "Taper {confirmation} ci-dessous pour confirmer.",
- "message.active-users": "{x} {x, plural, one {visiteur} other {visiteurs}} actuellement",
- "message.collected-data": "Donnée collectée",
- "message.confirm-delete": "Êtes-vous sûr de vouloir supprimer {target} ?",
- "message.confirm-leave": "Êtes-vous sûr de vouloir quitter {target} ?",
- "message.confirm-remove": "Êtes-vous sûr de vouloir retirer {target} ?",
- "message.confirm-reset": "Êtes-vous sûr de vouloir réinitialiser les statistiques de {target} ?",
- "message.delete-team-warning": "Supprimer une équipe supprimera aussi tous les sites de cette équipe.",
- "message.delete-website-warning": "Toutes les données associées seront supprimées.",
- "message.error": "Un problème est survenu.",
- "message.event-log": "{event} sur {url}",
- "message.go-to-settings": "Aller aux paramètres",
- "message.incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.",
- "message.invalid-domain": "Domaine invalide",
- "message.min-password-length": "Taille minimale de {n} caractères",
- "message.new-version-available": "Une nouvelle version d'Umami {version} est disponible !",
- "message.no-data-available": "Aucune donnée disponible.",
- "message.no-event-data": "Aucune donnée d'événement disponible.",
- "message.no-match-password": "Les mots de passe ne correspondent pas",
- "message.no-results-found": "Aucun résultat n'a été trouvé.",
- "message.no-team-websites": "Cette équipe n'a aucun site.",
- "message.no-teams": "Vous n'avez pas créé d'équipe.",
- "message.no-users": "Aucun utilisateur.",
- "message.no-websites-configured": "Vous n'avez pas configuré de site.",
- "message.page-not-found": "Page non trouvée.",
- "message.reset-website": "Pour réinitialiser ce site, taper {confirmation} ci-dessous pour confirmer.",
- "message.reset-website-warning": "Toutes les statistiques pour ce site seront supprimées, mais votre code de suivi restera intact.",
- "message.saved": "Enregistré.",
- "message.share-url": "Les statistiques de votre site sont accessibles publiquement sur cette URL :",
- "message.team-already-member": "Vous êtes déjà membre de cette équipe.",
- "message.team-not-found": "Équipe non trouvée.",
- "message.team-websites-info": "Les sites peuvent être vus par tout utilisateur dans l'équipe.",
- "message.tracking-code": "Code de suivi",
- "message.transfer-team-website-to-user": "Transférer ce site sur votre compte ?",
- "message.transfer-user-website-to-team": "Choisir l'équipe à laquelle transférer ce site.",
- "message.transfer-website": "Transférer la propriété du site sur votre compte ou à une autre équipe.",
- "message.triggered-event": "Évènement déclenché",
- "message.user-deleted": "Utilisateur supprimé.",
- "message.viewed-page": "Page vue",
- "message.visitor-log": "Visiteur de {country} utilisant {browser} sur {os} {device}",
- "message.visitors-dropped-off": "Visiteurs ont abandonné"
-}
diff --git a/src/lang/ga-ES.json b/src/lang/ga-ES.json
deleted file mode 100644
index 3af959f7a..000000000
--- a/src/lang/ga-ES.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Código de acceso",
- "label.actions": "Accións",
- "label.activity": "Rexistro de actividade",
- "label.add": "Engadir",
- "label.add-description": "Engadir descrición",
- "label.add-member": "Engadir membro",
- "label.add-step": "Engadir paso",
- "label.add-website": "Engadir sitio web",
- "label.admin": "Administrador/a",
- "label.after": "After",
- "label.all": "Todo",
- "label.all-time": "Sempre",
- "label.analytics": "Analíticas",
- "label.average": "Media",
- "label.back": "Atrás",
- "label.before": "Antes",
- "label.bounce-rate": "Proporción de rebote",
- "label.breakdown": "Desglose",
- "label.browser": "Navegador",
- "label.browsers": "Navegadores",
- "label.cancel": "Cancelar",
- "label.change-password": "Mudar contrasinal",
- "label.cities": "Cidades",
- "label.city": "Cidade",
- "label.clear-all": "Clear all",
- "label.compare": "Comparar",
- "label.confirm": "Confirmar",
- "label.confirm-password": "Confirmar contrasinal",
- "label.contains": "Contén",
- "label.continue": "Continuar",
- "label.count": "Reconto",
- "label.countries": "Países",
- "label.country": "País",
- "label.create": "Crear",
- "label.create-report": "Crear report",
- "label.create-team": "Crear team",
- "label.create-user": "Crear user",
- "label.created": "Creado",
- "label.created-by": "Creado por",
- "label.current": "Actual",
- "label.current-password": "Contrasinal actual",
- "label.custom-range": "Rango personalizado",
- "label.dashboard": "Taboleiro",
- "label.data": "Datos",
- "label.date": "Data",
- "label.date-range": "Rango temporal",
- "label.day": "Día",
- "label.default-date-range": "Rango temporal por defecto",
- "label.delete": "Eliminar",
- "label.delete-report": "Eliminar reporte",
- "label.delete-team": "Eliminar equipo",
- "label.delete-user": "Eliminar usuario",
- "label.delete-website": "Eliminar sitio web",
- "label.description": "Descripción",
- "label.desktop": "Escritorio",
- "label.details": "Detalles",
- "label.device": "Dispositivo",
- "label.devices": "Dispositivos",
- "label.dismiss": "Desbotar",
- "label.does-not-contain": "Non contén",
- "label.domain": "Dominio",
- "label.dropoff": "Disminución",
- "label.edit": "Editar",
- "label.edit-dashboard": "Editar taboleiro",
- "label.edit-member": "Editar membro",
- "label.enable-share-url": "Activar URL de compartición",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Evento",
- "label.event-data": "Datos do evento",
- "label.events": "Eventos",
- "label.exit": "URL de saída",
- "label.false": "Falso",
- "label.field": "Campo",
- "label.fields": "Campos",
- "label.filter": "Filtro",
- "label.filter-combined": "Combinado",
- "label.filter-raw": "Crú",
- "label.filters": "Filtros",
- "label.first-seen": "Primeira visita",
- "label.funnel": "Funnel",
- "label.funnel-description": "Entende a taxa de conversión e de abandono dos usuarios.",
- "label.goal": "Obxectivo",
- "label.goals": "Obxectivos",
- "label.goals-description": "Segue os teus obxectivos de visualizacións de páxinas e eventos.",
- "label.greater-than": "Maior que",
- "label.greater-than-equals": "Maior ou igual que",
- "label.host": "Dominio",
- "label.hosts": "Dominios",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "É",
- "label.is-not": "Non é",
- "label.is-not-set": "Non está establecido",
- "label.is-set": "Está establecido",
- "label.join": "Unirse",
- "label.join-team": "Unirse ao equipo",
- "label.journey": "Traxectoria",
- "label.journey-description": "Entende como os usuarios navegan polo teu sitio web.",
- "label.language": "Idioma",
- "label.languages": "Idiomas",
- "label.laptop": "Portátil",
- "label.last-days": "Últimos {x} días",
- "label.last-hours": "Últimas {x} horas",
- "label.last-months": "Últimos {x} meses",
- "label.last-seen": "Última visita",
- "label.leave": "Deixar",
- "label.leave-team": "Deixar o equipo",
- "label.less-than": "Menor que",
- "label.less-than-equals": "Menor ou igual que",
- "label.login": "Acceder",
- "label.logout": "Pechar sesión",
- "label.manage": "Xestionar",
- "label.manager": "Xestor",
- "label.max": "Max",
- "label.member": "Membro",
- "label.members": "Membros",
- "label.min": "Min",
- "label.mobile": "Móbil",
- "label.more": "Máis",
- "label.my-account": "A miña conta",
- "label.my-websites": "Os meus sitios web",
- "label.name": "Nome",
- "label.new-password": "Novo contrasinal",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "Sistema operativo",
- "label.overview": "Resumo",
- "label.owner": "Propietario/a",
- "label.page-of": "Páxina {current} de {total}",
- "label.page-views": "Vistas de páxinas",
- "label.pageTitle": "Título da páxina",
- "label.pages": "Páxinas",
- "label.password": "Contrasinal",
- "label.path": "Ruta",
- "label.paths": "Rutas",
- "label.powered-by": "Funciona grazas a {name}",
- "label.previous": "Anterior",
- "label.previous-period": "Periodo anterior",
- "label.previous-year": "Ano anterior",
- "label.profile": "Perfil",
- "label.properties": "Propiedades",
- "label.property": "Propiedade",
- "label.queries": "Peticións",
- "label.query": "Petición",
- "label.query-parameters": "Parámetros da petición",
- "label.realtime": "Agora mesmo",
- "label.referrer": "Orixe",
- "label.referrers": "Orixes",
- "label.refresh": "Actualizar",
- "label.regenerate": "Rexenerar",
- "label.region": "Rexión",
- "label.regions": "Rexións",
- "label.remove": "Eliminar",
- "label.remove-member": "Eliminar membro",
- "label.reports": "Reportes",
- "label.required": "Requerido",
- "label.reset": "Restablecer",
- "label.reset-website": "Para restablecer este sitio web, escriba {confirmation} na caixa de texto de embaixo para confirmar.",
- "label.retention": "Retención",
- "label.retention-description": "Mide a fidelidade dos usuarios ao teu sitio web seguindo a frecuencia coa que volven.",
- "label.revenue": "Ingresos",
- "label.revenue-description": "Consulta os teus ingresos ao longo do tempo.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rol",
- "label.run-query": "Executar petición",
- "label.save": "Gardar",
- "label.screens": "Pantallas",
- "label.search": "Buscar",
- "label.select": "Seleccionar",
- "label.select-date": "Seleccionar data",
- "label.select-role": "Seleccionar rol",
- "label.select-website": "Seleccionar sitio web",
- "label.session": "Sesión",
- "label.sessions": "Sesións",
- "label.settings": "Axustes",
- "label.share-url": "Compartir URL",
- "label.single-day": "Un só día",
- "label.start-step": "Start Step",
- "label.steps": "Pasos",
- "label.sum": "Suma",
- "label.tablet": "Tableta",
- "label.team": "Equipo",
- "label.team-id": "ID do equipo",
- "label.team-manager": "Xestor do equipo",
- "label.team-member": "Membro do equipo",
- "label.team-name": "Nome do equipo",
- "label.team-owner": "Propietario do equipo",
- "label.team-view-only": "Equipo de só lectura",
- "label.team-websites": "Sitios web do equipo",
- "label.teams": "Equipos",
- "label.theme": "Decorado",
- "label.this-month": "Este mes",
- "label.this-week": "Esta semana",
- "label.this-year": "Este ano",
- "label.timezone": "Zona horaria",
- "label.title": "Título",
- "label.today": "Hoxe",
- "label.toggle-charts": "Activación das gráficas",
- "label.total": "Total",
- "label.total-records": "Rexistros totais",
- "label.tracking-code": "Código de seguemento",
- "label.transactions": "Transaccións",
- "label.transfer": "Transferir",
- "label.transfer-website": "Transferir sitio web",
- "label.true": "Verdadeiro",
- "label.type": "Tipo",
- "label.unique": "Único",
- "label.unique-visitors": "Visitas únicas",
- "label.uniqueCustomers": "Clientes únicos",
- "label.unknown": "Descoñecido",
- "label.untitled": "Sen título",
- "label.update": "Actualizar",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Usuario",
- "label.user-property": "Propiedade do usuario",
- "label.username": "Identificador",
- "label.users": "Usuarios",
- "label.utm": "UTM",
- "label.utm-description": "Segue as túas campañas a través dos parámetros UTM.",
- "label.value": "Valor",
- "label.view": "Vista",
- "label.view-details": "Ver detalles",
- "label.view-only": "Só lectura",
- "label.views": "Visualizacións",
- "label.views-per-visit": "Visualizacións por visita",
- "label.visit-duration": "Tempo medio de visita",
- "label.visitors": "Visitantes",
- "label.visits": "Visitas",
- "label.website": "Sitio web",
- "label.website-id": "ID do sitio web",
- "label.websites": "Sitios web",
- "label.window": "Ventá",
- "label.yesterday": "Onte",
- "message.action-confirmation": "Escribe {confirmation} na caixa de embaixo para confirmar.",
- "message.active-users": "{x} actual {x, plural, one {visitante} other {visitantes}}",
- "message.collected-data": "Datos recopilados",
- "message.confirm-delete": "Estás seguro/a de que queres eliminar {target}?",
- "message.confirm-leave": "Estás seguro/a de que queres deixar {target}?",
- "message.confirm-remove": "Estás seguro/a de que queres eliminar {target}?",
- "message.confirm-reset": "Estás seguro/a de querer restablecer as estatísticas de {target}?",
- "message.delete-team-warning": "Eliminar un equipo tamén eliminará tódolos sitios web do equipo.",
- "message.delete-website-warning": "Tamén serán borrados tódolos datos asociados.",
- "message.error": "Houbo un fallo.",
- "message.event-log": "{event} en {url}",
- "message.go-to-settings": "Ir aos axustes",
- "message.incorrect-username-password": "Credenciais incorrectas.",
- "message.invalid-domain": "Dominio non válido",
- "message.min-password-length": "Lonxitude mínima de {n} caracteres",
- "message.new-version-available": "Unha nova versión de Umami {version} está dispoñible!",
- "message.no-data-available": "Sen datos dispoñibles.",
- "message.no-event-data": "Sen datos de eventos dispoñibles.",
- "message.no-match-password": "Non concordan os contrasinais",
- "message.no-results-found": "Non se atoparon resultados.",
- "message.no-team-websites": "Este equipo non ten ningún sitio web.",
- "message.no-teams": "Non creaches ningún equipo.",
- "message.no-users": "Non hai usuarios.",
- "message.no-websites-configured": "Non tes sitios web configurados.",
- "message.page-not-found": "Páxina non atopada.",
- "message.reset-website": "Para restablecer este sitio web, escriba {confirmation} na caixa de embaixo para confirmar.",
- "message.reset-website-warning": "Vanse eliminar tódalas estatísticas deste sitio web, pero o código de seguimento permanecerá sen cambios.",
- "message.saved": "Gardouse correctamente.",
- "message.share-url": "Este é o URL da compartición pública de {target}.",
- "message.team-already-member": "Xa es membro do equipo.",
- "message.team-not-found": "Equipo non atopado.",
- "message.team-websites-info": "Os sitios web poden ser vistos por calquera membro do equipo.",
- "message.tracking-code": "Código de seguimento",
- "message.transfer-team-website-to-user": "Transferir este sitio web á túa conta?",
- "message.transfer-user-website-to-team": "Selecciona o equipo ao que transferir este sitio web.",
- "message.transfer-website": "Transferir propiedade do sitio web á túa conta ou a outro equipo.",
- "message.triggered-event": "Activou o evento",
- "message.user-deleted": "Usuario eliminado.",
- "message.viewed-page": "Páxina vista",
- "message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
- "message.visitors-dropped-off": "Visitantes abandonados"
-}
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
deleted file mode 100644
index fd25cd144..000000000
--- a/src/lang/he-IL.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "פעולות",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "הוספת אתר",
- "label.admin": "מנהל",
- "label.after": "After",
- "label.all": "הכל",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "חזרה",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "דפדפנים",
- "label.cancel": "ביטול",
- "label.change-password": "שינוי סיסמה",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "אישור סיסמה",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "מדינות",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "סיסמה נוכחית",
- "label.custom-range": "טווח מותאם",
- "label.dashboard": "דשבורד",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "טווח תאריכים",
- "label.day": "Day",
- "label.default-date-range": "טווח תאריכים בברירת מחדל",
- "label.delete": "הסרה",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "הסרת אתר",
- "label.description": "Description",
- "label.desktop": "דסקטופ",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "מכשירים",
- "label.dismiss": "שיחרור",
- "label.does-not-contain": "Does not contain",
- "label.domain": "דומיין",
- "label.dropoff": "Dropoff",
- "label.edit": "עריכה",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "הפעלת URL שיתוף",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "אירועים",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "משותף",
- "label.filter-raw": "גולמי",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "לפטופ",
- "label.last-days": "{x} ימים אחרונים",
- "label.last-hours": "{x} שעות אחרונות",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "התחברות",
- "label.logout": "התנתקות",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "מובייל",
- "label.more": "עוד",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "שם",
- "label.new-password": "סיסמה חדשה",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "צפיות בדפים",
- "label.pageTitle": "Page title",
- "label.pages": "דפים",
- "label.password": "סיסמה",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "פרופיל",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "זמן אמת",
- "label.referrer": "Referrer",
- "label.referrers": "מפנים",
- "label.refresh": "רענון",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "נדרש",
- "label.reset": "איפוס",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "שמירה",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "הגדרות",
- "label.share-url": "שיתוף URL",
- "label.single-day": "יום בודד",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "טאבלט",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "החודש",
- "label.this-week": "השבוע",
- "label.this-year": "השנה",
- "label.timezone": "אזור זמן",
- "label.title": "Title",
- "label.today": "היום",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "קוד מעקב",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "מבקרים ייחודיים",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "לא ידוע",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "שם משתמש",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "פרטים נוספים",
- "label.view-only": "View only",
- "label.views": "צפיות",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "זמן ביקור ממוצע",
- "label.visitors": "מבקרים",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "אתרים",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} נוכחיים {x, plural, one {מבקר} other {מבקרים}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "האם באמת למחוק את {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "כל המידע המקושר יימחק",
- "message.error": "משהו השתבש",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "להדרותג",
- "message.incorrect-username-password": "שם משתמש או סיסמה לא נכונים",
- "message.invalid-domain": "דומיין לא תקין",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "אין מידע זמין",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "סיסמאות לא תואמות",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "לא מוגדרים אתרים",
- "message.page-not-found": "דף לא נמצא",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "נשמר בהצלחה",
- "message.share-url": "זהו URL ציבורי עבור {target}",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "קוד מעקב",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "מבקר ממדינת {country} משתמבש בדפדפן {browser} ב-{os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/hi-IN.json b/src/lang/hi-IN.json
deleted file mode 100644
index 65a3622e0..000000000
--- a/src/lang/hi-IN.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "पहुंच कोड",
- "label.actions": "कार्य",
- "label.activity": "गतिविधि लॉग",
- "label.add": "जोडो",
- "label.add-description": "विवरण लिखें",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "वेबसाइट",
- "label.admin": "प्रशासक",
- "label.after": "After",
- "label.all": "सब",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "पीछे",
- "label.before": "Before",
- "label.bounce-rate": "उछाल दर",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "वेब ब्राउज़र",
- "label.cancel": "रद्द करें",
- "label.change-password": "पासवर्ड बदलें",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "पासवर्ड की पुष्टि कीजिये",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "देश",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "वर्तमान पासवर्ड",
- "label.custom-range": "कस्टम रेंज",
- "label.dashboard": "नियंत्रण-पट्ट",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "तिथि सीमा",
- "label.day": "Day",
- "label.default-date-range": "डिफ़ॉल्ट तिथि सीमा",
- "label.delete": "खाता हटाएं",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "वेबसाइट हटाएं",
- "label.description": "Description",
- "label.desktop": "डेस्कटॉप",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "उपकरण",
- "label.dismiss": "खारिज कीजिये",
- "label.does-not-contain": "Does not contain",
- "label.domain": "डोमेन",
- "label.dropoff": "Dropoff",
- "label.edit": "संपादित करें",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "शेयर URL सक्षम करें",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "स्पर्धाएँ",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "संयुक्त",
- "label.filter-raw": "रॉ",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "लैपटॉप",
- "label.last-days": "पिछले {x} दिन",
- "label.last-hours": "पिछले {x} घंटे",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "लॉग इन",
- "label.logout": "लॉग आउट",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "मोबाइल फोन",
- "label.more": "और",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "नाम",
- "label.new-password": "नया पासवर्ड",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "पृष्ठ दृश्य",
- "label.pageTitle": "Page title",
- "label.pages": "पृष्ठों",
- "label.password": "पासवर्ड",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "{name} द्वारा संचालित",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "प्रोफ़ाइल",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "वास्तव काल",
- "label.referrer": "Referrer",
- "label.referrers": "सन्दर्भदाता",
- "label.refresh": "रिफ्रेश",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "प्रतिवेदन",
- "label.required": "अपेक्षित",
- "label.reset": "रीसेट",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "सहेजें",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "समायोजन",
- "label.share-url": "यूआरएल साझा करें",
- "label.single-day": "एक दिन",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "टैबलेट",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "इस महीने",
- "label.this-week": "इस सप्ताह",
- "label.this-year": "इस साल",
- "label.timezone": "समय क्षेत्र",
- "label.title": "Title",
- "label.today": "आज",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "ट्रैकिंग कोड",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "अद्वितीय आगंतुकों",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "अज्ञात",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "उपयोगकर्ता नाम",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "विवरण देखें",
- "label.view-only": "View only",
- "label.views": "दृश्य",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "औसत दृश्य समय",
- "label.visitors": "आगंतुकों",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "वेबसाइटों",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} मौजूद {x, plural, one {आगंतुक} other {आगंतुकों}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "क्या आप वाकई में {target} हटाना चाहते हैं?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "सभी संबद्ध डेटा को भी हटा दिया जाएगा।",
- "message.error": "कुछ गलत हो गया।",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "समायोजन में जाइए",
- "message.incorrect-username-password": "ग़लत उपयोगकर्ता नाम / पासवर्ड।",
- "message.invalid-domain": "अमान्य डोमेन",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "कोई डेटा उपलब्ध नहीं है।",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "पासवर्ड मेल नहीं खाते",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "आपके पास कोई वेबसाइट कॉन्फ़िगर नहीं है।",
- "message.page-not-found": "पृष्ठ नहीं मिला।",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "सफलतापूर्वक संचित कर लिया गया है।",
- "message.share-url": "यह {target} के लिए सार्वजनिक रूप से साझा किया गया URL है।",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "ट्रैकिंग कोड",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "{country} का आगंतुक, जो {browser} का उपयोग करता है, {os} यन्त्र पर",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
deleted file mode 100644
index 6bf12237a..000000000
--- a/src/lang/hr-HR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Actions",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Dodaj web stranicu",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "Sve",
- "label.all-time": "Svo vrijeme",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Natrag ",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "Odustani",
- "label.change-password": "Promijeni lozinku",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Potvrdi lozinku",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Countries",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Trenutna lozinka",
- "label.custom-range": "Prilagođeni raspon",
- "label.dashboard": "Nadzorna ploča",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Raspon datuma",
- "label.day": "Day",
- "label.default-date-range": "Zadani datumski raspon",
- "label.delete": "Obriši",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Obriši web stranicu",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Devices",
- "label.dismiss": "Odbaci",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domena",
- "label.dropoff": "Dropoff",
- "label.edit": "Uredi",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Omogući dijeljenje poveznice",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Podaci događaja",
- "label.events": "Events",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combined",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Jezik",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "Zadnjih {x} dana",
- "label.last-hours": "Zadnjih {x} sati",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Prijava",
- "label.logout": "Odjava",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "Više",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Ime",
- "label.new-password": "Nova lozinka",
- "label.none": "Ništa",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Vlasnik",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Page views",
- "label.pageTitle": "Page title",
- "label.pages": "Pages",
- "label.password": "Lozinka",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Stvarno vrijeme",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Osvježi",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Potrebna",
- "label.reset": "Resetirati",
- "label.reset-website": "Resetirati web stranicu",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Spremi",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Postavke",
- "label.share-url": "Podijeli poveznicu",
- "label.single-day": "Jedan dan",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Tema",
- "label.this-month": "Ovaj mjesec",
- "label.this-week": "Ovaj tjedan",
- "label.this-year": "Ova godina",
- "label.timezone": "Vremenska zona",
- "label.title": "Title",
- "label.today": "Danas",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Kod za praćenje",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unique visitors",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Nepoznato",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Korisničko ime",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Pogledaj detalje",
- "label.view-only": "View only",
- "label.views": "Views",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Visitors",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Web stranice",
- "label.window": "Window",
- "label.yesterday": "Jučer",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} Trenutno {x, plural, one {posjetitelj} other {posjetitelja}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Jeste li sigurni da želite obrisati {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Jeste li sigurni da želite resetirati {target}'s statistiku?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All website data will be deleted.",
- "message.error": "Something went wrong.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Idi u postavke",
- "message.incorrect-username-password": "Neispravno korisničke ime/lozinka.",
- "message.invalid-domain": "Invalid domain. Do not include http/https.",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Nema dostupnih podataka.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Passwords do not match.",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "You do not have any websites configured.",
- "message.page-not-found": "Stranica nije pronađena.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
- "message.saved": "Saved.",
- "message.share-url": "Ovo je javno dijeljena poveznica za {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "To track stats for this website, place the following code in the ... section of your HTML.",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/hu-HU.json b/src/lang/hu-HU.json
deleted file mode 100644
index 8593b37e7..000000000
--- a/src/lang/hu-HU.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Műveletek",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Weboldal hozzáadása",
- "label.admin": "Adminisztrátor",
- "label.after": "After",
- "label.all": "Összes",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Vissza",
- "label.before": "Before",
- "label.bounce-rate": "Visszafordulási arány",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Böngészők",
- "label.cancel": "Mégsem",
- "label.change-password": "Jelszó módosítása",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Jelszó megerősítése",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Országok",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Jelenlegi jelszó",
- "label.custom-range": "Egyedi tartomány",
- "label.dashboard": "Áttekintés",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Időintervallum",
- "label.day": "Day",
- "label.default-date-range": "Alapértelmezett időintervallum",
- "label.delete": "Eltávolítás",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Weboldal eltávolítása",
- "label.description": "Description",
- "label.desktop": "Asztali számítógép",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Eszközök",
- "label.dismiss": "Mellőzés",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "Módosítás",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "URL-megosztás engedélyezése",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Események",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Összevont",
- "label.filter-raw": "Nyers",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "Legutóbbi {x} nap",
- "label.last-hours": "Legutóbbi {x} óra",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Bejelentkezés",
- "label.logout": "Kijelentkezés",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Telefon",
- "label.more": "Bővebben",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Név",
- "label.new-password": "Új jelszó",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Oldalmegtekintések",
- "label.pageTitle": "Page title",
- "label.pages": "Oldalak",
- "label.password": "Jelszó",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Működteti az {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Valós idejű",
- "label.referrer": "Referrer",
- "label.referrers": "Hivatkozók",
- "label.refresh": "Frissítés",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Kötelező",
- "label.reset": "Visszaállítás",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Mentés",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Beállítások",
- "label.share-url": "URL megosztása",
- "label.single-day": "Egy nap",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Táblagép",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Ezen hónap",
- "label.this-week": "Ezen hét",
- "label.this-year": "Ezen év",
- "label.timezone": "Időzóna",
- "label.title": "Title",
- "label.today": "Ma",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Követési kód",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Egyedi látogatók",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Ismeretlen",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Felhasználónév",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Részletek",
- "label.view-only": "View only",
- "label.views": "Megtekintések",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Átlagos látogatási idő",
- "label.visitors": "Látogatók",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Weboldalak",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} {x, plural, one {látogató} other {latógató}} jelenleg",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Biztos, hogy törölni szeretnéd {target} elemet?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Minden társított adat törlésre kerül.",
- "message.error": "Valami baj történt.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Tovább a beállításokhoz",
- "message.incorrect-username-password": "Érvénytelen felhasználónév/jelszó.",
- "message.invalid-domain": "Érvénytelen domain",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Nincs rendelkezésre álló adat.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "A jelszavak nem egyeznek",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Még nem állítottál be egyetlen weboldalt sem.",
- "message.page-not-found": "Oldal nem található.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Sikeres mentés.",
- "message.share-url": "{target} nyilvánosan megosztott URL címe.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Követési kód",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Látógató {country} területéről, {os} {device} eszközön, {browser} böngészőből.",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
deleted file mode 100644
index b6eb83ce1..000000000
--- a/src/lang/id-ID.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Kode akses",
- "label.actions": "Aksi",
- "label.activity": "Catatan aktivitas",
- "label.add": "Tambah",
- "label.add-description": "Tambah deskripsi",
- "label.add-member": "Tambah anggota",
- "label.add-step": "Tambah langkah",
- "label.add-website": "Tambah situs web",
- "label.admin": "Pengelola",
- "label.after": "Setelah",
- "label.all": "Semua",
- "label.all-time": "Semua waktu",
- "label.analytics": "Analitik",
- "label.average": "Rata-rata",
- "label.back": "Kembali",
- "label.before": "Sebelum",
- "label.bounce-rate": "Rasio pentalan",
- "label.breakdown": "Rincian",
- "label.browser": "Peramban",
- "label.browsers": "Peramban",
- "label.cancel": "Batal",
- "label.change-password": "Ganti kata sandi",
- "label.cities": "Kota",
- "label.city": "Kota",
- "label.clear-all": "Hapus semua",
- "label.compare": "Bandingkan",
- "label.confirm": "Konfirmasi",
- "label.confirm-password": "Konfirmasi kata sandi",
- "label.contains": "Mengandung",
- "label.continue": "Lanjutkan",
- "label.count": "Jumlah",
- "label.countries": "Negara",
- "label.country": "Negara",
- "label.create": "Buat",
- "label.create-report": "Buat laporan",
- "label.create-team": "Buat tim",
- "label.create-user": "Buat pengguna",
- "label.created": "Dibuat",
- "label.created-by": "Dibuat oleh",
- "label.current": "Saat ini",
- "label.current-password": "Kata sandi sekarang",
- "label.custom-range": "Rentang khusus",
- "label.dashboard": "Dasbor",
- "label.data": "Data",
- "label.date": "Tanggal",
- "label.date-range": "Rentang tanggal",
- "label.day": "Hari",
- "label.default-date-range": "Rentang tanggal bawaan",
- "label.delete": "Hapus",
- "label.delete-report": "Hapus laporan",
- "label.delete-team": "Hapus tim",
- "label.delete-user": "Hapus pengguna",
- "label.delete-website": "Hapus situs web",
- "label.description": "Deskripsi",
- "label.desktop": "Desktop",
- "label.details": "Detail",
- "label.device": "Perangkat",
- "label.devices": "Perangkat",
- "label.dismiss": "Tutup",
- "label.does-not-contain": "Tidak mengandung",
- "label.domain": "Domain",
- "label.dropoff": "Penurunan",
- "label.edit": "Sunting",
- "label.edit-dashboard": "Sunting dasbor",
- "label.edit-member": "Sunting anggota",
- "label.enable-share-url": "Aktifkan URL berbagi",
- "label.end-step": "Langkah akhir",
- "label.entry": "URL masuk",
- "label.event": "Peristiwa",
- "label.event-data": "Data peristiwa",
- "label.events": "Peristiwa",
- "label.exit": "Exit URL",
- "label.false": "Salah",
- "label.field": "Kolom",
- "label.fields": "Kolom",
- "label.filter": "Filter",
- "label.filter-combined": "Gabungan",
- "label.filter-raw": "Mentah",
- "label.filters": "Filters",
- "label.first-seen": "Pertama kali dilihat",
- "label.funnel": "Funnel",
- "label.funnel-description": "Pahami tingkat konversi dan penurunan pengguna.",
- "label.goal": "Tujuan",
- "label.goals": "Tujuan",
- "label.goals-description": "Lacak tujuan Anda untuk tampilan halaman dan peristiwa.",
- "label.greater-than": "Lebih dari",
- "label.greater-than-equals": "Lebih dari atau sama dengan",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Wawasan",
- "label.insights-description": "Jelajahi data Anda lebih dalam dengan menggunakan segmen dan filter.",
- "label.is": "Adalah",
- "label.is-not": "Bukan",
- "label.is-not-set": "Tidak diatur",
- "label.is-set": "Diatur",
- "label.join": "Gabung",
- "label.join-team": "Gabung tim",
- "label.journey": "Perjalanan",
- "label.journey-description": "Pahami bagaimana pengguna menavigasi situs web Anda.",
- "label.language": "Bahasa",
- "label.languages": "Bahasa",
- "label.laptop": "Laptop",
- "label.last-days": "{x} hari terakhir",
- "label.last-hours": "{x} jam terakhir",
- "label.last-months": "{x} bulan terakhir",
- "label.last-seen": "Terakhir kali dilihat",
- "label.leave": "Keluar",
- "label.leave-team": "Keluar dari tim",
- "label.less-than": "Kurang dari",
- "label.less-than-equals": "Kurang dari atau sama dengan",
- "label.login": "Masuk",
- "label.logout": "Keluar",
- "label.manage": "Kelola",
- "label.manager": "Pengelola",
- "label.max": "Maks",
- "label.member": "Anggota",
- "label.members": "Anggota",
- "label.min": "Min",
- "label.mobile": "Ponsel",
- "label.more": "Lebih banyak",
- "label.my-account": "Akun saya",
- "label.my-websites": "Situs web saya",
- "label.name": "Nama",
- "label.new-password": "Kata sandi baru",
- "label.none": "Tidak ada",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Tinjauan umum",
- "label.owner": "Pemilik",
- "label.page-of": "Halaman {current} dari {total}",
- "label.page-views": "Tampilan halaman",
- "label.pageTitle": "Judul halaman",
- "label.pages": "Halaman",
- "label.password": "Kata sandi",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Didukung oleh {name}",
- "label.previous": "Sebelumnya",
- "label.previous-period": "Periode sebelumnya",
- "label.previous-year": "Tahun lalu",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Waktu nyata",
- "label.referrer": "Perujuk",
- "label.referrers": "Perujuk",
- "label.refresh": "Segarkan",
- "label.regenerate": "Buat ulang",
- "label.region": "Wilayah",
- "label.regions": "Wilayah",
- "label.remove": "Hapus",
- "label.remove-member": "Hapus anggota",
- "label.reports": "Laporan",
- "label.required": "Wajib",
- "label.reset": "Atur ulang",
- "label.reset-website": "Atur ulang statistik",
- "label.retention": "Retensi",
- "label.retention-description": "Ukur daya tarik situs web Anda dengan melacak seberapa sering pengguna kembali.",
- "label.revenue": "Pendapatan",
- "label.revenue-description": "Lihat pendapatan Anda seiring waktu.",
- "label.revenue-property": "Properti pendapatan",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Simpan",
- "label.screens": "Layar",
- "label.search": "Cari",
- "label.select": "Pilih",
- "label.select-date": "Pilih tanggal",
- "label.select-role": "Pilih role",
- "label.select-website": "Pilih situs web",
- "label.session": "Sesi",
- "label.sessions": "Sesi",
- "label.settings": "Pengaturan",
- "label.share-url": "Bagikan URL",
- "label.single-day": "Sehari",
- "label.start-step": "Langkah awal",
- "label.steps": "Langkah",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Tim",
- "label.team-id": "ID tim",
- "label.team-manager": "Pengelola tim",
- "label.team-member": "Anggota tim",
- "label.team-name": "Nama tim",
- "label.team-owner": "Pemilik tim",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Situs web tim",
- "label.teams": "Tim",
- "label.theme": "Tema",
- "label.this-month": "Bulan ini",
- "label.this-week": "Minggu ini",
- "label.this-year": "Tahun ini",
- "label.timezone": "Zona waktu",
- "label.title": "Judul",
- "label.today": "Hari ini",
- "label.toggle-charts": "Buka grafik",
- "label.total": "Total",
- "label.total-records": "Total baris",
- "label.tracking-code": "Kode lacak",
- "label.transactions": "Transaksi",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer situs web",
- "label.true": "Benar",
- "label.type": "Tipe",
- "label.unique": "Unik",
- "label.unique-visitors": "Pengunjung unik",
- "label.uniqueCustomers": "Kustomer unik",
- "label.unknown": "Tidak diketahui",
- "label.untitled": "Tanpa judul",
- "label.update": "Perbarui",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Pengguna",
- "label.user-property": "User Property",
- "label.username": "Nama pengguna",
- "label.users": "Pengguna",
- "label.utm": "UTM",
- "label.utm-description": "Lacak kampanye Anda melalui parameter UTM.",
- "label.value": "Nilai",
- "label.view": "Lihat",
- "label.view-details": "Lihat Detil",
- "label.view-only": "Hanya melihat",
- "label.views": "Tampilan",
- "label.views-per-visit": "Tampilan per kunjungan",
- "label.visit-duration": "Waktu kunjungan rata-rata",
- "label.visitors": "Pengunjung",
- "label.visits": "Kunjungan",
- "label.website": "Situs web",
- "label.website-id": "ID situs web",
- "label.websites": "Situs web",
- "label.window": "Window",
- "label.yesterday": "Kemarin",
- "message.action-confirmation": "Ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
- "message.active-users": "{x} pengunjung saat ini",
- "message.collected-data": "Data dikumpulkan",
- "message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
- "message.confirm-leave": "Apakah Anda yakin ingin meninggalkan {target}?",
- "message.confirm-remove": "Apakah Anda yakin ingin menghapus {target}?",
- "message.confirm-reset": "Anda yakin ingin mengatur ulang statistik {target}?",
- "message.delete-team-warning": "Menghapus tim juga akan menghapus semua situs web yang terkait.",
- "message.delete-website-warning": "Semua data terkait juga akan dihapus.",
- "message.error": "Ada yang salah.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Pergi ke pengaturan",
- "message.incorrect-username-password": "Nama pengguna/kata sandi salah.",
- "message.invalid-domain": "Domain tidak valid",
- "message.min-password-length": "Minimal {n} karakter",
- "message.new-version-available": "Versi baru dari Umami {version} telah tersedia!",
- "message.no-data-available": "Tidak ada data.",
- "message.no-event-data": "Tidak ada data peristiwa",
- "message.no-match-password": "Kata sandi tidak cocok",
- "message.no-results-found": "Tidak ada hasil yang ditemukan.",
- "message.no-team-websites": "Tim ini tidak memiliki situs web.",
- "message.no-teams": "Anda belum membuat tim.",
- "message.no-users": "Tidak ada pengguna.",
- "message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
- "message.page-not-found": "Halaman tidak ditemukan.",
- "message.reset-website": "Untuk mengatur ulang situs web ini, ketik {confirmation} pada kotak di bawah untuk mengonfirmasi.",
- "message.reset-website-warning": "Semua statistik pada situs web ini akan dihapus, tetapi kode lacak akan tetap terpasang",
- "message.saved": "Berhasil disimpan.",
- "message.share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.",
- "message.team-already-member": "Anda sudah menjadi anggota tim ini.",
- "message.team-not-found": "Tim tidak ditemukan.",
- "message.team-websites-info": "Situs web dapat dilihat oleh semua anggota tim.",
- "message.tracking-code": "Kode lacak",
- "message.transfer-team-website-to-user": "Transfer situs web ini ke akun Anda?",
- "message.transfer-user-website-to-team": "Pilih tim tujuan untuk mentransfer situs web ini.",
- "message.transfer-website": "Transfer kepemilikan situs web ke akun Anda atau tim lain",
- "message.triggered-event": "Peristiwa terjadi",
- "message.user-deleted": "Pengguna telah dihapus.",
- "message.viewed-page": "Halaman dilihat",
- "message.visitor-log": "Pengunjung dari {country} dengan {browser} di {device} {os}",
- "message.visitors-dropped-off": "Pengunjung yang meninggalkan situs web"
-}
diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
deleted file mode 100644
index 4df7599a4..000000000
--- a/src/lang/it-IT.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Azioni",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Aggiungi sito",
- "label.admin": "Amministratore",
- "label.after": "After",
- "label.all": "Tutto",
- "label.all-time": "Sempre",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Indietro",
- "label.before": "Before",
- "label.bounce-rate": "Frequenza di rimbalzo",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browser",
- "label.cancel": "Annulla",
- "label.change-password": "Modifica password",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Conferma password",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Nazioni",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Password attuale",
- "label.custom-range": "Personalizzato",
- "label.dashboard": "Pannello di Controllo",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Periodo",
- "label.day": "Day",
- "label.default-date-range": "Periodo standard",
- "label.delete": "Elimina",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Elimina sito",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Dispositivi",
- "label.dismiss": "Scarta",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Dominio",
- "label.dropoff": "Dropoff",
- "label.edit": "Modifica",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Abilita URL di condivisione",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Eventi",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Aggregati",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Lingua",
- "label.languages": "Lingue",
- "label.laptop": "Portatile",
- "label.last-days": "Ultimi {x} giorni",
- "label.last-hours": "Ultime {x} ore",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Accedi",
- "label.logout": "Esci",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Cellulare",
- "label.more": "Dettagli",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Nome",
- "label.new-password": "Nuova password",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Proprietario",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Visualizzazioni di pagina",
- "label.pageTitle": "Page title",
- "label.pages": "Pagine",
- "label.password": "Password",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profilo",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Tempo reale",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "Ricarica",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Obbligatorio",
- "label.reset": "Reset",
- "label.reset-website": "Resetta le statistiche",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Salva",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Impostazioni",
- "label.share-url": "Condividi link",
- "label.single-day": "Singolo giorno",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Tema",
- "label.this-month": "Questo mese",
- "label.this-week": "Questa settimana",
- "label.this-year": "Quest'anno",
- "label.timezone": "Fuso orario",
- "label.title": "Title",
- "label.today": "Oggi",
- "label.toggle-charts": "Apri/Chiudi i grafici",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Codice di tracking",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Visitatori unici",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Sconosciuto",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Nome utente",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Vedi dettagli",
- "label.view-only": "View only",
- "label.views": "Visualizzazioni",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Tempo medio di visita",
- "label.visitors": "Visitatori",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Siti web",
- "label.window": "Window",
- "label.yesterday": "Ieri",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} {x, plural, one {visitatore} other {visitatori}} online",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Sei sicuro di voler eliminare {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Sei sicuro di voler azzerare le statistiche di {target}?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Saranno eliminati anche tutti i dati associati.",
- "message.error": "Si è verificato un errore.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Vai alle impostazioni",
- "message.incorrect-username-password": "Username o password non corretti.",
- "message.invalid-domain": "Dominio non valido",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Nessun dato disponibile.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Le password non corrispondono",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Non hai ancora configurato alcun sito.",
- "message.page-not-found": "Pagina non trovata",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "Tutte le statistiche verranno cancellate per questo sito, ma il tuo codice di tracciamento rimarrà invariato.",
- "message.saved": "Salvato!",
- "message.share-url": "Questo è l'URL di condivisione per {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Codice di tracking",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Utenti da {country} tramite {browser} su {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/ja-JP.json b/src/lang/ja-JP.json
deleted file mode 100644
index ce4001f43..000000000
--- a/src/lang/ja-JP.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "アクセスコード",
- "label.actions": "アクション",
- "label.activity": "アクティビティログ",
- "label.add": "追加",
- "label.add-description": "説明を追加",
- "label.add-member": "メンバーの追加",
- "label.add-step": "ステップを追加",
- "label.add-website": "Webサイトの追加",
- "label.admin": "管理者",
- "label.after": "直後",
- "label.all": "すべて",
- "label.all-time": "すべての時間帯",
- "label.analytics": "アナリティクス",
- "label.average": "平均",
- "label.back": "戻る",
- "label.before": "直前",
- "label.bounce-rate": "直帰率",
- "label.breakdown": "故障",
- "label.browser": "ブラウザ",
- "label.browsers": "ブラウザ",
- "label.cancel": "キャンセル",
- "label.change-password": "パスワードの変更",
- "label.cities": "都市",
- "label.city": "都市",
- "label.clear-all": "すべてクリア",
- "label.compare": "比較",
- "label.confirm": "確認",
- "label.confirm-password": "パスワード(確認)",
- "label.contains": "コンテンツ",
- "label.continue": "続ける",
- "label.count": "回数",
- "label.countries": "国名",
- "label.country": "国",
- "label.create": "作成",
- "label.create-report": "レポートの作成",
- "label.create-team": "チームの作成",
- "label.create-user": "ユーザーの作成",
- "label.created": "作成されました",
- "label.created-by": "作成者",
- "label.current": "現在",
- "label.current-password": "現在のパスワード",
- "label.custom-range": "範囲指定",
- "label.dashboard": "ダッシュボード",
- "label.data": "データ",
- "label.date": "日付",
- "label.date-range": "期間",
- "label.day": "日",
- "label.default-date-range": "デフォルトの期間",
- "label.delete": "削除",
- "label.delete-report": "レポートの削除",
- "label.delete-team": "チームの削除",
- "label.delete-user": "ユーザーの削除",
- "label.delete-website": "Webサイトの削除",
- "label.description": "説明",
- "label.desktop": "デスクトップ",
- "label.details": "詳細情報",
- "label.device": "デバイス",
- "label.devices": "デバイス",
- "label.dismiss": "却下",
- "label.does-not-contain": "を含まない",
- "label.domain": "ドメイン",
- "label.dropoff": "切り捨て",
- "label.edit": "編集",
- "label.edit-dashboard": "ダッシュボードの編集",
- "label.edit-member": "メンバーの編集",
- "label.enable-share-url": "共有URLを有効にする",
- "label.end-step": "最終ステップ",
- "label.entry": "訪問時のURL",
- "label.event": "イベント",
- "label.event-data": "イベントデータ",
- "label.events": "イベント",
- "label.exit": "退出時のURL",
- "label.false": "偽",
- "label.field": "フィールド",
- "label.fields": "フィールド",
- "label.filter": "フィルター",
- "label.filter-combined": "結合",
- "label.filter-raw": "RAW",
- "label.filters": "フィルター",
- "label.first-seen": "初回ログイン",
- "label.funnel": "ファネル",
- "label.funnel-description": "ユーザーのコンバージョン率と離脱率を分析します。",
- "label.goal": "目標",
- "label.goals": "目標",
- "label.goals-description": "ページビューとイベントの目標を追跡します。",
- "label.greater-than": "超過",
- "label.greater-than-equals": "以上",
- "label.host": "ホスト",
- "label.hosts": "ホスト",
- "label.insights": "インサイト",
- "label.insights-description": "セグメントとフィルタを使用して、データをさらに詳しく分析します。",
- "label.is": "に等しい",
- "label.is-not": "に等しくない",
- "label.is-not-set": "未設定",
- "label.is-set": "設定済み",
- "label.join": "参加",
- "label.join-team": "チームに参加",
- "label.journey": "ジャーニー",
- "label.journey-description": "ユーザーがWebサイト内をどのように移動するかを把握します。",
- "label.language": "言語",
- "label.languages": "言語",
- "label.laptop": "ノートPC",
- "label.last-days": "過去{x}日間",
- "label.last-hours": "過去{x}時間",
- "label.last-months": "過去{x}月間",
- "label.last-seen": "最終ログイン",
- "label.leave": "離脱",
- "label.leave-team": "チームを離脱",
- "label.less-than": "未満",
- "label.less-than-equals": "以下",
- "label.login": "ログイン",
- "label.logout": "ログアウト",
- "label.manage": "管理",
- "label.manager": "管理者",
- "label.max": "最大",
- "label.member": "メンバー",
- "label.members": "メンバー",
- "label.min": "最小",
- "label.mobile": "携帯電話",
- "label.more": "もっと見る",
- "label.my-account": "マイアカウント",
- "label.my-websites": "マイWebサイト",
- "label.name": "名前",
- "label.new-password": "新しいパスワード",
- "label.none": "なし",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "概要",
- "label.owner": "所有者",
- "label.page-of": "ページ {current}/{total}",
- "label.page-views": "閲覧数",
- "label.pageTitle": "ページタイトル",
- "label.pages": "ページ",
- "label.password": "パスワード",
- "label.path": "パス",
- "label.paths": "パス",
- "label.powered-by": "Powered by {name}",
- "label.previous": "以前",
- "label.previous-period": "前期",
- "label.previous-year": "前年",
- "label.profile": "プロフィール",
- "label.properties": "プロパティ",
- "label.property": "プロパティ",
- "label.queries": "クエリ",
- "label.query": "クエリ",
- "label.query-parameters": "クエリパラメーター",
- "label.realtime": "リアルタイム",
- "label.referrer": "リファラー",
- "label.referrers": "リファラー",
- "label.refresh": "更新",
- "label.regenerate": "再生成",
- "label.region": "地域",
- "label.regions": "地域",
- "label.remove": "削除",
- "label.remove-member": "メンバーの削除",
- "label.reports": "レポート",
- "label.required": "必須",
- "label.reset": "リセット",
- "label.reset-website": "Webサイトをリセットする",
- "label.retention": "リテンション",
- "label.retention-description": "ユーザーの再訪問回数を記録して、Webサイトのリテンション率を計測します。",
- "label.revenue": "レベニュー",
- "label.revenue-description": "時間あたりの売上高を確認します。",
- "label.revenue-property": "レベニュープロパティ",
- "label.role": "ロール",
- "label.run-query": "クエリ実行",
- "label.save": "保存",
- "label.screens": "画面サイズ",
- "label.search": "検索",
- "label.select": "選択",
- "label.select-date": "日付を選択",
- "label.select-role": "ロールを選択",
- "label.select-website": "Webサイトを選択",
- "label.session": "セッション",
- "label.sessions": "セッション",
- "label.settings": "設定",
- "label.share-url": "共有URL",
- "label.single-day": "一日",
- "label.start-step": "最初のステップ",
- "label.steps": "ステップ",
- "label.sum": "合計",
- "label.tablet": "タブレット",
- "label.team": "チーム",
- "label.team-id": "チームID",
- "label.team-manager": "チーム管理者",
- "label.team-member": "チームメンバー",
- "label.team-name": "チーム名",
- "label.team-owner": "チームオーナー",
- "label.team-view-only": "チーム表示のみ",
- "label.team-websites": "チームのWebサイト",
- "label.teams": "チーム",
- "label.theme": "テーマ",
- "label.this-month": "今月",
- "label.this-week": "今週",
- "label.this-year": "今年",
- "label.timezone": "タイムゾーン",
- "label.title": "タイトル",
- "label.today": "今日",
- "label.toggle-charts": "グラフを切り替える",
- "label.total": "累計",
- "label.total-records": "総記録数",
- "label.tracking-code": "トラッキングコード",
- "label.transactions": "トランザクション",
- "label.transfer": "移管",
- "label.transfer-website": "Webサイトの移管",
- "label.true": "真",
- "label.type": "種別",
- "label.unique": "ユニーク",
- "label.unique-visitors": "ユニーク訪問者数",
- "label.uniqueCustomers": "ユニーク顧客数",
- "label.unknown": "不明",
- "label.untitled": "無題",
- "label.update": "更新",
- "label.url": "URL",
- "label.urls": "URL",
- "label.user": "ユーザー",
- "label.user-property": "ユーザープロパティ",
- "label.username": "ユーザー名",
- "label.users": "ユーザー",
- "label.utm": "UTM",
- "label.utm-description": "UTMパラメーターを使用してキャンペーンを追跡します。",
- "label.value": "値",
- "label.view": "表示",
- "label.view-details": "詳細を表示",
- "label.view-only": "表示のみ",
- "label.views": "表示",
- "label.views-per-visit": "訪問あたりの閲覧数",
- "label.visit-duration": "平均滞在時間",
- "label.visitors": "訪問者",
- "label.visits": "訪問数",
- "label.website": "Webサイト",
- "label.website-id": "WebサイトID",
- "label.websites": "Webサイト",
- "label.window": "ウィンドウ",
- "label.yesterday": "昨日",
- "message.action-confirmation": "承認する場合は、下のフォームに「{confirmation}」と入力してください。",
- "message.active-users": "{x} {x, plural, one {アクティブな訪問者} other {アクティブな訪問者}}",
- "message.collected-data": "収集されたデータ",
- "message.confirm-delete": "{target}を削除してもよろしいですか?",
- "message.confirm-leave": "{target}から離脱してもよろしいですか?",
- "message.confirm-remove": "{target}を削除してもよろしいですか?",
- "message.confirm-reset": "{target}をリセットしてもよろしいですか?",
- "message.delete-team-warning": "チームを削除すると、そのチームが管理しているWebサイトもすべて削除されます。",
- "message.delete-website-warning": "Webサイトのデータがすべて削除されます。",
- "message.error": "未知のエラーが発生しました。",
- "message.event-log": "{url}の{event}",
- "message.go-to-settings": "設定に移動する",
- "message.incorrect-username-password": "ユーザー名またはパスワードが間違っています。",
- "message.invalid-domain": "無効なドメインです。http/httpsを含めないでください。",
- "message.min-password-length": "最小文字数は{n}文字です",
- "message.new-version-available": "Umamiの新しいバージョン{version}が利用可能です!",
- "message.no-data-available": "データがありません。",
- "message.no-event-data": "イベントデータがありません。",
- "message.no-match-password": "パスワードが一致しません。",
- "message.no-results-found": "結果が見つかりません。",
- "message.no-team-websites": "このチームにはWebサイトがありません。",
- "message.no-teams": "チームを作成していません。",
- "message.no-users": "ユーザーが存在しません。",
- "message.no-websites-configured": "Webサイトが設定されていません。",
- "message.page-not-found": "ページが見つかりません",
- "message.reset-website": "このWebサイトをリセットするには、下のフォームに「{confirmation}」と入力してください。",
- "message.reset-website-warning": "このWebサイトの統計情報はすべて削除されますが、設定はそのまま残ります。",
- "message.saved": "保存されました。",
- "message.share-url": "あなたのWebサイトの統計情報は次のURLで公開されています:",
- "message.team-already-member": "あなたはすでにチームのメンバーです。",
- "message.team-not-found": "チームが見つかりません。",
- "message.team-websites-info": "Webサイトはチーム内の誰でも見ることができます。",
- "message.tracking-code": "このWebサイトの統計情報を追跡するには、HTMLの...セクションに以下のコードを記述します。",
- "message.transfer-team-website-to-user": "このWebサイトをあなたのアカウントに移管しますか?",
- "message.transfer-user-website-to-team": "このWebサイトを移管するチームを選択してください。",
- "message.transfer-website": "Webサイトの所有権を自分のアカウントまたは別のチームへ移管します。",
- "message.triggered-event": "トリガーされたイベント",
- "message.user-deleted": "ユーザーが削除されました。",
- "message.viewed-page": "閲覧されたページ",
- "message.visitor-log": "{os}({device})で{browser}を使用している{country}からの訪問者",
- "message.visitors-dropped-off": "訪問者の離脱率"
-}
diff --git a/src/lang/km-KH.json b/src/lang/km-KH.json
deleted file mode 100644
index 8a87834ac..000000000
--- a/src/lang/km-KH.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "សកម្មភាព",
- "label.activity": "កំណត់ហេតុសកម្មភាព",
- "label.add": "បង្កើតបន្ថែម",
- "label.add-description": "បន្ថែមពិពណ៌នា",
- "label.add-member": "បន្ថែមសមាជិក",
- "label.add-step": "បន្ថែមជំហាន",
- "label.add-website": "បន្ថែមគេហទំព័រ",
- "label.admin": "អ្នកគ្រប់គ្រង",
- "label.after": "បន្ទាប់",
- "label.all": "ទាំងអស់",
- "label.all-time": "គ្រប់ពេល",
- "label.analytics": "Analytics",
- "label.average": "ជាមធ្យម",
- "label.back": "ថយក្រោយ",
- "label.before": "មុន",
- "label.bounce-rate": "ចំនួនវិលត្រឡប់",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "កម្មវិធី",
- "label.cancel": "បោះបង់",
- "label.change-password": "ផ្លាស់ប្តូរពាក្យសម្ងាត់",
- "label.cities": "ទីក្រុង",
- "label.city": "ទីក្រុង",
- "label.clear-all": "លុបទាំងអស់",
- "label.compare": "ប្រៀបធៀប",
- "label.confirm": "បញ្ជាក់",
- "label.confirm-password": "បញ្ជាក់ពាក្យសម្ងាត់",
- "label.contains": "មាន",
- "label.continue": "បន្ត",
- "label.count": "ចំនួន",
- "label.countries": "ប្រទេស",
- "label.country": "ប្រទេស",
- "label.create": "បង្កើត",
- "label.create-report": "បង្កើតរបាយការណ៍",
- "label.create-team": "បង្កើតក្រុម",
- "label.create-user": "បង្កើតអ្នកប្រើប្រាស់",
- "label.created": "បង្កើតនៅ",
- "label.created-by": "បង្កើតដោយ",
- "label.current": "បច្ចុប្បន្ន",
- "label.current-password": "ពាក្យសម្ងាត់បច្ចុប្បន្ន",
- "label.custom-range": "កំណត់ដោយខ្លួនឯង",
- "label.dashboard": "ផ្ទាំងគ្រប់គ្រង",
- "label.data": "ទិន្នន័យ",
- "label.date": "កាលបរិច្ឆេទ",
- "label.date-range": "ចន្លោះកាលបរិច្ឆេទ",
- "label.day": "ថ្ងៃ",
- "label.default-date-range": "ចន្លោះកាលបរិច្ឆេទដើម",
- "label.delete": "លុប",
- "label.delete-report": "លុបរបាយការណ៍",
- "label.delete-team": "លុបក្រុម",
- "label.delete-user": "លុបអ្នកប្រើប្រាស់",
- "label.delete-website": "លុបគេហទំព័រ",
- "label.description": "ការពិពណ៌នា",
- "label.desktop": "កុំព្យូទ័រលើតុ",
- "label.details": "ព័ត៌មានលម្អិត",
- "label.device": "ឧបករណ៍",
- "label.devices": "ឧបករណ៍",
- "label.dismiss": "រំសាយ",
- "label.does-not-contain": "មិនមាន",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "កែប្រែ",
- "label.edit-dashboard": "កែផ្ទាំងគ្រប់គ្រង",
- "label.edit-member": "កែព័ត៌មានសមាជិក",
- "label.enable-share-url": "បើកការចែករំលែក URL",
- "label.end-step": "បញ្ចប់ជំហាន",
- "label.entry": "URL ចូល",
- "label.event": "ព្រឹត្តិការណ៍",
- "label.event-data": "ទិន្នន័យព្រឹត្តិការណ៍",
- "label.events": "ព្រឹត្តិការណ៍",
- "label.exit": "URL ចេញ",
- "label.false": "មិនពិត",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "ចម្រោះ",
- "label.filter-combined": "រួមបញ្ចូលគ្នា",
- "label.filter-raw": "ដើម",
- "label.filters": "ចម្រោះ",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "គោលដៅ",
- "label.goals": "គោលដៅ",
- "label.goals-description": "តាមដានគោលដៅរបស់អ្នកសម្រាប់ pageviews និង events។",
- "label.greater-than": "ធំជាង",
- "label.greater-than-equals": "ធំជាងឬស្មើ",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "គឺ",
- "label.is-not": "មិនមែន",
- "label.is-not-set": "មិនបានកំណត់",
- "label.is-set": "បានកំណត់",
- "label.join": "ចូលរួម",
- "label.join-team": "ចូលក្រុម",
- "label.journey": "ដំណើរ",
- "label.journey-description": "ស្វែងយល់ពីការប្រើប្រាស់គេហទំព័ររបស់អតិថិជនអ្នក។",
- "label.language": "ភាសា",
- "label.languages": "ភាសា",
- "label.laptop": "កុំព្យូទ័រយួរដៃ",
- "label.last-days": "{x} ថ្ងៃចុងក្រោយ",
- "label.last-hours": "{x} ម៉ោងចុងក្រោយ",
- "label.last-months": "{x} ខែចុងក្រោយ",
- "label.last-seen": "Last seen",
- "label.leave": "ចាកចេញ",
- "label.leave-team": "ចេញពីក្រុម",
- "label.less-than": "តិចជាង",
- "label.less-than-equals": "តិចជាង ឬស្មើ",
- "label.login": "Login",
- "label.logout": "Logout",
- "label.manage": "គ្រប់គ្រង",
- "label.manager": "អ្នកគ្រប់គ្រង",
- "label.max": "Max",
- "label.member": "សមាជិក",
- "label.members": "សមាជិក",
- "label.min": "Min",
- "label.mobile": "ទូរស័ព្ទចល័ត",
- "label.more": "បន្ថែម",
- "label.my-account": "គណនីរបស់ខ្ញុំ",
- "label.my-websites": "គេហទំព័ររបស់ខ្ញុំ",
- "label.name": "ឈ្មោះ",
- "label.new-password": "ពាក្យសម្ងាត់ថ្មី",
- "label.none": "មិនមាន",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "ទិដ្ឋភាពរួម",
- "label.owner": "ម្ចាស់",
- "label.page-of": "ទំព័រទី {current} នៃ {total}",
- "label.page-views": "អ្នកមើលទំព័រ",
- "label.pageTitle": "ចំណងជើងទំព័រ",
- "label.pages": "ទំព័រ",
- "label.password": "ពាក្យសម្ងាត់",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "ដំណើរការដោយ {name}",
- "label.previous": "មុន",
- "label.previous-period": "មួយរយៈពេលមុន",
- "label.previous-year": "ឆ្នាំមុន",
- "label.profile": "គណនី",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "ប៉ារ៉ាម៉ែត្រ Query",
- "label.realtime": "ឥលូវនេះ",
- "label.referrer": "អ្នកណែនាំ",
- "label.referrers": "អ្នកណែនាំ",
- "label.refresh": "ផ្ទុកឡើងវិញ",
- "label.regenerate": "Regenerate",
- "label.region": "តំបន់",
- "label.regions": "តំបន់",
- "label.remove": "លុប",
- "label.remove-member": "លុបសមាជិកក្រុម",
- "label.reports": "របាយការណ៍",
- "label.required": "ទាមទារ",
- "label.reset": "កែសម្រួល",
- "label.reset-website": "កំណត់ស្ថិតិឡើងវិញ",
- "label.retention": "ការរក្សាទុក",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "មុខងារ",
- "label.run-query": "Run query",
- "label.save": "រក្សាទុក",
- "label.screens": "ប្រភេទឧបករណ៍",
- "label.search": "ស្វែងរក",
- "label.select": "ជ្រើសរើស",
- "label.select-date": "ជ្រើសរើសកាលបរិច្ឆេទ",
- "label.select-role": "ជ្រើសរើសមុខងារ",
- "label.select-website": "ជ្រើសរើសគេហទំព័រ",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "ការកំណត់",
- "label.share-url": "ចែករំលែក URL",
- "label.single-day": "ថ្ងៃតែមួយ",
- "label.start-step": "ជំហានចាប់ផ្តើម",
- "label.steps": "ជំហាន",
- "label.sum": "Sum",
- "label.tablet": "ថេប្លេត",
- "label.team": "ក្រុម",
- "label.team-id": "ID ក្រុម",
- "label.team-manager": "អ្នកគ្រប់គ្រងក្រុម",
- "label.team-member": "សមាជិកក្រុម",
- "label.team-name": "ឈ្មោះក្រុម",
- "label.team-owner": "ម្ចាស់ក្រុម",
- "label.team-view-only": "Team view only",
- "label.team-websites": "គេហទំព័ររបស់ក្រុម",
- "label.teams": "ក្រុម",
- "label.theme": "រូបរាង",
- "label.this-month": "ខែនេះ",
- "label.this-week": "សប្តាហ៍នេះ",
- "label.this-year": "ឆ្នាំនេះ",
- "label.timezone": "តំបន់ម៉ោង",
- "label.title": "ចំណងជើង",
- "label.today": "ថ្ងៃនេះ",
- "label.toggle-charts": "បិទ/បើកតារាង",
- "label.total": "សរុប",
- "label.total-records": "កំណត់ត្រាសរុប",
- "label.tracking-code": "លេខកូដតាមដាន",
- "label.transactions": "Transactions",
- "label.transfer": "ការផ្ទេរ",
- "label.transfer-website": "ការផ្ទេរគេហទំព័រ",
- "label.true": "ពិត",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "អ្នកចូលមើលម្នាក់ៗ",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "មិនស្គាល់",
- "label.untitled": "គ្មានចំណងជើង",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "អ្នកប្រើប្រាស់",
- "label.user-property": "User Property",
- "label.username": "ឈ្មោះអ្នកប្រើប្រាស់",
- "label.users": "អ្នកប្រើប្រាស់",
- "label.utm": "UTM",
- "label.utm-description": "តាមដានយុទ្ធនាការរបស់អ្នកតាមរយៈប៉ារ៉ាម៉ែត្រ UTM។",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "មើលព័ត៌មានលម្អិត",
- "label.view-only": "បានតែមើលប៉ុណ្ណោះ",
- "label.views": "អ្នកចូលមើល",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "រយៈពេលទស្សនា",
- "label.visitors": "អ្នកទស្សនា",
- "label.visits": "ទស្សនា",
- "label.website": "គេហទំព័រ",
- "label.website-id": "ID គេហទំព័រ",
- "label.websites": "គេហទំព័រ",
- "label.window": "Window",
- "label.yesterday": "ម្សិលមិញ",
- "message.action-confirmation": "សសេរ {confirmation} នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។",
- "message.active-users": "មានអ្នកមើល {x} នាក់ ឥលូវនេះ",
- "message.collected-data": "ទិន្នន័យដែលបានប្រមូលទុក",
- "message.confirm-delete": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?",
- "message.confirm-leave": "តើអ្នកប្រាកដថាចង់ចាកចេញ {target} ទេ?",
- "message.confirm-remove": "តើអ្នកប្រាកដថាចង់លុប {target} ទេ?",
- "message.confirm-reset": "តើអ្នកប្រាកដថាចង់កំណត់ស្ថិតិរបស់ {target} ឡើងវិញទេ?",
- "message.delete-team-warning": "ពេលលុបក្រុម គេហទំព័ររបស់ក្រុមក៏នឹងត្រូវលប់ចោលទាំងអស់ផងដែរ។",
- "message.delete-website-warning": "ទិន្នន័យរបស់គេហទំព័រទាំងអស់នឹងត្រូវលុបចោល។",
- "message.error": "មានអ្វីមួយមិនប្រក្រតី។",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "ការកំណត់",
- "message.incorrect-username-password": "ឈ្មោះអ្នកប្រើឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។",
- "message.invalid-domain": "Domain មិនត្រឹមត្រូវ",
- "message.min-password-length": "តិចបំផុតដែលមានអក្សរ {n} តួអក្សរ",
- "message.new-version-available": "Version ថ្មីនៃ Umami {version} អាចប្រើប្រាស់បានហើយ!",
- "message.no-data-available": "មិនមានទិន្នន័យ។",
- "message.no-event-data": "មិនមានទិន្នន័យព្រឹត្តិការណ៍ទេ។",
- "message.no-match-password": "ពាក្យសម្ងាត់មិនត្រូវគ្នាទេ។",
- "message.no-results-found": "មិនមានលទ្ធផល។",
- "message.no-team-websites": "ក្រុមនេះមិនមានគេហទំព័រទេ។",
- "message.no-teams": "អ្នកមិនទាន់បានបង្កើតក្រុមណាមួយទេ។",
- "message.no-users": "មិនមានអ្នកប្រើប្រាស់ទេ។",
- "message.no-websites-configured": "អ្នកមិនទាន់បានដាក់គេហទំព័រណាមួយចូលទេ។",
- "message.page-not-found": "រកមិនឃើញទំព័រ។",
- "message.reset-website": "ដើម្បីកែគេហទំព័រនេះឡើងវិញ សូមសរសេរ {confirmation} នៅក្នុងប្រអប់ខាងក្រោមដើម្បីបញ្ជាក់។",
- "message.reset-website-warning": "ស្ថិតិទាំងអស់សម្រាប់គេហទំព័រនេះនឹងត្រូវបានលុប ប៉ុន្តែកូដតាមដានរបស់អ្នកនឹងនៅដដែល។",
- "message.saved": "រក្សាទុកដោយជោគជ័យ។",
- "message.share-url": "នេះគឺជា URL ដែលអាចចែករំលែកជាសាធារណៈបានសម្រាប់ {target}។",
- "message.team-already-member": "អ្នកគឺជាសមាជិកនៃក្រុមរួចហើយ។",
- "message.team-not-found": "រកក្រុមមិនឃើញទេ។",
- "message.team-websites-info": "គេហទំព័រនេះអាចមើលបានតែសមាជិកក្រុមតែប៉ុណ្ណោះ",
- "message.tracking-code": "ដើម្បីតាមដានស្ថិតិសម្រាប់គេហទំព័រអ្នក សូមដាក់កូដខាងក្រោមទៅក្នុងផ្នែក ... នៃ HTML របស់អ្នក។",
- "message.transfer-team-website-to-user": "ផ្ទេរគេហទំព័រនេះទៅគណនីរបស់អ្នក។?",
- "message.transfer-user-website-to-team": "ជ្រើសក្រុមដែរត្រូវផ្ទេរគេហទំព័រនេះទៅ។",
- "message.transfer-website": "ផ្ទេរកម្មសិទ្ធិគេហទំព័រទៅគណនីរបស់អ្នក ឬក្រុមផ្សេងទៀត។",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "អ្នកប្រើប្រាស់ត្រូវបានលុបចោល។",
- "message.viewed-page": "ទំព័រដែលបានមើល",
- "message.visitor-log": "អ្នកមើលពីប្រទេស {country} ប្រើប្រាស់កម្មវិធី {browser} លើឧបករណ៍ {os} {device}",
- "message.visitors-dropped-off": "ចំនួនអ្នកទស្សនាធ្លាក់ចុះ"
-}
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
deleted file mode 100644
index 933e2883b..000000000
--- a/src/lang/ko-KR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "액세스 코드",
- "label.actions": "동작",
- "label.activity": "활동",
- "label.add": "추가",
- "label.add-description": "설명 추가",
- "label.add-member": "멤버 추가",
- "label.add-step": "단계 추가",
- "label.add-website": "웹사이트 추가",
- "label.admin": "관리자",
- "label.after": "이후",
- "label.all": "전체",
- "label.all-time": "전체 시간",
- "label.analytics": "분석",
- "label.average": "평균",
- "label.back": "뒤로",
- "label.before": "이전",
- "label.bounce-rate": "이탈률",
- "label.breakdown": "세부 사항",
- "label.browser": "브라우저",
- "label.browsers": "브라우저",
- "label.cancel": "취소",
- "label.change-password": "비밀번호 변경",
- "label.cities": "도시",
- "label.city": "도시",
- "label.clear-all": "모두 지우기",
- "label.compare": "비교",
- "label.confirm": "확인",
- "label.confirm-password": "비밀번호 확인",
- "label.contains": "포함",
- "label.continue": "계속",
- "label.count": "수",
- "label.countries": "국가",
- "label.country": "국가",
- "label.create": "만들기",
- "label.create-report": "보고서 만들기",
- "label.create-team": "팀 만들기",
- "label.create-user": "사용자 만들기",
- "label.created": "생성됨",
- "label.created-by": "작성자",
- "label.current": "현재",
- "label.current-password": "현재 비밀번호",
- "label.custom-range": "범위 지정",
- "label.dashboard": "대시보드",
- "label.data": "데이터",
- "label.date": "날짜",
- "label.date-range": "날짜 범위",
- "label.day": "일",
- "label.default-date-range": "기본 날짜 범위",
- "label.delete": "삭제",
- "label.delete-report": "보고서 삭제",
- "label.delete-team": "팀 삭제",
- "label.delete-user": "사용자 삭제",
- "label.delete-website": "웹사이트 삭제",
- "label.description": "설명",
- "label.desktop": "데스크톱",
- "label.details": "세부 정보",
- "label.device": "기기",
- "label.devices": "기기",
- "label.dismiss": "무시하기",
- "label.does-not-contain": "포함하지 않음",
- "label.domain": "도메인",
- "label.dropoff": "이탈",
- "label.edit": "편집",
- "label.edit-dashboard": "대시보드 편집",
- "label.edit-member": "멤버 편집",
- "label.enable-share-url": "URL 공유 활성화",
- "label.end-step": "마지막 단계",
- "label.entry": "입장 URL",
- "label.event": "이벤트",
- "label.event-data": "이벤트 데이터",
- "label.events": "이벤트",
- "label.exit": "퇴장 URL",
- "label.false": "거짓",
- "label.field": "필드",
- "label.fields": "필드",
- "label.filter": "필터",
- "label.filter-combined": "합쳐 보기",
- "label.filter-raw": "전체 보기",
- "label.filters": "필터",
- "label.first-seen": "첫 접속",
- "label.funnel": "퍼널",
- "label.funnel-description": "사용자 전환율 및 이탈률을 살펴보세요.",
- "label.goal": "목표",
- "label.goals": "목표",
- "label.goals-description": "페이지 조회 및 이벤트 목표를 추적합니다.",
- "label.greater-than": "이상",
- "label.greater-than-equals": "이상",
- "label.host": "호스트",
- "label.hosts": "호스트",
- "label.insights": "인사이트",
- "label.insights-description": "세그먼트 및 필터를 사용하여 데이터를 더 자세히 살펴보세요.",
- "label.is": "해당",
- "label.is-not": "해당하지 않음",
- "label.is-not-set": "설정되지 않음",
- "label.is-set": "설정됨",
- "label.join": "가입하기",
- "label.join-team": "팀 가입하기",
- "label.journey": "여정",
- "label.journey-description": "사용자가 웹사이트를 탐색하는 경로를 살펴보세요.",
- "label.language": "언어",
- "label.languages": "언어",
- "label.laptop": "노트북",
- "label.last-days": "지난 {x}일",
- "label.last-hours": "지난 {x}시간",
- "label.last-months": "지난 {x}개월",
- "label.last-seen": "마지막 접속",
- "label.leave": "떠나기",
- "label.leave-team": "팀 떠나기",
- "label.less-than": "미만",
- "label.less-than-equals": "이하",
- "label.login": "로그인",
- "label.logout": "로그아웃",
- "label.manage": "관리",
- "label.manager": "관리자",
- "label.max": "최대",
- "label.member": "멤버",
- "label.members": "멤버",
- "label.min": "최소",
- "label.mobile": "모바일",
- "label.more": "더 보기",
- "label.my-account": "내 계정",
- "label.my-websites": "내 웹사이트",
- "label.name": "이름",
- "label.new-password": "새 비밀번호",
- "label.none": "없음",
- "label.number-of-records": "{x}개 레코드",
- "label.ok": "확인",
- "label.os": "운영 체제",
- "label.overview": "개요",
- "label.owner": "소유자",
- "label.page-of": "페이지 {current}/{total}",
- "label.page-views": "페이지 조회",
- "label.pageTitle": "페이지 제목",
- "label.pages": "페이지",
- "label.password": "비밀번호",
- "label.path": "패스",
- "label.paths": "패스",
- "label.powered-by": "Powered by {name}",
- "label.previous": "이전",
- "label.previous-period": "이전 기간",
- "label.previous-year": "이전 연도",
- "label.profile": "프로필",
- "label.properties": "속성",
- "label.property": "속성",
- "label.queries": "쿼리",
- "label.query": "쿼리",
- "label.query-parameters": "쿼리 매개 변수",
- "label.realtime": "실시간",
- "label.referrer": "리퍼러",
- "label.referrers": "리퍼러",
- "label.refresh": "새로 고침",
- "label.regenerate": "다시 생성",
- "label.region": "지역",
- "label.regions": "지역",
- "label.remove": "제거",
- "label.remove-member": "멤버 제거",
- "label.reports": "보고서",
- "label.required": "필수",
- "label.reset": "초기화",
- "label.reset-website": "웹사이트 초기화",
- "label.retention": "리텐션",
- "label.retention-description": "사용자가 얼마나 자주 돌아오는지를 추적하여 웹사이트의 리텐션을 측정하세요.",
- "label.revenue": "수익",
- "label.revenue-description": "시간대별 수익을 살펴보세요.",
- "label.revenue-property": "수익 속성",
- "label.role": "역할",
- "label.run-query": "쿼리 실행",
- "label.save": "저장",
- "label.screens": "화면",
- "label.search": "검색",
- "label.select": "선택",
- "label.select-date": "날짜 선택",
- "label.select-role": "역할 선택",
- "label.select-website": "웹사이트 선택",
- "label.session": "세션",
- "label.sessions": "세션",
- "label.settings": "설정",
- "label.share-url": "공유 URL",
- "label.single-day": "하루",
- "label.start-step": "시작 단계",
- "label.steps": "단계",
- "label.sum": "합계",
- "label.tablet": "태블릿",
- "label.team": "팀",
- "label.team-id": "팀 ID",
- "label.team-manager": "팀 관리자",
- "label.team-member": "팀 멤버",
- "label.team-name": "팀 이름",
- "label.team-owner": "팀 소유자",
- "label.team-view-only": "팀 보기 전용",
- "label.team-websites": "팀 웹사이트",
- "label.teams": "팀",
- "label.theme": "테마",
- "label.this-month": "이번 달",
- "label.this-week": "이번 주",
- "label.this-year": "올해",
- "label.timezone": "표준 시간대",
- "label.title": "제목",
- "label.today": "오늘",
- "label.toggle-charts": "차트 전환",
- "label.total": "합계",
- "label.total-records": "전체 레코드",
- "label.tracking-code": "추적 코드",
- "label.transactions": "거래",
- "label.transfer": "전송",
- "label.transfer-website": "웹사이트 전송",
- "label.true": "참",
- "label.type": "유형",
- "label.unique": "고유",
- "label.unique-visitors": "고유 방문자",
- "label.uniqueCustomers": "고유 고객",
- "label.unknown": "알 수 없음",
- "label.untitled": "제목 없음",
- "label.update": "업데이트",
- "label.url": "URL",
- "label.urls": "URL",
- "label.user": "사용자",
- "label.user-property": "사용자 속성",
- "label.username": "사용자 이름",
- "label.users": "사용자",
- "label.utm": "UTM",
- "label.utm-description": "UTM 매개변수를 통해 캠페인을 추적하세요.",
- "label.value": "값",
- "label.view": "보기",
- "label.view-details": "자세히 보기",
- "label.view-only": "보기 전용",
- "label.views": "조회",
- "label.views-per-visit": "방문당 조회",
- "label.visit-duration": "방문 시간",
- "label.visitors": "방문자",
- "label.visits": "방문",
- "label.website": "웹사이트",
- "label.website-id": "웹사이트 ID",
- "label.websites": "웹사이트",
- "label.window": "창",
- "label.yesterday": "어제",
- "message.action-confirmation": "확인을 위해 아래 상자에 {confirmation}을(를) 입력하세요.",
- "message.active-users": "현재 방문자 {x}명",
- "message.collected-data": "수집된 데이터",
- "message.confirm-delete": "{target}을(를) 삭제하시겠습니까?",
- "message.confirm-leave": "{target}을(를) 떠나시겠습니까?",
- "message.confirm-remove": "{target}을(를) 제거하시겠습니까?",
- "message.confirm-reset": "{target}을(를) 초기화하시겠습니까?",
- "message.delete-team-warning": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다.",
- "message.delete-website-warning": "관련된 모든 데이터가 삭제됩니다.",
- "message.error": "문제가 발생했습니다.",
- "message.event-log": "{event} - {url}",
- "message.go-to-settings": "설정으로 이동",
- "message.incorrect-username-password": "사용자 이름 또는 비밀번호를 잘못 입력했습니다.",
- "message.invalid-domain": "잘못된 도메인입니다. http/https를 포함하지 마세요.",
- "message.min-password-length": "최소 {n}자여야 합니다",
- "message.new-version-available": "Umami의 새 버전 {version}을(를) 사용할 수 있습니다!",
- "message.no-data-available": "사용할 수 있는 데이터가 없습니다.",
- "message.no-event-data": "사용할 수 있는 이벤트 데이터가 없습니다.",
- "message.no-match-password": "비밀번호가 일치하지 않습니다.",
- "message.no-results-found": "결과를 찾을 수 없습니다.",
- "message.no-team-websites": "팀에 웹사이트가 없습니다.",
- "message.no-teams": "만든 팀이 없습니다.",
- "message.no-users": "사용자가 없습니다.",
- "message.no-websites-configured": "설정된 웹사이트가 없습니다.",
- "message.page-not-found": "페이지를 찾을 수 없음",
- "message.reset-website": "이 웹사이트를 초기화하려면 아래 상자에 {confirmation}을(를) 입력하세요.",
- "message.reset-website-warning": "이 웹사이트의 모든 통계가 삭제되지만 설정은 그대로 유지됩니다.",
- "message.saved": "저장했습니다.",
- "message.share-url": "아래 링크를 통해 웹사이트의 통계를 누구나 볼 수 있습니다.",
- "message.team-already-member": "이미 팀 멤버입니다.",
- "message.team-not-found": "팀을 찾을 수 없습니다.",
- "message.team-websites-info": "웹사이트는 팀 멤버 누구나 볼 수 있습니다.",
- "message.tracking-code": "이 웹사이트의 통계를 추적하려면 다음 코드를 HTML의 ... 부분에 추가하세요.",
- "message.transfer-team-website-to-user": "이 웹사이트를 당신의 계정으로 전송하시겠습니까?",
- "message.transfer-user-website-to-team": "이 웹사이트를 전송받을 팀을 선택하세요.",
- "message.transfer-website": "웹사이트 소유권을 계정이나 다른 팀으로 전송합니다.",
- "message.triggered-event": "트리거된 이벤트",
- "message.user-deleted": "사용자를 삭제했습니다.",
- "message.viewed-page": "조회한 페이지",
- "message.visitor-log": "{os} {device}에서 {browser}을(를) 사용하는 {country}의 방문자",
- "message.visitors-dropped-off": "방문자 이탈함"
-}
diff --git a/src/lang/lt-LT.json b/src/lang/lt-LT.json
deleted file mode 100644
index 2e7776a37..000000000
--- a/src/lang/lt-LT.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Prieigos kodas",
- "label.actions": "Veiksmai",
- "label.activity": "Veiklos žurnalas",
- "label.add": "Pridėti",
- "label.add-description": "Pridėti aprašymą",
- "label.add-member": "Pridėti narį",
- "label.add-step": "Add step",
- "label.add-website": "Pridėti svetainę",
- "label.admin": "Administrator",
- "label.after": "Po",
- "label.all": "Visi",
- "label.all-time": "Visas laikotarpis",
- "label.analytics": "Analytics",
- "label.average": "Vidurkis",
- "label.back": "Atgal",
- "label.before": "Prieš",
- "label.bounce-rate": "Atmetimo rodiklis",
- "label.breakdown": "Breakdown",
- "label.browser": "Naršyklė",
- "label.browsers": "Naršyklės",
- "label.cancel": "Atšaukti",
- "label.change-password": "Pakeisti slaptažodį",
- "label.cities": "Miestai",
- "label.city": "Miestas",
- "label.clear-all": "Išvalyti visus",
- "label.compare": "Compare",
- "label.confirm": "Patvirtinti",
- "label.confirm-password": "Patvirtinti slaptažodį",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Šalys",
- "label.country": "Šalis",
- "label.create": "Sukurti",
- "label.create-report": "Kurti ataskaitą",
- "label.create-team": "Sukurti komandą",
- "label.create-user": "Sukurti vartotoją",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Dabartinis slaptažodis",
- "label.custom-range": "Pasirinktinis intervalas",
- "label.dashboard": "Švieslentė",
- "label.data": "Duomenys",
- "label.date": "Data",
- "label.date-range": "Laikotarpis",
- "label.day": "Diena",
- "label.default-date-range": "Numatytasis laikotarpis",
- "label.delete": "Ištrinti",
- "label.delete-report": "Ištrinti ataskaitą",
- "label.delete-team": "Ištrinti komandą",
- "label.delete-user": "Ištrinti vartotoją",
- "label.delete-website": "Ištrinti svetainę",
- "label.description": "Aprašymas",
- "label.desktop": "Desktop",
- "label.details": "Detalės",
- "label.device": "Įrenginys",
- "label.devices": "Įrenginiai",
- "label.dismiss": "Gerai",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domenas",
- "label.dropoff": "Dropoff",
- "label.edit": "Redaguoti",
- "label.edit-dashboard": "Redaguoti švieslentę",
- "label.edit-member": "Redaguoti narį",
- "label.enable-share-url": "Įjungti bendrinimą su nuoroda",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Įvykis",
- "label.event-data": "Įvykių duomenys",
- "label.events": "Įvykiai",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Laukelis",
- "label.fields": "Laukeliai",
- "label.filter": "Filtruoti",
- "label.filter-combined": "Kombinuoti",
- "label.filter-raw": "Neapdoroti",
- "label.filters": "Filtrai",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Įžvalgos",
- "label.insights-description": "Pasinerkite giliau į savo duomenis naudodami segmentus ir filtrus.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Prisijungti",
- "label.join-team": "Prisijungti į komandą",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Kalba",
- "label.languages": "Kalbos",
- "label.laptop": "Laptop",
- "label.last-days": "{x, plural, =0 {Paskutinės # dienų} zero {Paskutinės # dienų} one {Paskutinė diena} other {Paskutinės # dienos}}",
- "label.last-hours": "{x, plural, =0 {Paskutinės # valandų} zero {Paskutinės # valandų} one {Paskutinė # valanda} other {Paskutinės # valandos}}",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Išeiti",
- "label.leave-team": "Išeiti iš komandos",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Prisijungti",
- "label.logout": "Atsijungti",
- "label.manage": "Tvarkyti",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Narys",
- "label.members": "Nariai",
- "label.min": "Min",
- "label.mobile": "Mobilusis",
- "label.more": "Daugiau",
- "label.my-account": "Mano paskyra",
- "label.my-websites": "Mano svetainės",
- "label.name": "Pavadinimas",
- "label.new-password": "Naujas slaptažodis",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "Operacinės sistemos",
- "label.overview": "Apžvalga",
- "label.owner": "Savininkas",
- "label.page-of": "Puslapis {current} iš {total}",
- "label.page-views": "Puslapių peržiūros",
- "label.pageTitle": "Puslapio pavadinimas",
- "label.pages": "Puslapiai",
- "label.password": "Slaptažodis",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profilis",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Užklausos",
- "label.query": "Užklausa",
- "label.query-parameters": "Užklausų parametrai",
- "label.realtime": "Realiuoju laiku",
- "label.referrer": "Persiuntėjas",
- "label.referrers": "Persiuntėjai",
- "label.refresh": "Atnaujinti",
- "label.regenerate": "Regenerate",
- "label.region": "Regionas",
- "label.regions": "Regionai",
- "label.remove": "Pašalinti",
- "label.remove-member": "Pašalinti narį",
- "label.reports": "Ataskaitos",
- "label.required": "Reikalinga",
- "label.reset": "Atstatyti",
- "label.reset-website": "Atstatyti statistikos duomenis",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rolė",
- "label.run-query": "Run query",
- "label.save": "Išsaugoti",
- "label.screens": "Ekranai",
- "label.search": "Ieškoti",
- "label.select": "Select",
- "label.select-date": "Pasirinkti laikotarpį",
- "label.select-role": "Pasirinkti rolę",
- "label.select-website": "Pasirinkti svetainę",
- "label.session": "Session",
- "label.sessions": "Sesijos",
- "label.settings": "Nustatymai",
- "label.share-url": "Pasidalinti nuoroda",
- "label.single-day": "Viena diena",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Suma",
- "label.tablet": "Planšetė",
- "label.team": "Komanda",
- "label.team-id": "Komandos ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Komandos narys",
- "label.team-name": "Komandos pavadinimas",
- "label.team-owner": "Komandos savininkas",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Komandos",
- "label.theme": "Spalvų tema",
- "label.this-month": "Šis mėnuo",
- "label.this-week": "Ši savaitė",
- "label.this-year": "Šie metai",
- "label.timezone": "Laiko zona",
- "label.title": "Pavadinimas",
- "label.today": "Šiandien",
- "label.toggle-charts": "Rodyti / slėpti grafikus",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Sekimo kodas",
- "label.transactions": "Transactions",
- "label.transfer": "Perleisti",
- "label.transfer-website": "Perleisti svetainę",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unikalūs lankytojai",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Nežinoma",
- "label.untitled": "Be pavadinimo",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Vartotojas",
- "label.user-property": "User Property",
- "label.username": "Vartotojo vardas",
- "label.users": "Vartotojai",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "Atidaryti",
- "label.view-details": "Peržiūrėti detaliau",
- "label.view-only": "Tik peržiūrėti",
- "label.views": "Peržiūros",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Vidutinė vizito trukmė",
- "label.visitors": "Lankytojai",
- "label.visits": "Visits",
- "label.website": "Svetainė",
- "label.website-id": "Svetainės ID",
- "label.websites": "Svetainės",
- "label.window": "Window",
- "label.yesterday": "Vakar",
- "message.action-confirmation": "Įrašykite {confirmation} žemiau, kad patvirtintumėte.",
- "message.active-users": "{x, plural, =0 {# aktyvių vartotojų} zero {# aktyvių vartotojų} one {# aktyvus vartotojas} other {# aktyvūs vartotojai}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Ar esate tikri, jog norite ištrinti svetainę {target}?",
- "message.confirm-leave": "Ar esate tikri, jog norite palikti {target}?",
- "message.confirm-remove": "Ar esate tikri, jog norite ištrinti {target}?",
- "message.confirm-reset": "Are esate tikri, jog norite atstatyti svetainės {target} statistikos duomenis?",
- "message.delete-team-warning": "Ištrinant komandą bus ištrintos ir visos komandos svetainės.",
- "message.delete-website-warning": "Visi susiję duomenys taip pat bus ištrinti.",
- "message.error": "Kažkas įvyko ne taip.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Eiti į nustatymus",
- "message.incorrect-username-password": "Neteisingas vartotojo vardas/slaptažodis.",
- "message.invalid-domain": "Klaidingas domenas",
- "message.min-password-length": "Reikia bent {n} simbolių",
- "message.new-version-available": "Išleista nauja 'Umami' {version} versija!",
- "message.no-data-available": "Nėra jokių duomenų.",
- "message.no-event-data": "Jokių duomenų apie įvykius nėra.",
- "message.no-match-password": "Slaptažodžiai nesutampa",
- "message.no-results-found": "Jokių rezultatų nerasta.",
- "message.no-team-websites": "Ši komanda neturi jokių svetainių.",
- "message.no-teams": "Jūs nesate sukūrę jokių komandų.",
- "message.no-users": "Nėra jokių vartotojų.",
- "message.no-websites-configured": "Jūs nesate susikonfiguravę jokių svetainių.",
- "message.page-not-found": "Puslapis nerastas.",
- "message.reset-website": "Kad atstatyti šią svetainę, įrašykite {confirmation} žemiau, kad patvirtintumėte.",
- "message.reset-website-warning": "Visi šios svetainės statistikos duomenys bus ištrinti, bet sekimo kodas išliks nepaliestas.",
- "message.saved": "Sėkmingai išsaugota.",
- "message.share-url": "Tai yra viešai prieinama {target} nuoroda (URL).",
- "message.team-already-member": "Jūs jau esate šios komandos narys.",
- "message.team-not-found": "Komanda nerasta.",
- "message.team-websites-info": "Svetaines gali peržiūrėti bet kas iš šios komandos.",
- "message.tracking-code": "Sekimo kodas",
- "message.transfer-team-website-to-user": "Perduoti šią svetainę į jūsų paskyrą?",
- "message.transfer-user-website-to-team": "Pasirinkite komandą, kuriai norite perduoti šią svetainę.",
- "message.transfer-website": "Perduoti svetainės nuosavybę į savo paskyrą arba kitą komandą.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "Vartotojas ištrintas.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Lankytojas iš {country}, naudojantis {browser} sistemoje {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/mn-MN.json b/src/lang/mn-MN.json
deleted file mode 100644
index 60797aef6..000000000
--- a/src/lang/mn-MN.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Хандалтын код",
- "label.actions": "Үйлдлүүд",
- "label.activity": "Үйл ажиллагааны бүртгэл",
- "label.add": "Нэмэх",
- "label.add-description": "Тайлбар нэмэх",
- "label.add-member": "Гишүүн нэмэх",
- "label.add-step": "Алхам нэмэх",
- "label.add-website": "Веб нэмэх",
- "label.admin": "Админ",
- "label.after": "Хойно",
- "label.all": "Бүх",
- "label.all-time": "Бүх цаг үеийн",
- "label.analytics": "Аналитик",
- "label.average": "Дундаж",
- "label.back": "Буцах",
- "label.before": "Өмнө",
- "label.bounce-rate": "Нэг хуудас үзээд гарсан",
- "label.breakdown": "Задаргаа",
- "label.browser": "Хөтөч",
- "label.browsers": "Хөтөч",
- "label.cancel": "Цуцлах",
- "label.change-password": "Нууц үг солих",
- "label.cities": "Хотууд",
- "label.city": "Хот",
- "label.clear-all": "Бүгдийг арилгах",
- "label.compare": "Харьцуулах",
- "label.confirm": "Батлах",
- "label.confirm-password": "Шинэ нууц үгээ давтах",
- "label.contains": "Агуулах",
- "label.continue": "Үргэлжлүүлэх",
- "label.count": "Тоо",
- "label.countries": "Улс",
- "label.country": "Улс",
- "label.create": "Үүсгэх",
- "label.create-report": "Тайлан үүсгэх",
- "label.create-team": "Баг үүсгэх",
- "label.create-user": "Хэрэглэгч үүсгэх",
- "label.created": "Үүсгэсэн",
- "label.created-by": "Үүсгэсэн",
- "label.current": "Одоогийн",
- "label.current-password": "Ашиглаж буй нууц үг",
- "label.custom-range": "Дурын хугацаа",
- "label.dashboard": "Хянах самбар",
- "label.data": "Өгөгдөл",
- "label.date": "Огноо",
- "label.date-range": "Хугацааны муж",
- "label.day": "Өдөр",
- "label.default-date-range": "Өгөгдмөл хугацааны муж",
- "label.delete": "Устгах",
- "label.delete-report": "Тайлан устгах",
- "label.delete-team": "Баг устгах",
- "label.delete-user": "Хэрэглэгч устгах",
- "label.delete-website": "Веб устгах",
- "label.description": "Тайлбар",
- "label.desktop": "Суурин компьютер",
- "label.details": "Мэдээлэл",
- "label.device": "Төхөөрөмж",
- "label.devices": "Төхөөрөмж",
- "label.dismiss": "Үл хэрэгсэх",
- "label.does-not-contain": "Агуулахгүй",
- "label.domain": "Домэйн",
- "label.dropoff": "Уналт",
- "label.edit": "Засах",
- "label.edit-dashboard": "Хянах самбар засах",
- "label.edit-member": "Гишүүн засах",
- "label.enable-share-url": "Хуваалцах холбоос идэвхжүүлэх",
- "label.end-step": "Төгсгөлийн алхам",
- "label.entry": "Орох зам",
- "label.event": "Үйлдэл",
- "label.event-data": "Үйлдлийн өгөгдөл",
- "label.events": "Үйлдэл",
- "label.exit": "Гарах зам",
- "label.false": "Худал",
- "label.field": "Талбар",
- "label.fields": "Талбар",
- "label.filter": "Шүүлтүүр",
- "label.filter-combined": "Нэгтгэсэн",
- "label.filter-raw": "Түүхий",
- "label.filters": "Шүүлтүүр",
- "label.first-seen": "Анх харсан",
- "label.funnel": "Цутгал",
- "label.funnel-description": "Хэрэглэгчдийн шилжилт, уналтын хэмжээг шинжлэх.",
- "label.goal": "Зорилго",
- "label.goals": "Зорилго",
- "label.goals-description": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх.",
- "label.greater-than": "Их",
- "label.greater-than-equals": "Их буюу тэнцүү",
- "label.host": "Хост",
- "label.hosts": "Хост",
- "label.insights": "Шинжлэх",
- "label.insights-description": "Өгөгдлөө хэсэгчлэн хуваах, шүүх байдлаар задлан шинжлэх.",
- "label.is": "Бол",
- "label.is-not": "Биш",
- "label.is-not-set": "Утга оноогоогүй",
- "label.is-set": "Утга оноосон",
- "label.join": "Нэгдэх",
- "label.join-team": "Багт нэгдэх",
- "label.journey": "Аялал",
- "label.journey-description": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх.",
- "label.language": "Хэл",
- "label.languages": "Хэл",
- "label.laptop": "Зөөврийн компьютер",
- "label.last-days": "Сүүлийн {x} хоног",
- "label.last-hours": "Сүүлийн {x} цаг",
- "label.last-months": "Сүүлийн {x} сар",
- "label.last-seen": "Сүүлд харагдсан",
- "label.leave": "Гарах",
- "label.leave-team": "Багаас гарах",
- "label.less-than": "Бага",
- "label.less-than-equals": "Бага буюу тэнцүү",
- "label.login": "Нэвтрэх",
- "label.logout": "Гарах",
- "label.manage": "Удирдах",
- "label.manager": "Удирдагч",
- "label.max": "Max",
- "label.member": "Гишүүн",
- "label.members": "Гишүүд",
- "label.min": "Min",
- "label.mobile": "Утас",
- "label.more": "Цааш",
- "label.my-account": "Миний бүртгэл",
- "label.my-websites": "Миний вебүүд",
- "label.name": "Нэр",
- "label.new-password": "Шинэ нууц үг",
- "label.none": "Байхгүй",
- "label.number-of-records": "{x} {x, plural, one {бичлэг} other {бичлэг}}",
- "label.ok": "ЗА",
- "label.os": "OS",
- "label.overview": "Тойм",
- "label.owner": "Эзэмшигч",
- "label.page-of": "Хуудас {total}-с {current}",
- "label.page-views": "Хуудас үзсэн",
- "label.pageTitle": "Хуудасны гарчиг",
- "label.pages": "Хуудас",
- "label.password": "Нууц үг",
- "label.path": "Зам",
- "label.paths": "Зам",
- "label.powered-by": "{name} дээр суурилсан",
- "label.previous": "Өмнөх",
- "label.previous-period": "Өмнөх үе",
- "label.previous-year": "Өмнөх жил",
- "label.profile": "Бүртгэл",
- "label.properties": "Шинж чанар",
- "label.property": "Шинж чанар",
- "label.queries": "Query-нүүд",
- "label.query": "Query",
- "label.query-parameters": "Query параметр",
- "label.realtime": "Яг одоо",
- "label.referrer": "Чиглүүлэгч",
- "label.referrers": "Чиглүүлэгч",
- "label.refresh": "Сэргээх",
- "label.regenerate": "Дахин үүсгэх",
- "label.region": "Бүс",
- "label.regions": "Бүсүүд",
- "label.remove": "Устгах",
- "label.remove-member": "Гишүүн хасах",
- "label.reports": "Тайлан",
- "label.required": "Шаардлагатай",
- "label.reset": "Дахин эхлүүлэх",
- "label.reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэх",
- "label.retention": "Барилт",
- "label.retention-description": "Хэрэглэгчид таны веб рүү дахин хандах буюу хэрэглэгчдээ хэр тогтоож буйг хэмжих.",
- "label.revenue": "Орлого",
- "label.revenue-description": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах.",
- "label.revenue-property": "Орлогын шинж чанар",
- "label.role": "Эрх",
- "label.run-query": "Query ажиллуулах",
- "label.save": "Хадгалах",
- "label.screens": "Дэлгэц",
- "label.search": "Хайх",
- "label.select": "Сонгох",
- "label.select-date": "Огноо сонгох",
- "label.select-role": "Select role",
- "label.select-website": "Веб сонгох",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Тохиргоо",
- "label.share-url": "Хуваалцах холбоос",
- "label.single-day": "Нэг өдөр",
- "label.start-step": "Эхлэх алхам",
- "label.steps": "Алхам",
- "label.sum": "Нийлбэр",
- "label.tablet": "Таблет",
- "label.team": "Баг",
- "label.team-id": "Багийн ID",
- "label.team-manager": "Багийн удирдагч",
- "label.team-member": "Багийн гишүүн",
- "label.team-name": "Багийн нэр",
- "label.team-owner": "Багийн эзэмшигч",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Багийн вебүүд",
- "label.teams": "Багууд",
- "label.theme": "Загвар",
- "label.this-month": "Энэ сар",
- "label.this-week": "Энэ долоо хоног",
- "label.this-year": "Энэ жил",
- "label.timezone": "Цагийн бүс",
- "label.title": "Гарчиг",
- "label.today": "Өнөөдөр",
- "label.toggle-charts": "Графикийг харуулах/нуух",
- "label.total": "Нийт",
- "label.total-records": "Нийт мөрийн тоо",
- "label.tracking-code": "Мөрдөх код",
- "label.transactions": "Transactions",
- "label.transfer": "Шилжүүлэх",
- "label.transfer-website": "Вебийг шилжүүлэх",
- "label.true": "Үнэн",
- "label.type": "Төрөл",
- "label.unique": "Давхардаагүй",
- "label.unique-visitors": "Зочин",
- "label.uniqueCustomers": "Давтагдаагүй зочин",
- "label.unknown": "Тодорхойгүй",
- "label.untitled": "Гарчиггүй",
- "label.update": "Шинэчлэх",
- "label.url": "URL",
- "label.urls": "URL-ууд",
- "label.user": "Хэрэглэгч",
- "label.user-property": "Хэрэглэгчийн шинж",
- "label.username": "Хэрэглэгчийн нэр",
- "label.users": "Хэрэглэгчид",
- "label.utm": "UTM",
- "label.utm-description": "UTM параметраар кампанит ажлаа мөрдөх.",
- "label.value": "Утга",
- "label.view": "Харах",
- "label.view-details": "Дэлгэрүүлж харах",
- "label.view-only": "Зөвхөн үзэх",
- "label.views": "Үзсэн",
- "label.views-per-visit": "Зочдын хуудас үзсэн тоо",
- "label.visit-duration": "Зочилсон дундаж хугацаа",
- "label.visitors": "Зочин",
- "label.visits": "Зочилсон",
- "label.website": "Веб",
- "label.website-id": "Вебийн ID",
- "label.websites": "Вебүүд",
- "label.window": "Цонх",
- "label.yesterday": "Өчигдөр",
- "message.action-confirmation": "Доорх хэсэгт {confirmation} гэж бичин баталгаажуулна уу.",
- "message.active-users": "одоо {x} {x, plural, one {зочин} other {зочин}} байна",
- "message.collected-data": "Цуглуулсан өгөгдөл",
- "message.confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?",
- "message.confirm-leave": "Та {target}-с гарахдаа итгэлтэй байна уу?",
- "message.confirm-remove": "Та {target}-г устгахдаа итгэлтэй байна уу?",
- "message.confirm-reset": "Та {target}-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?",
- "message.delete-team-warning": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно.",
- "message.delete-website-warning": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно.",
- "message.error": "Ямар нэг зүйл буруу боллоо.",
- "message.event-log": "{url}-д {event}",
- "message.go-to-settings": "Тохиргоо руу очих",
- "message.incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.",
- "message.invalid-domain": "Буруу домэйн",
- "message.min-password-length": "Хамгийн багадаа {n} тэмдэгт",
- "message.new-version-available": "Umami-н шинэ хувилбар {version} гарсан байна!",
- "message.no-data-available": "Өгөгдөл алга.",
- "message.no-event-data": "Үйлдлийн өгөгдөл алга.",
- "message.no-match-password": "Нууц үг тохирохгүй байна.",
- "message.no-results-found": "Ямар ч үр дүн олдсонгүй.",
- "message.no-team-websites": "Энэ багт ямар ч веб алга.",
- "message.no-teams": "Та ямар ч баг үүсгээгүй байна.",
- "message.no-users": "Хэрэглэгч байхгүй байна.",
- "message.no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
- "message.page-not-found": "Хуудас олдсонгүй.",
- "message.reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэхийн тулд доорх хэсэгт {confirmation} гэж бичиж, баталгаажуулна уу.",
- "message.reset-website-warning": "Энэ вебийн бүх тоон үзүүлэлтүүдийг устгах болно. Гэхдээ мөрдөх код хэвээрээ үлдэнэ.",
- "message.saved": "Хадгалсан.",
- "message.share-url": "Таны вебийн тоон үзүүлэлтүүд доорх URL дээр нийтэд харагдах болно:",
- "message.team-already-member": "Та аль хэдийн энэ багийн гишүүн болсон байна.",
- "message.team-not-found": "Баг олдсонгүй.",
- "message.team-websites-info": "Вебийг багийн бүх гишүүд үзэж болно.",
- "message.tracking-code": "Энэ вебийн хандалтуудыг мөрдөхийн тулд доорх кодыг HTML-нхээ ... хэсэгт байрлуулна уу.",
- "message.transfer-team-website-to-user": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?",
- "message.transfer-user-website-to-team": "Энэ вебийг шилжүүлж авах багийг сонгоно уу.",
- "message.transfer-website": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах.",
- "message.triggered-event": "Өдөөсөн үйлдэл",
- "message.user-deleted": "Хэрэглэгч устсан.",
- "message.viewed-page": "Үзсэн хуудас",
- "message.visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон",
- "message.visitors-dropped-off": "Зочдын уналт"
-}
diff --git a/src/lang/ms-MY.json b/src/lang/ms-MY.json
deleted file mode 100644
index a86865731..000000000
--- a/src/lang/ms-MY.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Aksi",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Tambah laman web",
- "label.admin": "Pentadbir",
- "label.after": "After",
- "label.all": "Semua",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Kembali",
- "label.before": "Before",
- "label.bounce-rate": "Kadar lantunan",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Pelayar web",
- "label.cancel": "Batal",
- "label.change-password": "Tukar kata laluan",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Sahkan kata laluan",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Negara",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Kata laluan semasa",
- "label.custom-range": "Julat khas",
- "label.dashboard": "Papan pemuka",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Julat tarikh",
- "label.day": "Day",
- "label.default-date-range": "Julat tarikh lalai",
- "label.delete": "Padam",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Padam laman web",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Peranti",
- "label.dismiss": "Ketepikan",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domain",
- "label.dropoff": "Dropoff",
- "label.edit": "Edit",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Aktifkan url berkongsi",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Peristiwa",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Digabungkan",
- "label.filter-raw": "Mentah",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "{x} hari lepas",
- "label.last-hours": "{x} jam lepas",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Log masuk",
- "label.logout": "Log keluar",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Telefon bimbit",
- "label.more": "Lebih banyak lagi",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Nama",
- "label.new-password": "Kata laluan baru",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Paparan halaman",
- "label.pageTitle": "Page title",
- "label.pages": "Halaman",
- "label.password": "Kata laluan",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Disediakan oleh {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Siaran langsung",
- "label.referrer": "Referrer",
- "label.referrers": "Perujuk",
- "label.refresh": "Muat semula",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Diperlukan",
- "label.reset": "Tetapkan semula",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Simpan",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Tetapan",
- "label.share-url": "Kongsikan URL",
- "label.single-day": "Satu hari",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Bulan ini",
- "label.this-week": "Minggu ini",
- "label.this-year": "Tahun ini",
- "label.timezone": "Zon masa",
- "label.title": "Title",
- "label.today": "Hari ini",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Kod penjejakan",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Pelawat unik",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Tidak diketahui",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Nama pengguna",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Lihat butiran",
- "label.view-only": "View only",
- "label.views": "Lawatan",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Purata tempoh masa lawatan",
- "label.visitors": "Pelawat",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Laman web",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} semasa {x, plural, one {pelawat} other {pelawat}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Pastikah anda ingin memadam {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Semua data yang berkaitan juga akan dihapuskan.",
- "message.error": "Ada yang tidak kena.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Pergi ke tetapan",
- "message.incorrect-username-password": "Pengguna/kata laluan tidak betul.",
- "message.invalid-domain": "Domain tidak sah",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Tiada data yang boleh didapati.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Kata laluan tidak sepadan",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Anda tidak ada sebarang laman web yang telah dikonfigurasikan.",
- "message.page-not-found": "Halaman tidak dijumpai.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Berjaya disimpan.",
- "message.share-url": "Ini adalah URL berkongsi untuk {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Kod penjejakan",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Pelawat dari {country} mengguna {browser} pada {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/my-MM.json b/src/lang/my-MM.json
deleted file mode 100644
index 3ab75f885..000000000
--- a/src/lang/my-MM.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "ဝင်ခွင့်ကုဒ်",
- "label.actions": "လုပ်ဆောင်ချက်များ",
- "label.activity": "လုပ်ဆောင်ချက်စာရင်း",
- "label.add": "ထပ်ထည့်မည်",
- "label.add-description": "အကြောင်းအရာဖော်ပြချက် ထည့်မည်",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "ဝက်ဘ်ဆိုဒ်ထည့်မည်",
- "label.admin": "အက်ဒမင်",
- "label.after": "ပြီးနောက်",
- "label.all": "အားလုံး",
- "label.all-time": "အချိန်အစမှအခုထိ",
- "label.analytics": "အန်နလစ်တစ်",
- "label.average": "ပျမ်းမျှ",
- "label.back": "နောက်သို့",
- "label.before": "မတိုင်မီ",
- "label.bounce-rate": "Bounce နှုန်း",
- "label.breakdown": "ခွဲခြမ်းစိတ်ဖြာမှု",
- "label.browser": "Browser",
- "label.browsers": "ဝက်ဘ်ဘရောင်ဇာများ",
- "label.cancel": "မလုပ်တော့ပါ",
- "label.change-password": "စကားဝှက် ပြောင်းမည်",
- "label.cities": "မြို့များ",
- "label.city": "City",
- "label.clear-all": "အားလုံးကိုဖျက်မည်",
- "label.compare": "Compare",
- "label.confirm": "အတည်ပြုသည်",
- "label.confirm-password": "စကားဝှက်အတည်ပြုသည်",
- "label.contains": "ပါဝင်သည်",
- "label.continue": "ဆက်သွားမည်",
- "label.count": "Count",
- "label.countries": "နိုင်ငံများ",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "ရီပို့လုပ်မည်",
- "label.create-team": "Team ပြုလုပ်မည်",
- "label.create-user": "အသုံးပြုသူထည့်မည်",
- "label.created": "ပြုလုပ်ပြီးသော",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "လက်ရှိစကားဝှက်",
- "label.custom-range": "အချိန်အပိုင်းအခြားရွေးရန်",
- "label.dashboard": "ဒက်ရှ်ဘုတ်",
- "label.data": "ဒေတာ",
- "label.date": "Date",
- "label.date-range": "ရက်အပိုင်းအခြား",
- "label.day": "Day",
- "label.default-date-range": "ပုံသေ ရက်အပိုင်းအခြား",
- "label.delete": "ဖျက်မည်",
- "label.delete-report": "Delete report",
- "label.delete-team": "Team ကိုဖျက်မည်",
- "label.delete-user": "အသုံးပြုသူကိုဖျက်မည်",
- "label.delete-website": "ဝက်ဘ်ဆိုဒ်ကိုဖျက်မည်",
- "label.description": "ရှင်းပြချက်",
- "label.desktop": "စားပွဲတင်ကွန်ပျူတာ",
- "label.details": "အသေးစိတ်",
- "label.device": "Device",
- "label.devices": "အသုံးပြုသည့် ကိရိယာများ",
- "label.dismiss": "ပိတ်ပါ",
- "label.does-not-contain": "မပါဝင်ပါ",
- "label.domain": "ဒိုမိန်း",
- "label.dropoff": "Dropoff",
- "label.edit": "ပြုပြင်မည်",
- "label.edit-dashboard": "ဒက်ရှ်ဘုတ်ကို ပြုပြင်မည်",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "ဝေငှခြင်းကိုလင့်ကို ဖွင့်မည်",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "အဖြစ်အပျက်",
- "label.event-data": "အဖြစ်အပျက် ဒေတာ",
- "label.events": "အဖြစ်အပျက်များ",
- "label.exit": "Exit URL",
- "label.false": "မှားသည်",
- "label.field": "Field အမည်",
- "label.fields": "Field အမည်များ",
- "label.filter": "Filter",
- "label.filter-combined": "ပေါင်းစပ်ပြီး",
- "label.filter-raw": "အရှိအတိုင်း",
- "label.filters": "Filter များ",
- "label.first-seen": "First seen",
- "label.funnel": "ဖန်နယ်",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "ထက်ပို၍ကြီးသည်",
- "label.greater-than-equals": "ထက်ပို၍ကြီးသည်သို့မဟုတ်တူသည်",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "အသေးစိတ်သိမြင်နိုင်ရန်",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "ဝင်မည်",
- "label.join-team": "အသင်းဝင်မည်",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "ဘာသာစကား",
- "label.languages": "ဘာသာစကားများ",
- "label.laptop": "လက်တော့ပ်",
- "label.last-days": "လွန်ခဲ့သော {x} ရက်က",
- "label.last-hours": "လွန်ခဲ့သော {x} နာရီက",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "ထွက်မည်",
- "label.leave-team": "အသင်းမှထွက်မည်",
- "label.less-than": "ထက်ပို၍ငယ်သည်",
- "label.less-than-equals": "ထက်ပို၍ငယ်သည်သို့မဟုတ်တူသည်",
- "label.login": "လော့ဂ်အင်",
- "label.logout": "လော့ဂ်အောက်လုပ်မည်",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "အများဆုံး",
- "label.member": "Member",
- "label.members": "အဖွဲ့ဝင်များ",
- "label.min": "အနည်းဆုံး",
- "label.mobile": "မိုဘိုင်း",
- "label.more": "နောက်ထပ်",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "အမည်",
- "label.new-password": "စကားဝှက်အသစ်",
- "label.none": "မရှိပါ",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "ကွန်ပျူတာလည်ပတ်မှုစနစ်",
- "label.overview": "အပေါ်ယံမြင်ကွင်း",
- "label.owner": "ပိုင်ဆိုင်သူ",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "ဝင်ရောက်ကြည့်ရှုသူ",
- "label.pageTitle": "Page title",
- "label.pages": "စာမျက်နှာများ",
- "label.password": "စကားဝှက်",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "{name} ထောက်ပံ့သည်",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "ပရိုဖိုင်း",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries (ကွာရီများ)",
- "label.query": "Query (ကွာရီ)",
- "label.query-parameters": "Query parameters (ကွာရီပါရာမီတာများ)",
- "label.realtime": "အချိန်နှင့်တပြေးညီ",
- "label.referrer": "Referrer",
- "label.referrers": "ရည်ညွှန်းမှုများ",
- "label.refresh": "Refresh လုပ်မည်",
- "label.regenerate": "ပြန်ထုတ်မည်",
- "label.region": "Region",
- "label.regions": "ဒေသများ",
- "label.remove": "ဖျက်မည်",
- "label.remove-member": "Remove member",
- "label.reports": "တင်ပြမှုများ",
- "label.required": "လိုအပ်သည်",
- "label.reset": "ပြန်စမည်",
- "label.reset-website": "ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်မည်",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "အခန်းကဏ္ဍ",
- "label.run-query": "Query ကိုလုပ်ဆောင်မည်",
- "label.save": "သိမ်းဆည်းမည်",
- "label.screens": "မြင်ကွင်းများ",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "ရက်ရွေးပါ",
- "label.select-role": "Select role",
- "label.select-website": "ဝဘက်ဘ်ဆိုဒ်ရွေးပါ",
- "label.session": "Session",
- "label.sessions": "ဆက်ရှင်များ",
- "label.settings": "ဆက်တင်များ",
- "label.share-url": "URL ကိုရှဲမည်",
- "label.single-day": "တစ်ရက်အတွင်း",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "ပေါင်းလဒ်",
- "label.tablet": "တက်ဘလက်",
- "label.team": "အသင်း",
- "label.team-id": "အသင်း အိုင်ဒီ",
- "label.team-manager": "Team manager",
- "label.team-member": "အသင်းဝင်",
- "label.team-name": "Team name",
- "label.team-owner": "အသင်းကိုပိုင်ဆိုင်သူ",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "အသင်းများ",
- "label.theme": "Theme (အပြင်အဆင်)",
- "label.this-month": "ယခုလ",
- "label.this-week": "ယခုအပတ်",
- "label.this-year": "ယခုနှစ်",
- "label.timezone": "အချိန်ဇုန်",
- "label.title": "ခေါင်းစဥ်",
- "label.today": "ယနေ့",
- "label.toggle-charts": "ဇယားများကို အဖွင့်အပိတ်လုပ်မည်",
- "label.total": "စုစုပေါင်း",
- "label.total-records": "မှတ်တမ်းစုစုပေါင်း",
- "label.tracking-code": "ထရက်လုပ်သည့် ကုဒ်",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "မှန်သည်",
- "label.type": "အမျိုးအစား",
- "label.unique": "Unique",
- "label.unique-visitors": "ဝင်ရောက်သူ (ထပ်ခြင်းမရှိ)",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "မသိသော",
- "label.untitled": "ခေါင်းစဉ်မရှိ",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URL များ",
- "label.user": "အသုံးပြုသူ",
- "label.user-property": "User Property",
- "label.username": "အသုံးပြုသူအမည်",
- "label.users": "အသုံးပြုသူများ",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "တန်ဖိုး",
- "label.view": "ဝင်ရောက်ကြည့်ရှုမှု",
- "label.view-details": "အသေးစိတ်ကို ကြည့်ရှုမည်",
- "label.view-only": "ဝင်ရောက်ကြည့်ရှုမှုများသာ",
- "label.views": "ဝင်ရောက်ကြည့်ရှုမှုများ",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "ဝဘက်ဘ်ဆိုဒ်တွင် ပျမ်းမျှကုန်ဆုံးချိန်",
- "label.visitors": "ဝင်ရောက်ကြည့်ရှုသူများ",
- "label.visits": "Visits",
- "label.website": "ဝက်ဘ်ဆိုဒ်",
- "label.website-id": "ဝက်ဘ်ဆိုဒ် အိုင်ဒီ",
- "label.websites": "ဝက်ဘ်ဆိုဒ်များ",
- "label.window": "ဝင်းဒိုး",
- "label.yesterday": "မနေ့က",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} လက်ရှိအသုံးပြုနေသူ {x, plural, one {ယောက်} other {ယောက်}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "{target} ကို ဖျက်ရန် သေချာပါသလား?",
- "message.confirm-leave": "{target} ကို ထွက်ရန် သေချာပါသလား?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "{target} ကို ဖျက်၍ပြန်စလုပ်ရန် သေချာပါသလား?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "ဝက်ဘ်ဆိုဒ် ဒေတာအကုန် ဖျက်မည်",
- "message.error": "မှားယွင်းမှုတစ်ခု ရှိသွားပါသည်",
- "message.event-log": "{url} တွင် {event}",
- "message.go-to-settings": "ဆက်တင်သို့ သွားရန်",
- "message.incorrect-username-password": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားနေသည်",
- "message.invalid-domain": "ဒိုမိန်း မမှန်ပါ http/https. မပါရပါ",
- "message.min-password-length": "အနည်းဆုံး {n} character ရှိရမည်",
- "message.new-version-available": "အူမာမီ {version} အသစ်ထွက်နေပါပြီ",
- "message.no-data-available": "ဒေတာ မရှိပါ",
- "message.no-event-data": "အဖြစ်အပျက်ဒေတာ မရှိပါ",
- "message.no-match-password": "စကားဝှက် မှားနေသည်",
- "message.no-results-found": "ရလဒ်မရှိပါ",
- "message.no-team-websites": "ဤအသင်းတွင် ဝက်ဘ်ဆိုက်မရှိသေးပါ",
- "message.no-teams": "အသင်း မပြုလုပ်ရသေးပါ",
- "message.no-users": "အသုံးပြုသူ မရှိသေးပါ",
- "message.no-websites-configured": "ဝက်ဘ်ဆိုဒ်တစ်ခုမှ မထည့်ရသေးပါ",
- "message.page-not-found": "ဤစာမျက်နှာသည် မရှိပါ",
- "message.reset-website": "ဤ ဝက်ဘ်ဆိုဒ်ဒေတာကိုဖျက်၍ ပြန်စလုပ်ရန် အောက်တွင် {confirmation} ကို ရိုက်ထည့်ပေးပါ",
- "message.reset-website-warning": "ဤဝက်ဘ်ဆိုဒ်က စာရင်းအချက်အလက်များကို ဖျက်မည်၊ ဆက်တင်ဒေတာများ မပါပါ",
- "message.saved": "မှတ်သားပြီး",
- "message.share-url": "သင့်ဝက်ဆိုဒ်ဘ်၏ စာရင်းအချက်အလက်များကို အောက်ပါ URL တွင် ဝင်ရောက်ကြည့်ရှုနိုင်သည်",
- "message.team-already-member": "ဤအသင်းတွင် ဝင်ပြီးသားဖြစ်နေသည်",
- "message.team-not-found": "အသင်း မရှိပါ",
- "message.team-websites-info": "ဤဝက်ဘ်ဆိုဒ်များကို အသင်းထဲမှ လူတိုင်းဝင်ကြည့်နိုင်သည်",
- "message.tracking-code": "ဤဝက်ဘ်ဆိုဒ်၏ ဒေတာကိုကောက်ခံရန် အောက်ပါ code ကို သင်၏ HTML တွင်ထည့်ပါ",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "အသုံးပြုသူ ဖျက်ပြီးပါပြီ",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "{country} မှ {browser} ဖြင့် {os} {device} တွင် ဝင်ရောက်ကြည့်ရှုသူ",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
deleted file mode 100644
index 7c691002d..000000000
--- a/src/lang/nb-NO.json
+++ /dev/null
@@ -1,280 +0,0 @@
-{
- "label.access-code": "Tilgangskode",
- "label.actions": "Handlinger",
- "label.activity": "Aktivitetslogg",
- "label.add": "Legg til",
- "label.add-description": "Legg til beskrivelse",
- "label.add-member": "Legg til bruker",
- "label.add-step": "Legg til steg",
- "label.add-website": "Legg til nettsted",
- "label.admin": "Administrator",
- "label.after": "Etter",
- "label.all": "Alle",
- "label.all-time": "Noensinne",
- "label.analytics": "Analytics",
- "label.average": "Gjennomsnnitt",
- "label.back": "Tilbake",
- "label.before": "Før",
- "label.bounce-rate": "Avvisningsfrekvens",
- "label.breakdown": "Nedbrytning",
- "label.browser": "Nettleser",
- "label.browsers": "Nettlesere",
- "label.cancel": "Avvis",
- "label.change-password": "Bytt passord",
- "label.cities": "Byer",
- "label.city": "By",
- "label.clear-all": "Tøm alle",
- "label.compare": "Sammenlign",
- "label.confirm": "Bekreft",
- "label.confirm-password": "Godkjenn passord",
- "label.contains": "Inneholder",
- "label.continue": "Fortsett",
- "label.count": "Antall",
- "label.countries": "Land",
- "label.country": "Land",
- "label.create": "Opprett",
- "label.create-report": "Opprett rapport",
- "label.create-team": "Opprett team",
- "label.create-user": "Opprett bruker",
- "label.created": "Opprettet",
- "label.created-by": "Opprettet av",
- "label.current": "Nåværende",
- "label.current-password": "Nåværende passord",
- "label.custom-range": "Egendefinert utvalg",
- "label.dashboard": "Dashbord",
- "label.data": "Data",
- "label.date": "Dato",
- "label.date-range": "Datointervall",
- "label.day": "Dag",
- "label.default-date-range": "Standard datoperiode",
- "label.delete": "Slett",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Slett nettstedet",
- "label.description": "Description",
- "label.desktop": "Stasjonær",
- "label.details": "Detaljer",
- "label.device": "Enhet",
- "label.devices": "Enheter",
- "label.dismiss": "Avbryt",
- "label.does-not-contain": "Innholder ikke",
- "label.domain": "Domene",
- "label.dropoff": "Dropoff",
- "label.edit": "Rediger",
- "label.edit-dashboard": "Rediger dashboard",
- "label.edit-member": "Rediger bruker",
- "label.enable-share-url": "Aktiver delings-URL",
- "label.end-step": "Avslutt steg",
- "label.entry": "Inngangs-URL",
- "label.event": "Hendelse",
- "label.event-data": "Hendelsesdata",
- "label.events": "Hendelser",
- "label.exit": "Utgangs-URL",
- "label.false": "Usant",
- "label.field": "Felt",
- "label.fields": "Felt",
- "label.filter": "Filter",
- "label.filter-combined": "Kombinert",
- "label.filter-raw": "Rå",
- "label.filters": "Filter",
- "label.first-seen": "Først sett",
- "label.funnel": "Trakt",
- "label.funnel-description": "Forstå konverteringen og drop-off frafallsfrekvens av brukere.",
- "label.goal": "Mål",
- "label.goals": "Mål",
- "label.goals-description": "Spor dine mål for sidevisninger og hendelser.",
- "label.greater-than": "Mer enn",
- "label.greater-than-equals": "Mer enn eller lik",
- "label.host": "Vert",
- "label.hosts": "Verter",
- "label.insights": "Innsikt",
- "label.insights-description": "Dykk dypere i din data ved bruk av segmentering og filtre.",
- "label.is": "Er",
- "label.is-not": "Er ikke",
- "label.is-not-set": "Er ikke satt",
- "label.is-set": "Er satt",
- "label.join": "Bli med",
- "label.join-team": "Bli med i teamet",
- "label.journey": "Reise",
- "label.journey-description": "Forstå hvordan brukerene navigerer gjennom din side.",
- "label.language": "Språk",
- "label.languages": "Språk",
- "label.laptop": "Bærbar",
- "label.last-days": "Siste {x} dager",
- "label.last-hours": "Siste {x} timer",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Sist sett",
- "label.leave": "Forlat",
- "label.leave-team": "Forlat team",
- "label.less-than": "Mindre enn",
- "label.less-than-equals": "Mindre enn eller lik",
- "label.login": "Logg inn",
- "label.logout": "Logg ut",
- "label.manage": "Administrer",
- "label.manager": "Administrator",
- "label.max": "Maks",
- "label.member": "Bruker",
- "label.members": "Brukere",
- "label.min": "Min",
- "label.mobile": "Mobiltelefon",
- "label.more": "Mer",
- "label.my-account": "Min konto",
- "label.my-websites": "Mine nettsider",
- "label.name": "Navn",
- "label.new-password": "Nytt passord",
- "label.none": "Ingen",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Oversikt",
- "label.owner": "Eier",
- "label.page-of": "Side {current} av {total}",
- "label.page-views": "Sidevisninger",
- "label.pageTitle": "Sidetittel",
- "label.pages": "Sider",
- "label.password": "Passord",
- "label.path": "Sti",
- "label.paths": "Stier",
- "label.powered-by": "Drevet av {name}",
- "label.previous": "Forrige",
- "label.previous-period": "Forrige periode",
- "label.previous-year": "Forrige år",
- "label.profile": "Profil",
- "label.properties": "Egenskaper",
- "label.property": "Egenskap",
- "label.queries": "Forspørsler",
- "label.query": "Forespørsel",
- "label.query-parameters": "Forespørsel parametere",
- "label.realtime": "Sanntid",
- "label.referrer": "Henviser",
- "label.referrers": "Henvisere",
- "label.refresh": "Oppdater",
- "label.regenerate": "Regenerer",
- "label.region": "Region",
- "label.regions": "Regioner",
- "label.remove": "Fjern",
- "label.remove-member": "Fjern bruker",
- "label.reports": "Rapporter",
- "label.required": "Påkrevd",
- "label.reset": "Nullstill",
- "label.reset-website": "Nullstill statistikk",
- "label.retention": "Retensjon",
- "label.retention-description": "Mål nettstedets klebrighet ved å spore hvor ofte brukere kommer tilbake.",
- "label.revenue": "Inntenker",
- "label.revenue-description": "Se på inntektene dine over tid.",
- "label.revenue-property": "Inntektegenskaper",
- "label.role": "Rolle",
- "label.run-query": "Kjør spørring",
- "label.save": "Lagre",
- "label.screens": "Skjermer",
- "label.search": "Søk",
- "label.select": "Velg",
- "label.select-date": "Velg dato",
- "label.select-role": "Velg rolle",
- "label.select-website": "Velg nettsted",
- "label.session": "Økt",
- "label.sessions": "Økter",
- "label.settings": "Innstillinger",
- "label.share-url": "Del URL",
- "label.single-day": "Enkeltdag",
- "label.start-step": "Starttrinn",
- "label.steps": "Trinn",
- "label.sum": "Sum",
- "label.tablet": "Nettbrett",
- "label.team": "Team",
- "label.team-id": "Team-ID",
- "label.team-manager": "Teamadministrator",
- "label.team-member": "Teammedlem",
- "label.team-name": "Teamnavn",
- "label.team-owner": "Teameier",
- "label.team-view-only": "Team (kun visning)",
- "label.team-websites": "Team-nettsteder",
- "label.teams": "Team",
- "label.theme": "Tema",
- "label.this-month": "Denne måneden",
- "label.this-week": "Denne uka",
- "label.this-year": "I år",
- "label.timezone": "Tidssone",
- "label.title": "Tittel",
- "label.today": "I dag",
- "label.toggle-charts": "Veksle grafer",
- "label.total": "Totalt",
- "label.total-records": "Totalt antall oppføringer",
- "label.tracking-code": "Sporingskode",
- "label.transactions": "Transaksjoner",
- "label.transfer": "Overfør",
- "label.transfer-website": "Overfør nettsted",
- "label.true": "Sant",
- "label.type": "Type",
- "label.unique": "Unike",
- "label.unique-visitors": "Unike besøkende",
- "label.uniqueCustomers": "Unike kunder",
- "label.unknown": "Ukjent",
- "label.untitled": "Uten tittel",
- "label.update": "Oppdater",
- "label.url": "URL",
- "label.urls": "URL-er",
- "label.user": "Bruker",
- "label.user-property": "Brukeregenskap",
- "label.username": "Brukernavn",
- "label.users": "Brukere",
- "label.utm": "UTM",
- "label.utm-description": "Spor kampanjene dine via UTM-parametre.",
- "label.value": "Verdi",
- "label.view": "Vis",
- "label.view-details": "Vis detaljer",
- "label.view-only": "Kun visning",
- "label.views": "Visninger",
- "label.views-per-visit": "Visninger per besøk",
- "label.visit-duration": "Gjennomsnittlig besøkstid",
- "label.visitors": "Besøkende",
- "label.visits": "Besøk",
- "label.website": "Nettsted",
- "label.website-id": "Nettsted-ID",
- "label.websites": "Nettsteder",
- "label.window": "Vindu",
- "label.yesterday": "I går",
- "message.action-confirmation": "Skriv {confirmation} i feltet nedenfor for å bekrefte.",
- "message.active-users": "{x} {x, plural, one {besøkende} other {besøkende}} nå",
- "message.collected-data": "Innsamlede data",
- "message.confirm-delete": "Er du sikker på at du vil slette {target}?",
- "message.confirm-leave": "Er du sikker på at du vil forlate {target}?",
- "message.confirm-remove": "Er du sikker på at du vil fjerne {target}?",
- "message.confirm-reset": "Er du sikker på at du vil nullstille statistikken til {target}?",
- "message.delete-team-warning": "Å slette et team vil også slette alle teamets nettsteder.",
- "message.delete-website-warning": "Alle tilknyttede data vil også bli slettet.",
- "message.error": "Noe gikk galt.",
- "message.event-log": "{event} på {url}",
- "message.go-to-settings": "Gå til innstillinger",
- "message.incorrect-username-password": "Ugyldig brukernavn/passord.",
- "message.invalid-domain": "Ugyldig domene",
- "message.min-password-length": "Minimumslengde på {n} tegn",
- "message.new-version-available": "En ny versjon av Umami {version} er tilgjengelig!",
- "message.no-data-available": "Ingen data tilgjengelig.",
- "message.no-event-data": "Ingen hendelsesdata er tilgjengelig.",
- "message.no-match-password": "Passordene er ikke like",
- "message.no-results-found": "Ingen resultater funnet.",
- "message.no-team-websites": "Dette teamet har ingen nettsteder.",
- "message.no-teams": "Du har ikke opprettet noen team.",
- "message.no-users": "Ingen brukere.",
- "message.no-websites-configured": "Du har ikke satt opp noen nettsteder.",
- "message.page-not-found": "Siden ble ikke funnet.",
- "message.reset-website": "For å nullstille dette nettstedet, skriv {confirmation} i feltet nedenfor for å bekrefte.",
- "message.reset-website-warning": "All statistikk for dette nettstedet vil bli slettet, men sporingskoden forblir uberørt.",
- "message.saved": "Lagret!",
- "message.share-url": "Dette er den offentlige delings-URL-en for {target}.",
- "message.team-already-member": "Du er allerede medlem av teamet.",
- "message.team-not-found": "Teamet ble ikke funnet.",
- "message.team-websites-info": "Nettsteder kan vises av alle på teamet.",
- "message.tracking-code": "Sporingskode",
- "message.transfer-team-website-to-user": "Overfør dette nettstedet til kontoen din?",
- "message.transfer-user-website-to-team": "Velg teamet du vil overføre dette nettstedet til.",
- "message.transfer-website": "Overfør eierskapet til nettstedet til din konto eller et annet team.",
- "message.triggered-event": "Utløst hendelse",
- "message.user-deleted": "Bruker slettet.",
- "message.viewed-page": "Vist side",
- "message.visitor-log": "Besøkende fra {country} med {browser} på {os} {device}",
- "message.visitors-dropped-off": "Besøkende falt fra"
-
-}
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
deleted file mode 100644
index 78b41df7d..000000000
--- a/src/lang/nl-NL.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Toegangscode",
- "label.actions": "Acties",
- "label.activity": "Activiteiten logboek",
- "label.add": "Toevoegen",
- "label.add-description": "Omschrijving toevoegen",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Website koppelen",
- "label.admin": "Administrator",
- "label.after": "Na",
- "label.all": "Alles",
- "label.all-time": "Onbeperkt",
- "label.analytics": "Analytics",
- "label.average": "Gemiddelde",
- "label.back": "Terug",
- "label.before": "Voor",
- "label.bounce-rate": "Bouncepercentage",
- "label.breakdown": "Opsplitsen",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "Annuleren",
- "label.change-password": "Wachtwoord wijzigen",
- "label.cities": "Steden",
- "label.city": "Stad",
- "label.clear-all": "Filters wissen",
- "label.compare": "Compare",
- "label.confirm": "Bevestigen",
- "label.confirm-password": "Wachtwoord bevestigen",
- "label.contains": "Bevat",
- "label.continue": "Doorgaan",
- "label.count": "Count",
- "label.countries": "Landen",
- "label.country": "Land",
- "label.create": "Aanmaken",
- "label.create-report": "Rapport aanmaken",
- "label.create-team": "Team aanmaken",
- "label.create-user": "Gebruiker maken",
- "label.created": "Gemaakt",
- "label.created-by": "Gemaakt Door",
- "label.current": "Current",
- "label.current-password": "Huidig wachtwoord",
- "label.custom-range": "Aangepast bereik",
- "label.dashboard": "Overzicht",
- "label.data": "Gegevens",
- "label.date": "Datum",
- "label.date-range": "Datumbereik",
- "label.day": "Dag",
- "label.default-date-range": "Standaard bereik",
- "label.delete": "Verwijderen",
- "label.delete-report": "Rapport verwijderen",
- "label.delete-team": "Team verwijderen",
- "label.delete-user": "Verwijder gebruiker",
- "label.delete-website": "Website verwijderen",
- "label.description": "Omschrijving",
- "label.desktop": "Computer",
- "label.details": "Informatie",
- "label.device": "Apparaat",
- "label.devices": "Apparaten",
- "label.dismiss": "Negeren",
- "label.does-not-contain": "Bevat geen",
- "label.domain": "Domein",
- "label.dropoff": "Uitval",
- "label.edit": "Bewerken",
- "label.edit-dashboard": "Dashboard aanpassen",
- "label.edit-member": "Gebruiker aanpassen",
- "label.enable-share-url": "Sta delen via openbare URL toe",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Gebeurtenis",
- "label.event-data": "Datum gebeurtenis",
- "label.events": "Gebeurtenissen",
- "label.exit": "Exit URL",
- "label.false": "Onwaar",
- "label.field": "Veld",
- "label.fields": "Velden",
- "label.filter": "Filter",
- "label.filter-combined": "Gecombineerd",
- "label.filter-raw": "Ruw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Ontdek de conversie- en uitvalpercentages van gebruikers.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Groter dan",
- "label.greater-than-equals": "Groter of gelijk aan",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Inzichten",
- "label.insights-description": "Verken je gegevens verder door segmenten en filters te gebruiken.",
- "label.is": "Is",
- "label.is-not": "Is niet",
- "label.is-not-set": "Is niet ingesteld",
- "label.is-set": "Is ingesteld",
- "label.join": "Lid worden",
- "label.join-team": "Word lid van een team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Taal",
- "label.languages": "Talen",
- "label.laptop": "Laptop",
- "label.last-days": "Laatste {x} dagen",
- "label.last-hours": "Laatste {x} uur",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Verlaten",
- "label.leave-team": "Verlaat team",
- "label.less-than": "Minder dan",
- "label.less-than-equals": "Minder of gelijk aan",
- "label.login": "Inloggen",
- "label.logout": "Uitloggen",
- "label.manage": "Beheren",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Gebruiker",
- "label.members": "Gebruikers",
- "label.min": "Min",
- "label.mobile": "Mobiel",
- "label.more": "Toon meer",
- "label.my-account": "Mijn profiel",
- "label.my-websites": "Mijn websites",
- "label.name": "Naam",
- "label.new-password": "Nieuw wachtwoord",
- "label.none": "Geen",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overzicht",
- "label.owner": "Eigenaar",
- "label.page-of": "Pagina {current} van {total}",
- "label.page-views": "Paginaweergaven",
- "label.pageTitle": "Pagina titel",
- "label.pages": "Pagina's",
- "label.password": "Wachtwoord",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "mogelijk gemaakt door {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profiel",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Parameters",
- "label.query": "Query",
- "label.query-parameters": "URL-parameters",
- "label.realtime": "Actueel",
- "label.referrer": "Referrer",
- "label.referrers": "Verwijzers",
- "label.refresh": "Vernieuwen",
- "label.regenerate": "Opnieuw genereren",
- "label.region": "Regio",
- "label.regions": "Regio's",
- "label.remove": "Verwijderen",
- "label.remove-member": "Gebruiker verwijderen",
- "label.reports": "Rapporten",
- "label.required": "Verplicht",
- "label.reset": "Opnieuw instellen",
- "label.reset-website": "Statistieken opnieuw instellen",
- "label.retention": "Retentie",
- "label.retention-description": "Meet de retentie van je website door door bij te houden hoe vaak gebruikers terugkeren.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Gebruikersrol",
- "label.run-query": "Query uitvoeren",
- "label.save": "Opslaan",
- "label.screens": "Schermen",
- "label.search": "Zoeken",
- "label.select": "Selecteer",
- "label.select-date": "Datum selecteren",
- "label.select-role": "Rol selecteren",
- "label.select-website": "Website selecteren",
- "label.session": "Session",
- "label.sessions": "Sessies",
- "label.settings": "Instellingen",
- "label.share-url": "URL delen",
- "label.single-day": "Enkele dag",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Som",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Teamlid",
- "label.team-name": "Teamnaam",
- "label.team-owner": "Teameigenaar",
- "label.team-view-only": "Team alleen lezen",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Thema",
- "label.this-month": "Deze maand",
- "label.this-week": "Deze week",
- "label.this-year": "Dit jaar",
- "label.timezone": "Tijdzone",
- "label.title": "Titel",
- "label.today": "Vandaag",
- "label.toggle-charts": "Grafieken tonen/verbergen",
- "label.total": "Totaal",
- "label.total-records": "Totaal records",
- "label.tracking-code": "Volgcode",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "Waar",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unieke bezoekers",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Onbekend",
- "label.untitled": "Ongetiteld",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URL's",
- "label.user": "Gebruiker",
- "label.user-property": "User Property",
- "label.username": "Gebruikersnaam",
- "label.users": "Gebruikers",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Waarde",
- "label.view": "Weergave",
- "label.view-details": "Meer details",
- "label.view-only": "Alleen inzien",
- "label.views": "Weergaven",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Gemiddelde bezoektijd",
- "label.visitors": "Bezoekers",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Websites",
- "label.window": "Window",
- "label.yesterday": "Gisteren",
- "message.action-confirmation": "Typ {confirmation} in het veld hieronder om te bevestigen.",
- "message.active-users": "{x} actieve {x, plural, one {bezoeker} other {bezoekers}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Weet je zeker dat je {target} wilt verwijderen?",
- "message.confirm-leave": "Weet je zeker dat je {target} wilt verlaten?",
- "message.confirm-remove": "Weet je zeker dat je {target} wilt verwijderen?",
- "message.confirm-reset": "Weet je zeker dat je de statistieken van {target} opnieuw wilt instellen?",
- "message.delete-team-warning": "Als een team wordt verwijderd, worden ook alle websites van dat team verwijderd.",
- "message.delete-website-warning": "Alle verwante gegevens zullen ook verwijderd worden.",
- "message.error": "Er is iets misgegaan.",
- "message.event-log": "{event} op {url}",
- "message.go-to-settings": "Naar instellingen",
- "message.incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.",
- "message.invalid-domain": "Ongeldig domein",
- "message.min-password-length": "Minimale lengte van {n} tekens",
- "message.new-version-available": "Een nieuwe versie van Umami {version} is beschikbaar!",
- "message.no-data-available": "Geen gegevens beschikbaar.",
- "message.no-event-data": "Geen gegevens over de gebeurtenis beschikbaar.",
- "message.no-match-password": "Wachtwoorden komen niet overeen",
- "message.no-results-found": "Geen resultaten gevonden.",
- "message.no-team-websites": "Er zijn geen websites gekoppeld aan dit team.",
- "message.no-teams": "Er zijn nog geen teams aangemaakt.",
- "message.no-users": "Er zijn geen gebruikers.",
- "message.no-websites-configured": "Je hebt geen websites ingesteld.",
- "message.page-not-found": "Pagina niet gevonden.",
- "message.reset-website": "Typ {confirmation} in het veld hieronder om te bevestigen dat je de website wilt resetten.",
- "message.reset-website-warning": "Alle bijhorende statistieken van deze website worden verwijderd, maar jouw volgcode blijft gelden.",
- "message.saved": "Opslaan succesvol.",
- "message.share-url": "Met deze URL kan {target} openbaar gedeeld worden.",
- "message.team-already-member": "Je bent al lid van het team.",
- "message.team-not-found": "Team niet gevonden.",
- "message.team-websites-info": "Websites kunnen door iedereen in het team worden bekeken.",
- "message.tracking-code": "Volgcode",
- "message.transfer-team-website-to-user": "Deze website toevoegen aan je account?",
- "message.transfer-user-website-to-team": "Selecteer het team om deze website aan toe te voegen.",
- "message.transfer-website": "Draag het eigenaarschap van de website over naar jouw account, of een ander team.",
- "message.triggered-event": "Getriggerde gebeurtenis",
- "message.user-deleted": "Gebruiker verwijderd",
- "message.viewed-page": "Bekeken pagina",
- "message.visitor-log": "Bezoeker uit {country} met {browser} op een {os} {device}",
- "message.visitors-dropped-off": "Afgehaakte bezoekers"
-}
diff --git a/src/lang/pl-PL.json b/src/lang/pl-PL.json
deleted file mode 100644
index 697beeb35..000000000
--- a/src/lang/pl-PL.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Kod dostępu",
- "label.actions": "Działania",
- "label.activity": "Dziennik aktywności",
- "label.add": "Dodaj",
- "label.add-description": "Dodaj opis",
- "label.add-member": "Dodaj członka",
- "label.add-step": "Dodaj krok",
- "label.add-website": "Dodaj witrynę",
- "label.admin": "Administrator",
- "label.after": "Po",
- "label.all": "Wszystkie",
- "label.all-time": "Cały czas",
- "label.analytics": "Analityka",
- "label.average": "Średnia",
- "label.back": "Powrót",
- "label.before": "Przed",
- "label.bounce-rate": "Współczynnik odrzuceń",
- "label.breakdown": "Rozbicie",
- "label.browser": "Przeglądarka",
- "label.browsers": "Przeglądarki",
- "label.cancel": "Anuluj",
- "label.change-password": "Zmień hasło",
- "label.cities": "Miasta",
- "label.city": "Miasto",
- "label.clear-all": "Wyczyść wszystko",
- "label.compare": "Porównaj",
- "label.confirm": "Potwierdź",
- "label.confirm-password": "Potwierdź hasło",
- "label.contains": "Zawiera",
- "label.continue": "Kontynuuj",
- "label.count": "Liczba",
- "label.countries": "Kraje",
- "label.country": "Państwo",
- "label.create": "Utwórz",
- "label.create-report": "Utwórz raport",
- "label.create-team": "Utwórz zespół",
- "label.create-user": "Utwórz użytkownika",
- "label.created": "Utworzony",
- "label.created-by": "Utworzony przez",
- "label.current": "Aktualny",
- "label.current-password": "Aktualne hasło",
- "label.custom-range": "Zakres niestandardowy",
- "label.dashboard": "Panel",
- "label.data": "Dane",
- "label.date": "Data",
- "label.date-range": "Zakres dat",
- "label.day": "Dzień",
- "label.default-date-range": "Domyślny zakres dat",
- "label.delete": "Usuń",
- "label.delete-report": "Usuń raport",
- "label.delete-team": "Usuń zespół",
- "label.delete-user": "Usuń użytkownika",
- "label.delete-website": "Usuń witrynę",
- "label.description": "Opis",
- "label.desktop": "Komputer",
- "label.details": "Szczegóły",
- "label.device": "Urządzenie",
- "label.devices": "Urządzenia",
- "label.dismiss": "Odrzuć",
- "label.does-not-contain": "Nie zawiera",
- "label.domain": "Domena",
- "label.dropoff": "Odpływ",
- "label.edit": "Edytuj",
- "label.edit-dashboard": "Edytuj panel",
- "label.edit-member": "Edytuj członka",
- "label.enable-share-url": "Włącz udostępnianie adresu URL",
- "label.end-step": "Krok końcowy",
- "label.entry": "Entry URL",
- "label.event": "Zdarzenie",
- "label.event-data": "Dane zdarzenia",
- "label.events": "Zdarzenia",
- "label.exit": "URL wyjściowy",
- "label.false": "Fałsz",
- "label.field": "Pole",
- "label.fields": "Pola",
- "label.filter": "Filtruj",
- "label.filter-combined": "Połączone",
- "label.filter-raw": "Surowe dane",
- "label.filters": "Filtry",
- "label.first-seen": "First seen",
- "label.funnel": "Lejek",
- "label.funnel-description": "Zrozum wskaźniki konwersji i odpływu użytkowników.",
- "label.goal": "Cel",
- "label.goals": "Cele",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Większe niż",
- "label.greater-than-equals": "Większe niż lub równe",
- "label.host": "Host",
- "label.hosts": "Hosty",
- "label.insights": "Analiza",
- "label.insights-description": "Poznaj lepiej swoje dane, korzystając z segmentów i filtrów.",
- "label.is": "Równe",
- "label.is-not": "Nie jest równe",
- "label.is-not-set": "Nieustawione",
- "label.is-set": "Ustawione",
- "label.join": "Dołącz",
- "label.join-team": "Dołącz do zespołu",
- "label.journey": "Droga",
- "label.journey-description": "Zrozum, w jaki sposób użytkownicy poruszają się po Twojej witrynie.",
- "label.language": "Język",
- "label.languages": "Języki",
- "label.laptop": "Laptop",
- "label.last-days": "Ostatnie {x} dni",
- "label.last-hours": "Ostatnie {x} godzin",
- "label.last-months": "Osatnie {x} miesięcy",
- "label.last-seen": "Last seen",
- "label.leave": "Opuść",
- "label.leave-team": "Opuść zespół",
- "label.less-than": "Mniejsze niż",
- "label.less-than-equals": "Mniejsze niż lub równe",
- "label.login": "Zaloguj się",
- "label.logout": "Wyloguj",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Maks",
- "label.member": "Członek",
- "label.members": "Członkowie",
- "label.min": "Min",
- "label.mobile": "Smartfon",
- "label.more": "Więcej",
- "label.my-account": "Moje konto",
- "label.my-websites": "Moje witryny",
- "label.name": "Nazwa",
- "label.new-password": "Nowe hasło",
- "label.none": "Brak",
- "label.number-of-records": "{x} {x, plural, one {rekord} other {rekordy}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Przegląd",
- "label.owner": "Właściciel",
- "label.page-of": "Strona {current} z {total}",
- "label.page-views": "Wyświetlenia strony",
- "label.pageTitle": "Tytuł strony",
- "label.pages": "Strony",
- "label.password": "Hasło",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Obsługiwane przez {name}",
- "label.previous": "Poprzedni",
- "label.previous-period": "Poprzedni okres",
- "label.previous-year": "Poprzedni rok",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Zapytania",
- "label.query": "Zapytanie",
- "label.query-parameters": "Parametry zapytania",
- "label.realtime": "Czas rzeczywisty",
- "label.referrer": "Źródło odsyłające",
- "label.referrers": "Źródła odsyłające",
- "label.refresh": "Odśwież",
- "label.regenerate": "Wygeneruj ponownie",
- "label.region": "Region",
- "label.regions": "Regiony",
- "label.remove": "Usuń",
- "label.remove-member": "Usuń członka",
- "label.reports": "Raporty",
- "label.required": "Wymagany",
- "label.reset": "Zresetuj",
- "label.reset-website": "Zresetuj statystyki",
- "label.retention": "Retencja",
- "label.retention-description": "Mierz przyciągającą siłę swojej strony internetowej, śledząc, jak często użytkownicy powracają.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rola",
- "label.run-query": "Uruchom zapytanie",
- "label.save": "Zapisz",
- "label.screens": "Ekrany",
- "label.search": "Szukaj",
- "label.select": "Wybierz",
- "label.select-date": "Wybierz datę",
- "label.select-role": "Wybierz rolę",
- "label.select-website": "Wybierz witrynę",
- "label.session": "Session",
- "label.sessions": "Sesje",
- "label.settings": "Ustawienia",
- "label.share-url": "Udostępnij adres URL",
- "label.single-day": "W tym dniu",
- "label.start-step": "Krok startowy",
- "label.steps": "Kroki",
- "label.sum": "Suma",
- "label.tablet": "Tablet",
- "label.team": "Zespół",
- "label.team-id": "ID zespołu",
- "label.team-manager": "Team manager",
- "label.team-member": "Członek zespołu",
- "label.team-name": "Nazwa zespołu",
- "label.team-owner": "Właściciel zespołu",
- "label.team-view-only": "Tylko do odczytu dla zespołu",
- "label.team-websites": "Witryny zespołu",
- "label.teams": "Zespoły",
- "label.theme": "Motyw",
- "label.this-month": "W tym miesiącu",
- "label.this-week": "W tym tygodniu",
- "label.this-year": "W tym roku",
- "label.timezone": "Strefa czasowa",
- "label.title": "Tytuł",
- "label.today": "Dzisiaj",
- "label.toggle-charts": "Przełącz wykresy",
- "label.total": "W sumie",
- "label.total-records": "Suma rekordów",
- "label.tracking-code": "Kod śledzenia",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "Prawda",
- "label.type": "Typ",
- "label.unique": "Unikalne",
- "label.unique-visitors": "Unikalni odwiedzający",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Nieznany",
- "label.untitled": "Bez tytułu",
- "label.update": "Aktualizuj",
- "label.url": "Link",
- "label.urls": "Linki",
- "label.user": "Użytkownik",
- "label.user-property": "User Property",
- "label.username": "Nazwa użytkownika",
- "label.users": "Użytkownicy",
- "label.utm": "UTM",
- "label.utm-description": "Śledź swoje kampanie za pomocą parametrów UTM.",
- "label.value": "Wartość",
- "label.view": "Zobacz",
- "label.view-details": "Pokaż szczegóły",
- "label.view-only": "Tylko do odczytu",
- "label.views": "Wyświetlenia",
- "label.views-per-visit": "Widoków na wizytę",
- "label.visit-duration": "Średni czas wizyty",
- "label.visitors": "Odwiedzający",
- "label.visits": "Wizyty",
- "label.website": "Witryna",
- "label.website-id": "ID witryny",
- "label.websites": "Witryny",
- "label.window": "Okno",
- "label.yesterday": "Wczoraj",
- "message.action-confirmation": "Wpisz {confirmation}, aby potwierdzić.",
- "message.active-users": "{x} aktualnie {x, plural, one {odwiedzający} other {odwiedzających}}",
- "message.collected-data": "Zebrane dane",
- "message.confirm-delete": "Czy na pewno chcesz usunąć {target}?",
- "message.confirm-leave": "Czy na pewno chcesz opuścić {target}?",
- "message.confirm-remove": "Czy na pewno chcesz usunąć {target}?",
- "message.confirm-reset": "Czy na pewno chcesz zresetować statystyki {target}?",
- "message.delete-team-warning": "Usunięcie zespołu usunie wszystkie jego witryny.",
- "message.delete-website-warning": "Wszystkie powiązane dane również zostaną usunięte.",
- "message.error": "Coś poszło nie tak.",
- "message.event-log": "{event} na {url}",
- "message.go-to-settings": "Przejdź do ustawień",
- "message.incorrect-username-password": "Nieprawidłowa nazwa użytkownika lub hasło.",
- "message.invalid-domain": "Nieprawidłowa witryna",
- "message.min-password-length": "Minimalna długość {n} znaków",
- "message.new-version-available": "Nowa wersja Umami {version} jest dostępna!",
- "message.no-data-available": "Brak dostępnych danych.",
- "message.no-event-data": "Brak dostępnych danych o zdarzeniach.",
- "message.no-match-password": "Hasła się nie zgadzają",
- "message.no-results-found": "Nie znaleziono wyników.",
- "message.no-team-websites": "Ten zespół nie ma żadnych witryn internetowych.",
- "message.no-teams": "Nie stworzyłeś żadnych zespołów.",
- "message.no-users": "Nie ma żadnych użytkowników.",
- "message.no-websites-configured": "Nie masz skonfigurowanych żadnych witryn internetowych.",
- "message.page-not-found": "Strona nie znaleziona.",
- "message.reset-website": "Aby zresetować tę witrynę, wpisz {confirmation} w polu poniżej, aby potwierdzić.",
- "message.reset-website-warning": "Wszystkie statystyki tej witryny zostaną usunięte, ale kod śledzenia pozostanie nienaruszony.",
- "message.saved": "Zapisano pomyślnie.",
- "message.share-url": "To jest publicznie udostępniany adres URL dla {target}.",
- "message.team-already-member": "Jesteś już członkiem zespołu.",
- "message.team-not-found": "Nie znaleziono zespołu.",
- "message.team-websites-info": "Strony internetowe mogą być przeglądane przez każdego członka zespołu.",
- "message.tracking-code": "Kod śledzenia",
- "message.transfer-team-website-to-user": "Czy przenieść tę witrynę do Twoje konta?",
- "message.transfer-user-website-to-team": "Wybierz zespół, do którego chcesz przenieść tę witrynę.",
- "message.transfer-website": "Przenieś własność witryny na swoje konto lub do innego zespołu.",
- "message.triggered-event": "Zdarzenie wyzwalające",
- "message.user-deleted": "Użytkownik usunięty.",
- "message.viewed-page": "Obejrzana strona",
- "message.visitor-log": "Odwiedzający z {country} używa {browser} na {os} {device}",
- "message.visitors-dropped-off": "Odpływ użytkowników"
-}
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
deleted file mode 100644
index 6e5b095ed..000000000
--- a/src/lang/pt-BR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Código de acesso",
- "label.actions": "Ações do usuário",
- "label.activity": "Registro de atividades",
- "label.add": "Adicionar",
- "label.add-description": "Adicionar descrição",
- "label.add-member": "Adicionar membro",
- "label.add-step": "Adicionar etapa",
- "label.add-website": "Adicionar site",
- "label.admin": "Administrador",
- "label.after": "Depois",
- "label.all": "Todos",
- "label.all-time": "Todos os períodos",
- "label.analytics": "Análise",
- "label.average": "Média",
- "label.back": "Voltar",
- "label.before": "Antes",
- "label.bounce-rate": "Taxa de rejeição",
- "label.breakdown": "Detalhamento",
- "label.browser": "Navegador",
- "label.browsers": "Navegadores",
- "label.cancel": "Cancelar",
- "label.change-password": "Alterar senha",
- "label.cities": "Cidades",
- "label.city": "Cidade",
- "label.clear-all": "Limpar tudo",
- "label.compare": "Compare",
- "label.confirm": "Confirmar",
- "label.confirm-password": "Confirmar senha",
- "label.contains": "Contém",
- "label.continue": "Continuar",
- "label.count": "Count",
- "label.countries": "Países",
- "label.country": "País",
- "label.create": "Criar",
- "label.create-report": "Criar relatório",
- "label.create-team": "Criar equipe",
- "label.create-user": "Criar usuário",
- "label.created": "Criado",
- "label.created-by": "Criado por",
- "label.current": "Current",
- "label.current-password": "Senha atual",
- "label.custom-range": "Período personalizado",
- "label.dashboard": "Painel",
- "label.data": "Dados",
- "label.date": "Data",
- "label.date-range": "Período",
- "label.day": "Dia",
- "label.default-date-range": "Período padrão",
- "label.delete": "Excluir",
- "label.delete-report": "Excluir relatório",
- "label.delete-team": "Excluir equipe",
- "label.delete-user": "Excluir usuário",
- "label.delete-website": "Excluir site",
- "label.description": "Descrição",
- "label.desktop": "Desktop",
- "label.details": "Detalhes",
- "label.device": "Dispositivo",
- "label.devices": "Dispositivos",
- "label.dismiss": "Fechar",
- "label.does-not-contain": "Não contém",
- "label.domain": "Domínio",
- "label.dropoff": "Abandono",
- "label.edit": "Editar",
- "label.edit-dashboard": "Editar painel",
- "label.edit-member": "Editar membro",
- "label.enable-share-url": "Ativar link para compartilhar",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Evento",
- "label.event-data": "Dados do evento",
- "label.events": "Tipos de eventos",
- "label.exit": "Exit URL",
- "label.false": "Não",
- "label.field": "Campo",
- "label.fields": "Campos",
- "label.filter": "Filtro",
- "label.filter-combined": "Combinado",
- "label.filter-raw": "Bruto",
- "label.filters": "Filtros",
- "label.first-seen": "First seen",
- "label.funnel": "Funil",
- "label.funnel-description": "Entenda a taxa de conversão e abandono dos seus usuários.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Maior que",
- "label.greater-than-equals": "Maior ou igual a",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Explore seus dados em mais detalhes usando filtros",
- "label.is": "É igual a",
- "label.is-not": "Não é igual a",
- "label.is-not-set": "Não definido",
- "label.is-set": "Definido",
- "label.join": "Participar",
- "label.join-team": "Participar da equipe",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Idioma",
- "label.languages": "Idiomas",
- "label.laptop": "Notebook",
- "label.last-days": "Últimos {x} dias",
- "label.last-hours": "Últimas {x} horas",
- "label.last-months": "Últimos {x} meses",
- "label.last-seen": "Last seen",
- "label.leave": "Sair",
- "label.leave-team": "Sair da equipe",
- "label.less-than": "Menor que",
- "label.less-than-equals": "Menor ou igual a",
- "label.login": "Entrar",
- "label.logout": "Sair",
- "label.manage": "Gerenciar",
- "label.manager": "Manager",
- "label.max": "Máximo",
- "label.member": "Membro",
- "label.members": "Membros",
- "label.min": "Mínimo",
- "label.mobile": "Celular",
- "label.more": "Mais",
- "label.my-account": "Minha conta",
- "label.my-websites": "Meus sites",
- "label.name": "Nome",
- "label.new-password": "Nova senha",
- "label.none": "Nenhum",
- "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}",
- "label.ok": "OK",
- "label.os": "Sistema operacional",
- "label.overview": "Visão geral",
- "label.owner": "Proprietário",
- "label.page-of": "Página {current} de {total}",
- "label.page-views": "Visualizações de página",
- "label.pageTitle": "Título",
- "label.pages": "Páginas",
- "label.password": "Senha",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Desenvolvido por {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Perfil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Consultas",
- "label.query": "Consulta",
- "label.query-parameters": "Parâmetros da consulta",
- "label.realtime": "Tempo real",
- "label.referrer": "Referência",
- "label.referrers": "Referências",
- "label.refresh": "Atualizar",
- "label.regenerate": "Gerar novamente",
- "label.region": "Estado",
- "label.regions": "Estados",
- "label.remove": "Remover",
- "label.remove-member": "Remover membro",
- "label.reports": "Relatórios",
- "label.required": "Obrigatório",
- "label.reset": "Redefinir",
- "label.reset-website": "Redefinir dados",
- "label.retention": "Retenção",
- "label.retention-description": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Função",
- "label.run-query": "Executar consulta",
- "label.save": "Salvar",
- "label.screens": "Tamanhos de tela",
- "label.search": "Pesquisar",
- "label.select": "Selecionar",
- "label.select-date": "Selecionar data",
- "label.select-role": "Selecionar função",
- "label.select-website": "Selecionar site",
- "label.session": "Session",
- "label.sessions": "Sessões",
- "label.settings": "Configurações",
- "label.share-url": "Link para compartilhar",
- "label.single-day": "Apenas um dia",
- "label.start-step": "Start Step",
- "label.steps": "Etapas",
- "label.sum": "Soma",
- "label.tablet": "Tablet",
- "label.team": "Equipe",
- "label.team-id": "ID da equipe",
- "label.team-manager": "Team manager",
- "label.team-member": "Membro da equipe",
- "label.team-name": "Nome da equipe",
- "label.team-owner": "Proprietário da equipe",
- "label.team-view-only": "Apenas visualização da equipe",
- "label.team-websites": "Sites da equipe",
- "label.teams": "Equipes",
- "label.theme": "Tema",
- "label.this-month": "Este mês",
- "label.this-week": "Esta semana",
- "label.this-year": "Este ano",
- "label.timezone": "Fuso horário",
- "label.title": "Título",
- "label.today": "Hoje",
- "label.toggle-charts": "Alternar gráficos",
- "label.total": "Total",
- "label.total-records": "Total de registros",
- "label.tracking-code": "Código de rastreamento",
- "label.transactions": "Transactions",
- "label.transfer": "Transferir",
- "label.transfer-website": "Transferir site",
- "label.true": "Sim",
- "label.type": "Tipo",
- "label.unique": "Únicos",
- "label.unique-visitors": "Visitantes únicos",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Desconhecido",
- "label.untitled": "Sem título",
- "label.update": "Atualizar",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Usuário",
- "label.user-property": "User Property",
- "label.username": "Nome de usuário",
- "label.users": "Usuários",
- "label.utm": "UTM",
- "label.utm-description": "Acompanhe suas campanhas de publicidade através de parâmetros UTM.",
- "label.value": "Valor",
- "label.view": "Visualizar",
- "label.view-details": "Ver mais",
- "label.view-only": "Somente visualização",
- "label.views": "Visualizações",
- "label.views-per-visit": "Visualizações por visita",
- "label.visit-duration": "Tempo médio de visita",
- "label.visitors": "Visitantes",
- "label.visits": "Visitas",
- "label.website": "Site",
- "label.website-id": "ID do site",
- "label.websites": "Sites",
- "label.window": "Janela",
- "label.yesterday": "Ontem",
- "message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.",
- "message.active-users": " Atualmente {x} usuários ativos",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Tem certeza de que deseja excluir {target}?",
- "message.confirm-leave": "Tem certeza de que deseja sair de {target}?",
- "message.confirm-remove": "Tem certeza que deseja remover {target}?",
- "message.confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?",
- "message.delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.",
- "message.delete-website-warning": "Todos os dados relacionados serão excluídos.",
- "message.error": "Ocorreu um erro.",
- "message.event-log": "{event} em {url}",
- "message.go-to-settings": "Ir para as configurações",
- "message.incorrect-username-password": "Nome de usuário ou senha incorretos.",
- "message.invalid-domain": "Domínio inválido",
- "message.min-password-length": "A senha deve ter no mínimo {n} caracteres",
- "message.new-version-available": "Uma nova versão {version} do Umami está disponível!",
- "message.no-data-available": "Não há dados disponíveis.",
- "message.no-event-data": "Não há eventos disponíveis.",
- "message.no-match-password": "As senhas não coincidem.",
- "message.no-results-found": "Nenhum resultado encontrado.",
- "message.no-team-websites": "Esta equipe não possui sites.",
- "message.no-teams": "Você ainda não criou nenhuma equipe.",
- "message.no-users": "Não há usuários.",
- "message.no-websites-configured": "Você ainda não configurou nenhum site.",
- "message.page-not-found": "Página não encontrada.",
- "message.reset-website": "Se você tiver certeza de que deseja redefinir este site, digite {confirmation} na caixa de entrada abaixo para confirmar.",
- "message.reset-website-warning": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo.",
- "message.saved": "Salvo com sucesso.",
- "message.share-url": "Este é o link para compartilhar {target}.",
- "message.team-already-member": "Você já é membro desta equipe.",
- "message.team-not-found": "Equipe não encontrada.",
- "message.team-websites-info": "Qualquer membro da equipe pode visualizar os sites.",
- "message.tracking-code": "Código de rastreamento",
- "message.transfer-team-website-to-user": "Transferir este site para sua conta?",
- "message.transfer-user-website-to-team": "Selecione para qual equipe deseja transferir este site.",
- "message.transfer-website": "Transfira a propriedade do site para sua conta ou para outra equipe.",
- "message.triggered-event": "Evento disparado",
- "message.user-deleted": "Usuário excluído.",
- "message.viewed-page": "Página visualizada",
- "message.visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}.",
- "message.visitors-dropped-off": "Visitantes abandonados"
-}
diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
deleted file mode 100644
index ddc6b7261..000000000
--- a/src/lang/pt-PT.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Ações",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Adicionar website",
- "label.admin": "Administrador",
- "label.after": "After",
- "label.all": "Todos",
- "label.all-time": "Todo o tempo",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Voltar",
- "label.before": "Before",
- "label.bounce-rate": "Taxa de rejeição",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Navegadores",
- "label.cancel": "Cancelar",
- "label.change-password": "Alterar senha",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Confirmar senha",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Países",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Senha atual",
- "label.custom-range": "Intervalo personalizado",
- "label.dashboard": "Painel",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Intervalo de datas",
- "label.day": "Day",
- "label.default-date-range": "Intervalo de datas predefinido",
- "label.delete": "Eliminar",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Eliminar website",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Dispositivos",
- "label.dismiss": "Ignorar",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Domínio",
- "label.dropoff": "Dropoff",
- "label.edit": "Editar",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Ativar link de partilha",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Eventos",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combinado",
- "label.filter-raw": "Dados brutos",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Língua",
- "label.languages": "Línguas",
- "label.laptop": "Portátil",
- "label.last-days": "Últimos {x} dias",
- "label.last-hours": "Últimas {x} horas",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Iniciar sessão",
- "label.logout": "Sair",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Telemóvel",
- "label.more": "Mais",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Nome",
- "label.new-password": "Nova senha",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Proprietário",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Visualizações da página",
- "label.pageTitle": "Page title",
- "label.pages": "Páginas",
- "label.password": "Senha",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Distribuído por {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Perfil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Tempo real",
- "label.referrer": "Referrer",
- "label.referrers": "Referenciadores",
- "label.refresh": "Atualizar",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Obrigatório",
- "label.reset": "Repor",
- "label.reset-website": "Repor estatísticas",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Guardar",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Definições",
- "label.share-url": "Partilhar link",
- "label.single-day": "Dia único",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Tema",
- "label.this-month": "Este mês",
- "label.this-week": "Esta semana",
- "label.this-year": "Este ano",
- "label.timezone": "Fuso horário",
- "label.title": "Title",
- "label.today": "Hoje",
- "label.toggle-charts": "Alternar gráficos",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Código de rastreamento",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Visitantes únicos",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Desconhecido",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Nome de utilizador",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Ver detalhes",
- "label.view-only": "View only",
- "label.views": "Visualizações",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Tempo médio de visita",
- "label.visitors": "Visitantes",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Websites",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Tem a certeza que pretende eliminar {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Tem a certeza que pretende restaurar as estatísticas de {target}?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Todos os dados associados também serão eliminados.",
- "message.error": "Ocorreu um erro.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Ir para as definições",
- "message.incorrect-username-password": "Nome de utilizador/senha incorretos.",
- "message.invalid-domain": "Domínio inválido",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Sem dados disponíveis.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "As senhas não coincidem",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Não tens nenhum website configurado.",
- "message.page-not-found": "Página não encontrada.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "Todas as estatísticas deste site serão eliminadas, mas o seu código de rastreamento permanecerá intacto.",
- "message.saved": "Guardado com sucesso.",
- "message.share-url": "Este é o link de partilha público para {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Código de rastreamento",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitante de {country} a usar {browser} no {device} {os}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/ro-RO.json b/src/lang/ro-RO.json
deleted file mode 100644
index feb3dd5b3..000000000
--- a/src/lang/ro-RO.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Cod de access",
- "label.actions": "Acțiuni",
- "label.activity": "Jurnal de activități",
- "label.add": "Adaugă",
- "label.add-description": "Adaugă descriere",
- "label.add-member": "Adaugă membru",
- "label.add-step": "Adaugă pas",
- "label.add-website": "Adaugă site web",
- "label.admin": "Administrator",
- "label.after": "După",
- "label.all": "Toate",
- "label.all-time": "Pentru tot timpul",
- "label.analytics": "Analytics",
- "label.average": "Mediu",
- "label.back": "Înapoi",
- "label.before": "Înainte",
- "label.bounce-rate": "Rata de respingere",
- "label.breakdown": "Detaliat",
- "label.browser": "Browser",
- "label.browsers": "Browsere",
- "label.cancel": "Anulează",
- "label.change-password": "Schimbare parolă",
- "label.cities": "Orașe",
- "label.city": "Oraș",
- "label.clear-all": "Șterge tot",
- "label.compare": "Compară",
- "label.confirm": "Confirm",
- "label.confirm-password": "Confirmare parolă",
- "label.contains": "Conține",
- "label.continue": "Continuă",
- "label.count": "Număr",
- "label.countries": "Țări",
- "label.country": "Țară",
- "label.create": "Crează",
- "label.create-report": "Crează report",
- "label.create-team": "Crează echipă",
- "label.create-user": "Crează utilizator",
- "label.created": "Creat",
- "label.created-by": "Creat de",
- "label.current": "Curent",
- "label.current-password": "Parola curentă",
- "label.custom-range": "Interval personalizat",
- "label.dashboard": "Tablou de bord",
- "label.data": "Date",
- "label.date": "Dată",
- "label.date-range": "Interval",
- "label.day": "Zi",
- "label.default-date-range": "Interval implicit",
- "label.delete": "Șterge",
- "label.delete-report": "Șterge raport",
- "label.delete-team": "Șterge echipă",
- "label.delete-user": "Șterge utilizator",
- "label.delete-website": "Șterge site web",
- "label.description": "Descriere",
- "label.desktop": "Desktop",
- "label.details": "Detalii",
- "label.device": "Dispozitiv",
- "label.devices": "Dispozitive",
- "label.dismiss": "Renunță",
- "label.does-not-contain": "Nu conține",
- "label.domain": "Domeniu",
- "label.dropoff": "Rată de abandon",
- "label.edit": "Editare",
- "label.edit-dashboard": "Editare tablou de bord",
- "label.edit-member": "Editare membru",
- "label.enable-share-url": "Activare adresă URL de distribuire",
- "label.end-step": "Pas final",
- "label.entry": "URL de intrare",
- "label.event": "Eveniment",
- "label.event-data": "Date despre eveniment",
- "label.events": "Evenimente",
- "label.exit": "URL de ieșire",
- "label.false": "Fals",
- "label.field": "Câmp",
- "label.fields": "Câmpuri",
- "label.filter": "Filtru",
- "label.filter-combined": "Combinat",
- "label.filter-raw": "Brut",
- "label.filters": "Filtre",
- "label.first-seen": "Văzut pentru prima dată",
- "label.funnel": "Parcursul utilizatorului",
- "label.funnel-description": "Înțelege rata de conversie și rata de abandon a utilizatorilor.",
- "label.goal": "Obiectiv",
- "label.goals": "Obiective",
- "label.goals-description": "Urmărește obiectivele de vizualizări și evenimente.",
- "label.greater-than": "Mai mare decât",
- "label.greater-than-equals": "Mai mare sau egal cu",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Perspective",
- "label.insights-description": "Aprofundează datele utilizând segmente și filtre.",
- "label.is": "Este",
- "label.is-not": "Nu este",
- "label.is-not-set": "Nu este setat",
- "label.is-set": "Este setat",
- "label.join": "Alătură-te",
- "label.join-team": "Alătură-te echipei",
- "label.journey": "Traseu",
- "label.journey-description": "Înțelege cum navighează vizitatorii prin website.",
- "label.language": "Limbă",
- "label.languages": "Limbi",
- "label.laptop": "Laptop",
- "label.last-days": "Ultimele {x} zile",
- "label.last-hours": "Ultimele {x} ore",
- "label.last-months": "Ultimele {x} luni",
- "label.last-seen": "Văzut ultima dată",
- "label.leave": "Părăsește",
- "label.leave-team": "Părăsește echipa",
- "label.less-than": "Mai puțin decât",
- "label.less-than-equals": "Mai puțin sau egal cu",
- "label.login": "Autentificare",
- "label.logout": "Ieșire din cont",
- "label.manage": "Administrează",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Membru",
- "label.members": "Membri",
- "label.min": "Min",
- "label.mobile": "Mobil",
- "label.more": "Mai mult",
- "label.my-account": "Contul meu",
- "label.my-websites": "Website-ul meu",
- "label.name": "Nume",
- "label.new-password": "Parolă nouă",
- "label.none": "Niciunul",
- "label.number-of-records": "{x} {x, plural, one {înregistrare} other {înregistrări}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Vedere de ansamblu",
- "label.owner": "Titular",
- "label.page-of": "Pagina {current} din {total}",
- "label.page-views": "Vizualizări de pagină",
- "label.pageTitle": "Titlul paginii",
- "label.pages": "Pagini",
- "label.password": "Parolă",
- "label.path": "Rută",
- "label.paths": "Rute",
- "label.powered-by": "Cu sprijinul {name}",
- "label.previous": "Anterior",
- "label.previous-period": "Perioda anterioară",
- "label.previous-year": "Anul anterior",
- "label.profile": "Profil",
- "label.properties": "Proprietăți",
- "label.property": "Proprietate",
- "label.queries": "Interogări",
- "label.query": "Interogare",
- "label.query-parameters": "Parametri de interogare",
- "label.realtime": "Timp real",
- "label.referrer": "Proveniență",
- "label.referrers": "Site-uri de proveniență",
- "label.refresh": "Reîmprospătare",
- "label.regenerate": "Regenerează",
- "label.region": "Regiune",
- "label.regions": "Regiuni",
- "label.remove": "Îndepărtează",
- "label.remove-member": "Îndepărtează membru",
- "label.reports": "Rapoarte",
- "label.required": "Obligatoriu",
- "label.reset": "Resetează",
- "label.reset-website": "Resetează statisticile pentru site",
- "label.retention": "Retenție",
- "label.retention-description": "Măsoară atractivitatea site-ului tău prin urmărirea frecvenței cu care utilizatorii se întorc.",
- "label.revenue": "Venit",
- "label.revenue-description": "Urmărește venitul în timp.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rol",
- "label.run-query": "Execută interogarea",
- "label.save": "Salvează",
- "label.screens": "Ecrane",
- "label.search": "Căutare",
- "label.select": "Selectează",
- "label.select-date": "Selectează data",
- "label.select-role": "Selectează rolul",
- "label.select-website": "Selectează website",
- "label.session": "Sesiune",
- "label.sessions": "Sesiuni",
- "label.settings": "Setări",
- "label.share-url": "Partajare URL",
- "label.single-day": "O singură zi",
- "label.start-step": "Pas de început",
- "label.steps": "Pași",
- "label.sum": "Sumă",
- "label.tablet": "Tabletă",
- "label.team": "Echipă",
- "label.team-id": "ID Echipă",
- "label.team-manager": "Manager echipă",
- "label.team-member": "Membru echipă",
- "label.team-name": "Nume echipă",
- "label.team-owner": "Titular echipă",
- "label.team-view-only": "Doar vizualizare echipă",
- "label.team-websites": "Website-uri echipă",
- "label.teams": "Echipă",
- "label.theme": "Temă",
- "label.this-month": "Această lună",
- "label.this-week": "Această săptămână",
- "label.this-year": "Acest an",
- "label.timezone": "Fus orar",
- "label.title": "Titlu",
- "label.today": "Astăzi",
- "label.toggle-charts": "Schimbă graficele",
- "label.total": "Total",
- "label.total-records": "Total înregistrări",
- "label.tracking-code": "Cod de urmărire",
- "label.transactions": "Tranzacții",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "Adevărat",
- "label.type": "Tip",
- "label.unique": "Unici",
- "label.unique-visitors": "Vizitatori unici",
- "label.uniqueCustomers": "Clienți unici",
- "label.unknown": "Necunoscut",
- "label.untitled": "Fără titlu",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Utilizator",
- "label.user-property": "Proprietatea utilizatorului",
- "label.username": "Nume utilizator",
- "label.users": "Utilizatori",
- "label.utm": "UTM",
- "label.utm-description": "Urmărește campaniile tale cu parametri UTM.",
- "label.value": "Valoare",
- "label.view": "Vizualizare",
- "label.view-details": "Vizualizare detalii",
- "label.view-only": "Doar vizualizare",
- "label.views": "Vizualizări",
- "label.views-per-visit": "Vizualizări per vizită",
- "label.visit-duration": "Timp mediu de vizitare",
- "label.visitors": "Vizitatori",
- "label.visits": "Vizite",
- "label.website": "Website",
- "label.website-id": "ID Website",
- "label.websites": "Site-uri web",
- "label.window": "Fereastră",
- "label.yesterday": "Ieri",
- "message.action-confirmation": "Scrie {confirmation} în câmpul de mai jos pentru a confirma.",
- "message.active-users": "{x} {x, plural, one {vizitator activ} other {vizitatori activi}}",
- "message.collected-data": "Date colectate",
- "message.confirm-delete": "Ești sigur că vrei să ștergi {target}?",
- "message.confirm-leave": "Ești sigur că vrei să părăsești {target}?",
- "message.confirm-remove": "Ești sigur că vrei să ștergi {target}?",
- "message.confirm-reset": "Ești sigur că vrei să resetezi statisticile pentru {target}?",
- "message.delete-team-warning": "Ștergerea unei echipe va șterge și toate website-urile echipei.",
- "message.delete-website-warning": "Toate datele asociate vor fi șterse, de asemenea.",
- "message.error": "Ceva n-a mers bine.",
- "message.event-log": "{event} la {url}",
- "message.go-to-settings": "Mergi la Setări",
- "message.incorrect-username-password": "Nume utilizator / parolă incorecte.",
- "message.invalid-domain": "Domeniul nu este valid",
- "message.min-password-length": "Lungimea minimă este de {n} caractere",
- "message.new-version-available": "O nouă versiune de Umami {version} este disponibilă!",
- "message.no-data-available": "Nicio informație disponibilă.",
- "message.no-event-data": "Nu sunt disponibile date legate de eveniment.",
- "message.no-match-password": "Parolele nu se potrivesc",
- "message.no-results-found": "Nu a fost găsit niciun rezultat.",
- "message.no-team-websites": "Echipa aceasta nu are niciun website.",
- "message.no-teams": "Nu ai creat nicio echipă.",
- "message.no-users": "Nu există utilizatori.",
- "message.no-websites-configured": "Nu ai niciun site web configurat.",
- "message.page-not-found": "Pagina nu a fost găsită.",
- "message.reset-website": "Pentru a reseta acest website, scrie {confirmation} În câmpul de mai jos pentru a confirma.",
- "message.reset-website-warning": "Toate statisticile pentru acest site web vor fi șterse, dar codul de urmărire va rămâne intact.",
- "message.saved": "Salvat cu succes.",
- "message.share-url": "Aceasta este adresa URL de partajare pentru {target}.",
- "message.team-already-member": "Deja ești membru al acestei echipe.",
- "message.team-not-found": "Echipa nu a fost găsită.",
- "message.team-websites-info": "Site-urile web pot fi vizualizate de către oricare membru al echipei.",
- "message.tracking-code": "Cod de urmărire",
- "message.transfer-team-website-to-user": "Vrei să transferi acest website pe contul tău?",
- "message.transfer-user-website-to-team": "Selectează echipa căreia vrei să îi transferi site-ul.",
- "message.transfer-website": "Transferă titulatura site-ului către tine sau către o altă echipă.",
- "message.triggered-event": "Eveniment declanșat",
- "message.user-deleted": "Utilizator șters.",
- "message.viewed-page": "Pagină vizualizată",
- "message.visitor-log": "Vizitator din {country} folosind {browser} pe {os} {device}",
- "message.visitors-dropped-off": "Vizitatori care au abandonat"
-}
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
deleted file mode 100644
index 558b411a3..000000000
--- a/src/lang/ru-RU.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Код доступа",
- "label.actions": "Действия",
- "label.activity": "Журнал активности",
- "label.add": "Добавить",
- "label.add-description": "Добавить описание",
- "label.add-member": "Добавить участника",
- "label.add-step": "Добавить шаг",
- "label.add-website": "Добавить сайт",
- "label.admin": "Администратор",
- "label.after": "После",
- "label.all": "Все",
- "label.all-time": "Все время",
- "label.analytics": "Аналитика",
- "label.average": "Средний",
- "label.back": "Назад",
- "label.before": "До",
- "label.bounce-rate": "Отказы",
- "label.breakdown": "Авария",
- "label.browser": "Браузер",
- "label.browsers": "Браузеры",
- "label.cancel": "Отменить",
- "label.change-password": "Изменить пароль",
- "label.cities": "Города",
- "label.city": "Город",
- "label.clear-all": "Очистить все",
- "label.compare": "Сравнить",
- "label.confirm": "Подтвердить",
- "label.confirm-password": "Подтвердить пароль",
- "label.contains": "Содержит",
- "label.continue": "Продолжить",
- "label.count": "Считать",
- "label.countries": "Страны",
- "label.country": "Страна",
- "label.create": "Создать",
- "label.create-report": "Создать отчет",
- "label.create-team": "Создать команду",
- "label.create-user": "Создать пользователя",
- "label.created": "Создано",
- "label.created-by": "Создано",
- "label.current": "Текущий",
- "label.current-password": "Текущий пароль",
- "label.custom-range": "Другой период",
- "label.dashboard": "Информационная панель",
- "label.data": "Данные",
- "label.date": "Дата",
- "label.date-range": "Диапазон дат",
- "label.day": "День",
- "label.default-date-range": "Диапазон дат по-умолчанию",
- "label.delete": "Удалить",
- "label.delete-report": "Удалить отчет",
- "label.delete-team": "Удалить команду",
- "label.delete-user": "Удалить пользователя",
- "label.delete-website": "Удалить сайт",
- "label.description": "Описание",
- "label.desktop": "Настольный компьютер",
- "label.details": "Подробности",
- "label.device": "Устройство",
- "label.devices": "Устройства",
- "label.dismiss": "Отклонить",
- "label.does-not-contain": "Не содержит",
- "label.domain": "Домен",
- "label.dropoff": "Высадка",
- "label.edit": "Изменить",
- "label.edit-dashboard": "Редактировать дашборд",
- "label.edit-member": "Редактировать участника",
- "label.enable-share-url": "Разрешить делиться ссылкой",
- "label.end-step": "Конечный шаг",
- "label.entry": "URL-адрес входа",
- "label.event": "Событие",
- "label.event-data": "Данные о событии",
- "label.events": "События",
- "label.exit": "URL-адрес выхода",
- "label.false": "Ложь",
- "label.field": "Поле",
- "label.fields": "Поля",
- "label.filter": "Фильтр",
- "label.filter-combined": "Объединенные",
- "label.filter-raw": "Сырые данные",
- "label.filters": "Фильтры",
- "label.first-seen": "Первый вход",
- "label.funnel": "Воронка",
- "label.funnel-description": "Изучите коэффициент конверсии и ухода пользователей.",
- "label.goal": "Цель",
- "label.goals": "Цели",
- "label.goals-description": "Отслеживайте свои цели по просмотрам страниц и событиям.",
- "label.greater-than": "Больше, чем",
- "label.greater-than-equals": "Больше или равно",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Информация",
- "label.insights-description": "Погрузитесь глубже в свои данные с помощью сегментов и фильтров.",
- "label.is": "Является",
- "label.is-not": "Не установлен",
- "label.is-not-set": "Не установлено",
- "label.is-set": "Установлен",
- "label.join": "Присоединиться",
- "label.join-team": "Присоединиться к команде",
- "label.journey": "Journey",
- "label.journey-description": "Поймите, как пользователи перемещаются по вашему сайту.",
- "label.language": "Язык",
- "label.languages": "Языки",
- "label.laptop": "Ноутбук",
- "label.last-days": "Последние {x} дней",
- "label.last-hours": "Последние {x} часа",
- "label.last-months": "Последние {x} месяцев",
- "label.last-seen": "Последний вход",
- "label.leave": "Уйти",
- "label.leave-team": "Покинуть команду",
- "label.less-than": "Меньше, чем",
- "label.less-than-equals": "Меньше или равно",
- "label.login": "Войти",
- "label.logout": "Выйти",
- "label.manage": "Управление",
- "label.manager": "Менеджер",
- "label.max": "Максимум",
- "label.member": "Участник",
- "label.members": "Участники",
- "label.min": "Минимум",
- "label.mobile": "Смартфон",
- "label.more": "Больше",
- "label.my-account": "Мой профиль",
- "label.my-websites": "Мои сайты",
- "label.name": "Имя",
- "label.new-password": "Новый пароль",
- "label.none": "Не указано",
- "label.number-of-records": "{x} {x, plural, one {запись} other {записи}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Обзор",
- "label.owner": "Владелец",
- "label.page-of": "Страница {current} из {total}",
- "label.page-views": "Просмотры страниц",
- "label.pageTitle": "Название страницы",
- "label.pages": "Страницы",
- "label.password": "Пароль",
- "label.path": "Путь",
- "label.paths": "Пути",
- "label.powered-by": "На движке {name}",
- "label.previous": "Предыдущий",
- "label.previous-period": "Предыдущий период",
- "label.previous-year": "Предыдущий год",
- "label.profile": "Профиль",
- "label.properties": "Свойства",
- "label.property": "Свойство",
- "label.queries": "Запросы",
- "label.query": "Запрос",
- "label.query-parameters": "Параметры запроса",
- "label.realtime": "Реальное время",
- "label.referrer": "Реферер",
- "label.referrers": "Источники",
- "label.refresh": "Обновить",
- "label.regenerate": "Обновить",
- "label.region": "Регион",
- "label.regions": "Регионы",
- "label.remove": "Удалить",
- "label.remove-member": "Удалить участника",
- "label.reports": "Отчеты",
- "label.required": "Обязательное",
- "label.reset": "Сбросить",
- "label.reset-website": "Сбросить статистику",
- "label.retention": "Удержание",
- "label.retention-description": "Измерьте «прилипаемость» вашего сайта, отслеживая, как часто пользователи возвращаются на него.",
- "label.revenue": "Выручка",
- "label.revenue-description": "Изучите свои доходы за определенное время.",
- "label.revenue-property": "Доходная недвижимость",
- "label.role": "Роль",
- "label.run-query": "Выполнить запрос",
- "label.save": "Сохранить",
- "label.screens": "Экраны",
- "label.search": "Поиск",
- "label.select": "Выберите",
- "label.select-date": "Выберите дату",
- "label.select-role": "Выберите роль",
- "label.select-website": "Выбрать сайт",
- "label.session": "Сессия",
- "label.sessions": "Сессии",
- "label.settings": "Настройки",
- "label.share-url": "Поделиться ссылкой",
- "label.single-day": "Один день",
- "label.start-step": "Начальный этап",
- "label.steps": "Шаги",
- "label.sum": "Сумма",
- "label.tablet": "Планшет",
- "label.team": "Команда",
- "label.team-id": "ID команды",
- "label.team-manager": "Менеджер команды",
- "label.team-member": "Член команды",
- "label.team-name": "Название команды",
- "label.team-owner": "Владелец команды",
- "label.team-view-only": "Только командный просмотр",
- "label.team-websites": "Веб-сайты команды",
- "label.teams": "Команды",
- "label.theme": "Тема",
- "label.this-month": "Этот месяц",
- "label.this-week": "Эта неделя",
- "label.this-year": "Этот год",
- "label.timezone": "Часовой пояс",
- "label.title": "Заголовок",
- "label.today": "Сегодня",
- "label.toggle-charts": "Показать/скрыть графики",
- "label.total": "Всего",
- "label.total-records": "Всего записей",
- "label.tracking-code": "Код отслеживания",
- "label.transactions": "Транзакции",
- "label.transfer": "Передача",
- "label.transfer-website": "Передать сайт",
- "label.true": "Правда",
- "label.type": "Тип",
- "label.unique": "Уникальный",
- "label.unique-visitors": "Уникальные посетители",
- "label.uniqueCustomers": "Уникальные клиенты",
- "label.unknown": "Неизвестно",
- "label.untitled": "Без названия",
- "label.update": "Обновление",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Пользователь",
- "label.user-property": "Собственность пользователя",
- "label.username": "Имя пользователя",
- "label.users": "Пользователи",
- "label.utm": "UTM",
- "label.utm-description": "Отслеживайте свои кампании с помощью UTM-параметров.",
- "label.value": "Значение",
- "label.view": "Просмотреть",
- "label.view-details": "Посмотреть детали",
- "label.view-only": "Только просмотр",
- "label.views": "Просмотры",
- "label.views-per-visit": "Просмотров за посещение",
- "label.visit-duration": "Среднее время посещения",
- "label.visitors": "Посетители",
- "label.visits": "Посещения",
- "label.website": "Сайт",
- "label.website-id": "ID сайта",
- "label.websites": "Сайты",
- "label.window": "Окно",
- "label.yesterday": "Вчера",
- "message.action-confirmation": "Введите {confirmation} в поле ниже, чтобы подтвердить.",
- "message.active-users": "{x} текущих посетителей",
- "message.collected-data": "Собранные данные",
- "message.confirm-delete": "Вы уверены, что хотите удалить {target}?",
- "message.confirm-leave": "Вы уверены, что хотите уйти {target}?",
- "message.confirm-remove": "Вы уверены, что хотите удалить {target}?",
- "message.confirm-reset": "Вы уверены, что хотите сбросить статистику {target}?",
- "message.delete-team-warning": "При удалении команды будут удалены и все ее веб-сайты.",
- "message.delete-website-warning": "Все связанные данные будут также удалены.",
- "message.error": "Что-то пошло не так.",
- "message.event-log": "{event} на {url}",
- "message.go-to-settings": "Перейти к настройкам",
- "message.incorrect-username-password": "Неверное имя пользователя/пароль.",
- "message.invalid-domain": "Некорректный домен",
- "message.min-password-length": "Минимальная длина {n} символов",
- "message.new-version-available": "Вышла новая версия Umami {version}!",
- "message.no-data-available": "Нет данных.",
- "message.no-event-data": "Данные о событиях отсутствуют.",
- "message.no-match-password": "Пароли не совпадают",
- "message.no-results-found": "Результаты не найдены.",
- "message.no-team-websites": "У этой команды нет ни одного сайта.",
- "message.no-teams": "Вы не создали ни одной команды.",
- "message.no-users": "Нет пользователей.",
- "message.no-websites-configured": "У вас нет настроенных сайтов.",
- "message.page-not-found": "Страница не найдена.",
- "message.reset-website": "Для сброса введите RESET",
- "message.reset-website-warning": "Вся статистика для этого сайта будет удалена, но ваш код отслеживания останется нетронутым.",
- "message.saved": "Успешно сохранено.",
- "message.share-url": "Это публичная ссылка для {target}.",
- "message.team-already-member": "Вы уже состоите в команде.",
- "message.team-not-found": "Команда не найдена.",
- "message.team-websites-info": "Сайты могут просматривать все члены команды.",
- "message.tracking-code": "Код отслеживания",
- "message.transfer-team-website-to-user": "Перенести этот сайт в свой прфоиль?",
- "message.transfer-user-website-to-team": "Выберите команду, которой нужно передать этот сайт.",
- "message.transfer-website": "Передайте право владения сайтом своей учетной записи или другой команде.",
- "message.triggered-event": "Запущенное событие",
- "message.user-deleted": "Пользователь удален.",
- "message.viewed-page": "Просмотренная страница",
- "message.visitor-log": "Посетитель из {country} используя {browser} на {os} {device}",
- "message.visitors-dropped-off": "Высадка посетителей"
-}
diff --git a/src/lang/si-LK.json b/src/lang/si-LK.json
deleted file mode 100644
index 46dab6b30..000000000
--- a/src/lang/si-LK.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Actions",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "වෙබ් අඩවිය එක් කරන්න",
- "label.admin": "Administrator",
- "label.after": "After",
- "label.all": "සියල්ල",
- "label.all-time": "හැම වෙලාවෙම",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "ආපසු",
- "label.before": "Before",
- "label.bounce-rate": "Bounce rate",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Browsers",
- "label.cancel": "අවලංගු කරන්න",
- "label.change-password": "මුරපදය වෙනස් කරන්න",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "මුරපදය සත්යාපනය කරන්න",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Countries",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "වත්මන් මුරපදය",
- "label.custom-range": "අභිරුචි පරාසය",
- "label.dashboard": "උපකරණ පුවරුව",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "දින පරාසය",
- "label.day": "Day",
- "label.default-date-range": "පෙරනිමි දින පරාසය",
- "label.delete": "මකන්න",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "වෙබ් අඩවිය මකන්න",
- "label.description": "Description",
- "label.desktop": "Desktop",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Devices",
- "label.dismiss": "මගහරින්න",
- "label.does-not-contain": "Does not contain",
- "label.domain": "වසම",
- "label.dropoff": "Dropoff",
- "label.edit": "සංස්කරණය කරන්න",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "බෙදාගැනීමේ URL සබල කරන්න",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "සිදුවීම් දත්ත",
- "label.events": "Events",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Combined",
- "label.filter-raw": "Raw",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "භාෂාව",
- "label.languages": "Languages",
- "label.laptop": "Laptop",
- "label.last-days": "අන්තිම {x} දින",
- "label.last-hours": "අන්තිම {x} පැය",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "ලොග් වෙන්න",
- "label.logout": "පිටවීම",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobile",
- "label.more": "තවත්",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "නම",
- "label.new-password": "අලුත් මුරපදය",
- "label.none": "කිසිවක් නැත",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "හිමිකරු",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Page views",
- "label.pageTitle": "Page title",
- "label.pages": "Pages",
- "label.password": "මුරපදය",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "පැතිකඩ",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "තත්ය කාල",
- "label.referrer": "Referrer",
- "label.referrers": "Referrers",
- "label.refresh": "නැවුම් කරන්න",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "අවශ්යයි",
- "label.reset": "යළි පිහිටුවන්න",
- "label.reset-website": "සංඛ්යා ලේඛන නැවත සකසන්න",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "සුරකින්න",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "සැකසුම්",
- "label.share-url": "බෙදාගැනීමේ URL",
- "label.single-day": "තනි දවස",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "තේමාව",
- "label.this-month": "මෙ මාසය",
- "label.this-week": "මේ සතිය",
- "label.this-year": "මේ අවුරුද්ද",
- "label.timezone": "වේලා කලාපය",
- "label.title": "Title",
- "label.today": "අද",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "ලුහුබැඳීමේ කේතය",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Unique visitors",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "නොදනී",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "පරිශීලක නාමය",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "තොරතුරු පෙන්වන්න",
- "label.view-only": "View only",
- "label.views": "Views",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Visitors",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "වෙබ් අඩවි",
- "label.window": "Window",
- "label.yesterday": "ඊයේ",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} දැන් {x, plural, one {අමුත්තා} other {අමුත්තන්}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "{target} මකා දැමීම ගැන විශ්වාසද?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "{target} ට අදාල සංඛ්යාලේඛන නැවත පිහිටුවීමට අවශ්යද?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All website data will be deleted.",
- "message.error": "Something went wrong.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "සැකසීම් වෙත යන්න",
- "message.incorrect-username-password": "වැරදි පරිශීලක නාමය/මුරපදය.",
- "message.invalid-domain": "Invalid domain. Do not include http/https.",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "පෙන්වීමට දත්ත නොමැත.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Passwords do not match.",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "You do not have any websites configured.",
- "message.page-not-found": "පිටුව හමු නොවීය.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your settings will remain intact.",
- "message.saved": "Saved.",
- "message.share-url": "මේ {target} සඳහා ප්රසිද්ධියේ බෙදාගත් URL එකයි.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "To track stats for this website, place the following code in the ... section of your HTML.",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Visitor from {country} using {browser} on {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/sk-SK.json b/src/lang/sk-SK.json
deleted file mode 100644
index 2a02b5c74..000000000
--- a/src/lang/sk-SK.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "Akcie",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Pridať web",
- "label.admin": "Administrátor",
- "label.after": "After",
- "label.all": "Všetko",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "Späť",
- "label.before": "Before",
- "label.bounce-rate": "Okamžité opustenie",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "Prehliadač",
- "label.cancel": "Zrušiť",
- "label.change-password": "Zmeniť heslo",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "Potvrdiť heslo",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "Zem",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Aktuálne heslo",
- "label.custom-range": "Vlastný rozsah",
- "label.dashboard": "Prehlad",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "Obdobie",
- "label.day": "Day",
- "label.default-date-range": "Predvolené obdobie",
- "label.delete": "Zmazať",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "Zmazať web",
- "label.description": "Description",
- "label.desktop": "Stolný počítač",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "Zariadenie",
- "label.dismiss": "Odísť",
- "label.does-not-contain": "Does not contain",
- "label.domain": "Doména",
- "label.dropoff": "Dropoff",
- "label.edit": "Upraviť",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Povoliť zdielanie URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "Udalosti",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "Kombinácie",
- "label.filter-raw": "Nezpracované",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "Prenosný počítač",
- "label.last-days": "Posledných {x} dní",
- "label.last-hours": "Posledných {x} hodín",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "Prihlásiť",
- "label.logout": "Odhlásiť",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "Mobilný telefon",
- "label.more": "Viac",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "Meno",
- "label.new-password": "Nové heslo",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "Zobrazenie stánok",
- "label.pageTitle": "Page title",
- "label.pages": "Stránky",
- "label.password": "Heslo",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Powered by {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "Aktuálne",
- "label.referrer": "Referrer",
- "label.referrers": "Odkazy",
- "label.refresh": "Obnoviť",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "Povinné",
- "label.reset": "Reset",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "Uložiť",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Nastavenia",
- "label.share-url": "Zdielanie URL",
- "label.single-day": "Jeden deň",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "Tablet",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "Tento mesiac",
- "label.this-week": "Tento týždeň",
- "label.this-year": "Tento rok",
- "label.timezone": "Časová zóna",
- "label.title": "Title",
- "label.today": "Dnes",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "Sledovací kód",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "Jedinečné návštevy",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Neznámý",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "Užívateľské meno",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "Zobraziť detaily",
- "label.view-only": "View only",
- "label.views": "Zobrazení",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Priemerný čas návštevy",
- "label.visitors": "Návštevy",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "Weby",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} aktuálne {x, plural, one {návštevník} other {návštěvníci}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Naozaj zmazať {target}?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "Všetky príbuzné data budu tiež zmazané.",
- "message.error": "Niečo sa pokazilo.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Ísť do nastavení",
- "message.incorrect-username-password": "Nesprávné meno/heslo.",
- "message.invalid-domain": "Neplatná doména",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "Žiadne data.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "Hesla se nezhodujú",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "Nemáte nastavený žiadny web.",
- "message.page-not-found": "Stránka sa nenašla.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "Úspešne uložené.",
- "message.share-url": "Toto je zdielané URL pre {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "Sledovací kód",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Návštevník z {country} s prehliadačom {browser} na {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
deleted file mode 100644
index 9113aa45f..000000000
--- a/src/lang/sl-SI.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Koda za dostop",
- "label.actions": "Dejanja",
- "label.activity": "Dnevnik dejavnosti",
- "label.add": "Dodaj",
- "label.add-description": "Dodaj opis",
- "label.add-member": "Dodaj člana",
- "label.add-step": "Dodaj korak",
- "label.add-website": "Dodaj spletno mesto",
- "label.admin": "Administrator",
- "label.after": "Po",
- "label.all": "Vsi",
- "label.all-time": "Ves čas",
- "label.analytics": "Analitika",
- "label.average": "Povprečno",
- "label.back": "Nazaj",
- "label.before": "Pred",
- "label.bounce-rate": "Odbojna stopnja",
- "label.breakdown": "Razčlenitev",
- "label.browser": "Brskalnik",
- "label.browsers": "Brskalniki",
- "label.cancel": "Prekliči",
- "label.change-password": "Zamenjaj geslo",
- "label.cities": "Mesta",
- "label.city": "Mesto",
- "label.clear-all": "Počisti vse",
- "label.compare": "Primerjaj",
- "label.confirm": "Potrdi",
- "label.confirm-password": "Potrdi geslo",
- "label.contains": "Vsebuje",
- "label.continue": "Nadaljuj",
- "label.count": "Število",
- "label.countries": "Države",
- "label.country": "Država",
- "label.create": "Ustvari",
- "label.create-report": "Ustvari poročilo",
- "label.create-team": "Ustvari ekipo",
- "label.create-user": "Ustvari uporabnika",
- "label.created": "Ustvarjeno",
- "label.created-by": "Ustvaril",
- "label.current": "Trenutno",
- "label.current-password": "Trenutno geslo",
- "label.custom-range": "Obdobje po meri",
- "label.dashboard": "Nadzorna plošča",
- "label.data": "Podatki",
- "label.date": "Datum",
- "label.date-range": "Časovno obdobje",
- "label.day": "Dan",
- "label.default-date-range": "Privzeto časovno obdobje",
- "label.delete": "Izbriši",
- "label.delete-report": "Izbriši poročilo",
- "label.delete-team": "Izbriši ekipo",
- "label.delete-user": "Izbriši uporabnika",
- "label.delete-website": "Izbriši spletno mesto",
- "label.description": "Opis",
- "label.desktop": "Namizni računalnik",
- "label.details": "Podrobnosti",
- "label.device": "Naprava",
- "label.devices": "Naprave",
- "label.dismiss": "Prezri",
- "label.does-not-contain": "Ne vsebuje",
- "label.domain": "Domena",
- "label.dropoff": "Zapustitev",
- "label.edit": "Uredi",
- "label.edit-dashboard": "Uredi nadzorno ploščo",
- "label.edit-member": "Uredi člana",
- "label.enable-share-url": "Omogoči povezavo za deljenje",
- "label.end-step": "Končni korak",
- "label.entry": "Vstopni URL",
- "label.event": "Dogodek",
- "label.event-data": "Podatki dogodka",
- "label.events": "Dogodki",
- "label.exit": "Izhodni URL",
- "label.false": "Napačno",
- "label.field": "Polje",
- "label.fields": "Polja",
- "label.filter": "Filter",
- "label.filter-combined": "Skupaj",
- "label.filter-raw": "Neobdelano",
- "label.filters": "Filtri",
- "label.first-seen": "Prvič viden",
- "label.funnel": "Prodajni lijak",
- "label.funnel-description": "Razumite stopnjo konverzije in osipa uporabnikov.",
- "label.goal": "Cilj",
- "label.goals": "Cilji",
- "label.goals-description": "Spremljajte svoje cilje za oglede strani in dogodke.",
- "label.greater-than": "Večje od",
- "label.greater-than-equals": "Večje ali enako kot",
- "label.host": "Gostitelj",
- "label.hosts": "Gostitelji",
- "label.insights": "Vpogled",
- "label.insights-description": "Poglobite se v podatke z uporabo segmentov in filtrov.",
- "label.is": "Je",
- "label.is-not": "Ni",
- "label.is-not-set": "Ni nastavljeno",
- "label.is-set": "Je nastavljeno",
- "label.join": "Pridruži se",
- "label.join-team": "Pridruži se ekipi",
- "label.journey": "Uporabniška pot",
- "label.journey-description": "Razumite, kako uporabniki krmarijo po vašem spletnem mestu.",
- "label.language": "Jezik",
- "label.languages": "Jeziki",
- "label.laptop": "Prenosni računalnik",
- "label.last-days": "Zadnjih {x} dni",
- "label.last-hours": "Zadnjih {x} ur",
- "label.last-months": "Zadnjih {x} mesecev",
- "label.last-seen": "Nazadnje viden",
- "label.leave": "Zapusti",
- "label.leave-team": "Zapusti ekipo",
- "label.less-than": "Manjše kot",
- "label.less-than-equals": "Manjše ali enako kot",
- "label.login": "Prijava",
- "label.logout": "Odjava",
- "label.manage": "Upravljaj",
- "label.manager": "Upravitelj",
- "label.max": "Največ",
- "label.member": "Član",
- "label.members": "Člani",
- "label.min": "Najmanj",
- "label.mobile": "Mobilne naprave",
- "label.more": "Več",
- "label.my-account": "Moj račun",
- "label.my-websites": "Moja spletna mesta",
- "label.name": "Ime",
- "label.new-password": "Novo geslo",
- "label.none": "Brez",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Pregled",
- "label.owner": "Lastnik",
- "label.page-of": "Stran {current} od {total}",
- "label.page-views": "Obiski strani",
- "label.pageTitle": "Naslov strani",
- "label.pages": "Strani",
- "label.password": "Geslo",
- "label.path": "Pot",
- "label.paths": "Poti",
- "label.powered-by": "Poganja {name}",
- "label.previous": "Prejšnji",
- "label.previous-period": "Prejšnje obdobje",
- "label.previous-year": "Prejšnje leto",
- "label.profile": "Profil",
- "label.properties": "Lastnosti",
- "label.property": "Lastnost",
- "label.queries": "Poizvedbe",
- "label.query": "Poizvedba",
- "label.query-parameters": "Parametri poizvedbe",
- "label.realtime": "V živo",
- "label.referrer": "Vir",
- "label.referrers": "Viri",
- "label.refresh": "Osveži",
- "label.regenerate": "Ponovno generiraj",
- "label.region": "Regija",
- "label.regions": "Regije",
- "label.remove": "Odstrani",
- "label.remove-member": "Odstrani člana",
- "label.reports": "Poročila",
- "label.required": "Zahtevano",
- "label.reset": "Ponastavi",
- "label.reset-website": "Ponastavi statistiko",
- "label.retention": "Ohranjanje uporabnikov",
- "label.retention-description": "Merite uporabnikovo zadržanost s sledenjem, kako pogosto se vračajo.",
- "label.revenue": "Prihodki",
- "label.revenue-description": "Preglejte svoje prihodke skozi čas.",
- "label.revenue-property": "Lastnost prihodkov",
- "label.role": "Vloga",
- "label.run-query": "Izvedi poizvedbo",
- "label.save": "Shrani",
- "label.screens": "Zasloni",
- "label.search": "Išči",
- "label.select": "Izberi",
- "label.select-date": "Izberi datum",
- "label.select-role": "Izberi vlogo",
- "label.select-website": "Izberi spletno mesto",
- "label.session": "Seja",
- "label.sessions": "Seje",
- "label.settings": "Nastavitve",
- "label.share-url": "Deli povezavo",
- "label.single-day": "En dan",
- "label.start-step": "Začetni korak",
- "label.steps": "Koraki",
- "label.sum": "Seštevek",
- "label.tablet": "Tablični računalnik",
- "label.team": "Ekipa",
- "label.team-id": "ID ekipe",
- "label.team-manager": "Upravitelj ekipe",
- "label.team-member": "Član ekipe",
- "label.team-name": "Ime ekipe",
- "label.team-owner": "Lastnik ekipe",
- "label.team-view-only": "Ekipa samo za ogled",
- "label.team-websites": "Spletna mesta ekipe",
- "label.teams": "Ekipe",
- "label.theme": "Tema",
- "label.this-month": "Ta mesec",
- "label.this-week": "Ta teden",
- "label.this-year": "To leto",
- "label.timezone": "Časovni pas",
- "label.title": "Naslov",
- "label.today": "Danes",
- "label.toggle-charts": "Preklopi grafe",
- "label.total": "Skupaj",
- "label.total-records": "Skupni zapisi",
- "label.tracking-code": "Koda za sledenje",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "Pravilno",
- "label.type": "Vrsta",
- "label.unique": "Unikatni",
- "label.unique-visitors": "Unikatni obiskovalci",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Neznano",
- "label.untitled": "Brez naslova",
- "label.update": "Update",
- "label.url": "Povezava",
- "label.urls": "Povezave",
- "label.user": "Uporabnik",
- "label.user-property": "User Property",
- "label.username": "Uporabniško ime",
- "label.users": "Uporabniki",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Vrednost",
- "label.view": "Poglej",
- "label.view-details": "Poglej podrobnosti",
- "label.view-only": "Samo ogledovanje",
- "label.views": "Obiski",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Povprečni čas obiska",
- "label.visitors": "Obiskovalci",
- "label.visits": "Visits",
- "label.website": "Spletno mesto",
- "label.website-id": "ID spletnega mesta",
- "label.websites": "Spletna mesta",
- "label.window": "Okno",
- "label.yesterday": "Včeraj",
- "message.action-confirmation": "Za potrditev v spodnje polje vnesite {confirmation}.",
- "message.active-users": "{x} trenutni {x, plural, one {obiskovalec} other {obiskovalcev}}",
- "message.collected-data": "Zbrani podatki",
- "message.confirm-delete": "Ste prepričani, da želite izbrisati {target}?",
- "message.confirm-leave": "Ste prepričani, da želite zapustiti {target}?",
- "message.confirm-remove": "Ali ste prepričani, da želite odstraniti {target}?",
- "message.confirm-reset": "Ste prepričani, da želite ponastaviti statistiko {target}?",
- "message.delete-team-warning": "Brisanje ekipe bo izbrisalo tudi vsa spletna mesta ekipe.",
- "message.delete-website-warning": "Izbrisani bodo tudi vsi pripadajoči podatki.",
- "message.error": "Nekaj je šlo narobe.",
- "message.event-log": "{event} na {url}",
- "message.go-to-settings": "Pojdi v nastavitve",
- "message.incorrect-username-password": "Nepravilno uporabniško ime/geslo.",
- "message.invalid-domain": "Neveljavna domena",
- "message.min-password-length": "Najmanjša dolžina je {n} znakov",
- "message.new-version-available": "Na voljo je nova verzija programa Umami {version}!",
- "message.no-data-available": "Podatki niso na voljo.",
- "message.no-event-data": "Podatki o dogodku niso na voljo.",
- "message.no-match-password": "Gesli se ne ujemata",
- "message.no-results-found": "Rezultatov ni bilo mogoče najti.",
- "message.no-team-websites": "Ta ekipa nima spletnih mest.",
- "message.no-teams": "Niste še ustvarili nobene ekipe.",
- "message.no-users": "Ni uporabnikov.",
- "message.no-websites-configured": "Nimate nastavljenih nobenih spletnih mest.",
- "message.page-not-found": "Stran ni bila najdena.",
- "message.reset-website": "Za ponastavitev izbrisa tega spletnega mesta vnesite {confirmation} v spodnje polje.",
- "message.reset-website-warning": "Vse statistike za to spletno mesto bodo izbrisane, koda za sledenje pa bo ostala nespremenjena.",
- "message.saved": "Uspešno shranjeno.",
- "message.share-url": "To je javno dostopna povezava za {target}.",
- "message.team-already-member": "Ste že član ekipe.",
- "message.team-not-found": "Ekipa ni bila najdena.",
- "message.team-websites-info": "Spletne strani si lahko ogleda vsak član ekipe.",
- "message.tracking-code": "Koda za sledenje",
- "message.transfer-team-website-to-user": "Želite prenesti to spletno mesto v svoj račun?",
- "message.transfer-user-website-to-team": "Izberite ekipo, na katero želite prenesti to spletno mesto.",
- "message.transfer-website": "Prenesite lastništvo spletnega mesta na svoj račun ali drugo ekipo.",
- "message.triggered-event": "Sprožen dogodek",
- "message.user-deleted": "Uporabnik je izbrisan.",
- "message.viewed-page": "Ogledana stran",
- "message.visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device}",
- "message.visitors-dropped-off": "Osip obiskovalcev"
-}
diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json
deleted file mode 100644
index cdaa676af..000000000
--- a/src/lang/sv-SE.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Åtkomstkod",
- "label.actions": "Händelser",
- "label.activity": "Aktivitetslogg",
- "label.add": "Lägg till",
- "label.add-description": "Lägg till beskrivning",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "Lägg till webbplats",
- "label.admin": "Administratör",
- "label.after": "Efter",
- "label.all": "Alla",
- "label.all-time": "Sedan början",
- "label.analytics": "Webbplats Analys",
- "label.average": "Genomsnitt",
- "label.back": "Tillbaka",
- "label.before": "Före",
- "label.bounce-rate": "Avvisningsfrekvens",
- "label.breakdown": "Analys",
- "label.browser": "Webbläsare",
- "label.browsers": "Webbläsare",
- "label.cancel": "Avbryt",
- "label.change-password": "Byt lösenord",
- "label.cities": "Städer",
- "label.city": "Stad",
- "label.clear-all": "Rensa alla",
- "label.compare": "Compare",
- "label.confirm": "Bekräfta",
- "label.confirm-password": "Bekräfta lösenord",
- "label.contains": "Innehåller",
- "label.continue": "Fortsätt",
- "label.count": "Count",
- "label.countries": "Länder",
- "label.country": "Land",
- "label.create": "Skapa",
- "label.create-report": "Skapa rapport",
- "label.create-team": "Skapa team",
- "label.create-user": "Skapa användare",
- "label.created": "Skapad",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "Nuvarande lösenord",
- "label.custom-range": "Anpassat urval",
- "label.dashboard": "Översikt",
- "label.data": "Data",
- "label.date": "Datum",
- "label.date-range": "Tidsperiod",
- "label.day": "Dag",
- "label.default-date-range": "Standard datum-urval",
- "label.delete": "Radera",
- "label.delete-report": "Delete report",
- "label.delete-team": "Radera team",
- "label.delete-user": "Radera användare",
- "label.delete-website": "Radera webbplats",
- "label.description": "Beskrivning",
- "label.desktop": "Stationär",
- "label.details": "Detaljer",
- "label.device": "Enhet",
- "label.devices": "Enheter",
- "label.dismiss": "Avbryt",
- "label.does-not-contain": "Innehåller inte",
- "label.domain": "Domän",
- "label.dropoff": "Bortfall",
- "label.edit": "Redigera",
- "label.edit-dashboard": "Redigera översikt",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Aktivera delningslänk",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Händelse",
- "label.event-data": "Händelsedata",
- "label.events": "Händelser",
- "label.exit": "Exit URL",
- "label.false": "Falskt",
- "label.field": "Fält",
- "label.fields": "Fältar",
- "label.filter": "Filter",
- "label.filter-combined": "Kombinerade",
- "label.filter-raw": "Rådata",
- "label.filters": "Filter",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Förstå omvandlingen och bortfallsfrekvensen för användare.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Större än",
- "label.greater-than-equals": "Större än eller lika med",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insikter",
- "label.insights-description": "Dyk djupare in i din data genom att använda olika segment och filter.",
- "label.is": "Är",
- "label.is-not": "Är inte",
- "label.is-not-set": "Är inte inställd",
- "label.is-set": "Är inställd",
- "label.join": "Gå med",
- "label.join-team": "Gå med i team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Språk",
- "label.languages": "Språk",
- "label.laptop": "Bärbar",
- "label.last-days": "Senaste {x} dagarna",
- "label.last-hours": "Senaste {x} timmarna",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Lämna",
- "label.leave-team": "Lämna team",
- "label.less-than": "Mindre än",
- "label.less-than-equals": "Mindre än eller lika med",
- "label.login": "Logga in",
- "label.logout": "Logga ut",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Medlemmar",
- "label.min": "Min",
- "label.mobile": "Mobil",
- "label.more": "Mer",
- "label.my-account": "My account",
- "label.my-websites": "Mina webbplatser",
- "label.name": "Namn",
- "label.new-password": "Nytt lösenord",
- "label.none": "Inga",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "Operativsystem",
- "label.overview": "Översikt",
- "label.owner": "Ägare",
- "label.page-of": "Sida {current} av {total}",
- "label.page-views": "Sidvisningar",
- "label.pageTitle": "Sidtitel",
- "label.pages": "Sidor",
- "label.password": "Lösenord",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Drivs av {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Frågor",
- "label.query": "Fråga",
- "label.query-parameters": "Frågeparametrar",
- "label.realtime": "Realtid",
- "label.referrer": "Hänvisare",
- "label.referrers": "Hänvisare",
- "label.refresh": "Uppdatera",
- "label.regenerate": "Förnya",
- "label.region": "Region",
- "label.regions": "Regioner",
- "label.remove": "Ta bort",
- "label.remove-member": "Remove member",
- "label.reports": "Rapporter",
- "label.required": "Krävs",
- "label.reset": "Återställ",
- "label.reset-website": "Återställ webbplats",
- "label.retention": "Retention",
- "label.retention-description": "Mät din webbplats engagemang genom att följa hur ofta användare återvänder.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Roll",
- "label.run-query": "Kör sökning",
- "label.save": "Spara",
- "label.screens": "Upplösning",
- "label.search": "Sök",
- "label.select": "Select",
- "label.select-date": "Välj datum",
- "label.select-role": "Select role",
- "label.select-website": "Välj webbplats",
- "label.session": "Session",
- "label.sessions": "Sessioner",
- "label.settings": "Inställningar",
- "label.share-url": "Delningslänk",
- "label.single-day": "En dag",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Summa",
- "label.tablet": "Surfplatta",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team-medlem",
- "label.team-name": "Team namn",
- "label.team-owner": "Team-ägare",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team webbplatser",
- "label.teams": "Team",
- "label.theme": "Tema",
- "label.this-month": "Denna månad",
- "label.this-week": "Denna vecka",
- "label.this-year": "Detta år",
- "label.timezone": "Tidszon",
- "label.title": "Titel",
- "label.today": "Idag",
- "label.toggle-charts": "Visa/göm grafer",
- "label.total": "Totalt",
- "label.total-records": "Totala poster",
- "label.tracking-code": "Spårningskod",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "Sant",
- "label.type": "Typ",
- "label.unique": "Unikt",
- "label.unique-visitors": "Unika besökare",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Okänt",
- "label.untitled": "Namnlös",
- "label.update": "Update",
- "label.url": "Länk",
- "label.urls": "Länkar",
- "label.user": "Användare",
- "label.user-property": "User Property",
- "label.username": "Användarnamn",
- "label.users": "Användare",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Värde",
- "label.view": "Visa",
- "label.view-details": "Visa detaljer",
- "label.view-only": "Endast visning",
- "label.views": "Visningar",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "Genomsnittlig besökstid",
- "label.visitors": "Besökare",
- "label.visits": "Visits",
- "label.website": "Webbplats",
- "label.website-id": "Webbplats ID",
- "label.websites": "Webbplatser",
- "label.window": "Fönster",
- "label.yesterday": "Igår",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} {x, plural, one {besökare} other {besökare}} just nu",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Är du säker på att du vill radera {target}?",
- "message.confirm-leave": "Är du säker på att du vill lämna {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Är du säker på att du vill återställa statistiken för {target}?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "All tillhörande data kommer också att raderas.",
- "message.error": "Något gick fel.",
- "message.event-log": "{event} på {url}",
- "message.go-to-settings": "Gå till inställningar",
- "message.incorrect-username-password": "Felaktigt användarnamn/lösenord.",
- "message.invalid-domain": "Ogiltig domän",
- "message.min-password-length": "Minst {n} tecken",
- "message.new-version-available": "En ny version av Umami {version} är tillgänglig!",
- "message.no-data-available": "Ingen data tillgänglig.",
- "message.no-event-data": "Ingen händelsedata är tillgänglig.",
- "message.no-match-password": "Lösenorden matchar inte",
- "message.no-results-found": "Inga resultat hittades.",
- "message.no-team-websites": "Det här teamet har inga webbplatser.",
- "message.no-teams": "Du har inte skapat några team.",
- "message.no-users": "Det finns inga användare.",
- "message.no-websites-configured": "Du har inte konfigurerat några webbplatser.",
- "message.page-not-found": "Sidan kunde inte hittas.",
- "message.reset-website": "För att återställa webbplatsen, skriv {confirmation} i rutan nedan.",
- "message.reset-website-warning": "All statistik för webbplatsen tas bort, men spårningskoden förblir oförändrad.",
- "message.saved": "Sparat!",
- "message.share-url": "Det här är den offentliga delningslänken för {target}.",
- "message.team-already-member": "Du är redan medlem i teamet.",
- "message.team-not-found": "Teamet kunde inte hittas.",
- "message.team-websites-info": "Webbplatserna kan ses av alla i teamet.",
- "message.tracking-code": "Spårningskod",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "Användaren har raderats.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "Besökare från {country} med {browser} på {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/ta-IN.json b/src/lang/ta-IN.json
deleted file mode 100644
index 1e4466b52..000000000
--- a/src/lang/ta-IN.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "செயல்கள்",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "வலைத்தளத்தைச் சேர்க்க",
- "label.admin": "நிர்வாகியைச் சேர்க்க",
- "label.after": "After",
- "label.all": "எல்லாம்",
- "label.all-time": "All time",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "பின்னால்",
- "label.before": "Before",
- "label.bounce-rate": "துள்ளல் விகிதம்",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "உலாவிகள்",
- "label.cancel": "ரத்துசெய்",
- "label.change-password": "கடவுச்சொல்லை மாற்று",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "நாடுகள்",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "தற்போதைய கடவுச்சொல்",
- "label.custom-range": "தனிப்பயன் வேறுபாட்டெல்லை",
- "label.dashboard": "முகப்பு",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "தேதி வரம்பு",
- "label.day": "Day",
- "label.default-date-range": "இயல்புநிலை தேதி வரம்பு",
- "label.delete": "அழி",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "வலைத்தளத்தை நீக்கு",
- "label.description": "Description",
- "label.desktop": "மேசை கணினி",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "சாதனங்கள்",
- "label.dismiss": "நீக்கு",
- "label.does-not-contain": "Does not contain",
- "label.domain": "கள முகவரி",
- "label.dropoff": "Dropoff",
- "label.edit": "திருத்துதல்",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "கள முகவரியை பகிரலாம்",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "நிகழ்வுகள்",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "ஒருங்கிணைந்த",
- "label.filter-raw": "மூல",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "Languages",
- "label.laptop": "மடிக்கணினி",
- "label.last-days": "முந்தைய {x} நாட்கள்",
- "label.last-hours": "முந்தைய {x} மணி",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "உள்நுழைய",
- "label.logout": "வெளியேறு",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "கைபேசி",
- "label.more": "மேலும்",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "பெயர்",
- "label.new-password": "புதிய கடவுச்சொல்",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "Owner",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "பக்க காட்சிகள்",
- "label.pageTitle": "Page title",
- "label.pages": "பக்கங்கள்",
- "label.password": "கடவுச்சொல்",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "{name} ஆல் இயக்கப்படுகிறது",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "சுயவிவரம்",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "தற்போதைய",
- "label.referrer": "Referrer",
- "label.referrers": "குறிப்பிடுவோர்",
- "label.refresh": "புதுப்பிப்பு",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "தேவையானவை",
- "label.reset": "மீட்டமை",
- "label.reset-website": "Reset statistics",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "சேமி",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "அமைப்புகள்",
- "label.share-url": "வலைத்தள களத்தைப் பகிரவும்",
- "label.single-day": "ஒரு நாள்",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "கையடக்க கணினி",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "இந்த மாதம்",
- "label.this-week": "இந்த வாரம்",
- "label.this-year": "இந்த வருடம்",
- "label.timezone": "நேர மண்டலம்",
- "label.title": "Title",
- "label.today": "இன்று",
- "label.toggle-charts": "Toggle charts",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "கண்காணிப்பு குறியீடு",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "தனிப்பட்ட பார்வையாளர்கள்",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "தெரியாத",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "பயனர்பெயர்",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "விபரங்களை பார்",
- "label.view-only": "View only",
- "label.views": "பார்வைகள்",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "சராசரி வருகை நேரம்",
- "label.visitors": "பார்வையாளர்கள்",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "வலைத்தளங்கள்",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} தற்போதைய {x, plural, one {ஒன்று} other {மற்ற}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "நீங்கள் நிச்சயமாக {target} நீக்க விரும்புகிறீர்களா?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "தொடர்புடைய எல்லா தரவும் நீக்கப்படும்.",
- "message.error": "ஏதோ தவறு நடந்துவிட்டது.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "அமைப்புகளுக்குச் செல்லவும்",
- "message.incorrect-username-password": "தவறான பயனர்பெயர் / கடவுச்சொல்.",
- "message.invalid-domain": "தவறான கள முகவரி",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "தரவு எதுவும் கிடைக்கவில்லை.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "இருக்கடவுச்சொல் பொருந்தவில்லை",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "உங்களிடம் எந்த வலைத்தளங்களும் கட்டமைக்கப்படவில்லை.",
- "message.page-not-found": "பக்கம் கிடைக்கவில்லை.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.",
- "message.saved": "வெற்றிகரமாக சேமிக்கப்பட்டது.",
- "message.share-url": "{target} இது பொதுவில் பகிரும் வலைத்தள முகவரி.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "கண்காணிப்பு குறியீடு",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "{country}வில் இருந்து பார்வையாளர் {browser} ஐ {os} {device}லில் பயன்படுத்துகிறார்",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
deleted file mode 100644
index 7cc350450..000000000
--- a/src/lang/th-TH.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "การกระทำ",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "เพิ่มเว็บไซต์",
- "label.admin": "ผู้ดูแลระบบ",
- "label.after": "After",
- "label.all": "ทั้งหมด",
- "label.all-time": "ทุกช่วงเวลา",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "ย้อนกลับ",
- "label.before": "Before",
- "label.bounce-rate": "อัตราตีกลับ",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "เบราว์เซอร์",
- "label.cancel": "ยกเลิก",
- "label.change-password": "เปลี่ยนรหัสผ่าน",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "ยืนยันรหัสผ่าน",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "ประเทศ",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "รหัสผ่านปัจจุบัน",
- "label.custom-range": "กำหนดช่วงเวลา",
- "label.dashboard": "แดชบอร์ด",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "ตั้งแต่วันที่",
- "label.day": "Day",
- "label.default-date-range": "ช่วงเวลา",
- "label.delete": "ลบ",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "ลบเว็บไซต์",
- "label.description": "Description",
- "label.desktop": "เดสก์ท็อป",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "อุปกรณ์",
- "label.dismiss": "ยกเลิก",
- "label.does-not-contain": "Does not contain",
- "label.domain": "โดเมน",
- "label.dropoff": "Dropoff",
- "label.edit": "แก้ไข",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "เปิดใช้งานการแชร์ลิงก์",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "เหตุการณ์",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "ข้อมูลรวม",
- "label.filter-raw": "ข้อมูลดิบ",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "ภาษา",
- "label.languages": "ภาษา",
- "label.laptop": "แล็ปท็อป",
- "label.last-days": "{x} วันที่ผ่านมา",
- "label.last-hours": "{x} ชั่วโมงที่ผ่านมา",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "เข้าสู่ระบบ",
- "label.logout": "ออกจากระบบ",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "โทรศัพท์มือถือ",
- "label.more": "เพิ่มเติม",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "ชื่อ",
- "label.new-password": "รหัสผ่านใหม่",
- "label.none": "ไม่ได้กำหนด",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "เจ้าของ",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "การเข้าชม",
- "label.pageTitle": "Page title",
- "label.pages": "หน้าเพจ",
- "label.password": "รหัสผ่าน",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "ขับเคลื่อนโดย {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "โปรไฟล์",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "เรียลไทม์",
- "label.referrer": "Referrer",
- "label.referrers": "แหล่งที่มา",
- "label.refresh": "รีเฟรช",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "ต้องการ",
- "label.reset": "รีเซต",
- "label.reset-website": "รีเซตข้อมูลสถิติ",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "บันทึก",
- "label.screens": "ขนาดหน้าจอ",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "ตั้งค่า",
- "label.share-url": "แชร์ลิงก์",
- "label.single-day": "วันที่",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "แท็บเล็ต",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "ธีม",
- "label.this-month": "เดือนปัจจุบัน",
- "label.this-week": "สัปดาห์ปัจจุบัน",
- "label.this-year": "ปีปัจจุบัน",
- "label.timezone": "เขตเวลา",
- "label.title": "Title",
- "label.today": "วันนี้",
- "label.toggle-charts": "เปิด/ปิดแผนภูมิ",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "โค้ดสำหรับใช้ติดตาม",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "ผู้เข้าชม",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "ไม่รู้จัก",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "ชื่อผู้ใช้",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "แสดงรายละเอียด",
- "label.view-only": "View only",
- "label.views": "การเข้าชม",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "ระยะเวลาเข้าชมเฉลี่ย",
- "label.visitors": "ผู้เข้าชม",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "เว็บไซต์",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "มีผู้ใช้งาน {x} {x, plural, one {คนในขณะนี้} other {คนในขณะนี้}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "คุณแน่ใจหรือไม่ว่าต้องการลบ {target} ?",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "คุณแน่ใจหรือไม่ว่าต้องการรีเซตข้อมูลสถิติของ {target} ?",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบ.",
- "message.error": "เกิดข้อผิดพลาด.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "ไปที่การตั้งค่า",
- "message.incorrect-username-password": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง.",
- "message.invalid-domain": "โดเมนไม่ถูกต้อง",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "ไม่มีข้อมูล.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "รหัสผ่านไม่ตรงกัน",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "คุณยังไม่ได้ตั้งค่าเว็บไซต์ใด ๆ ไว้.",
- "message.page-not-found": "ไม่พบหน้านี้.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "สถิติทั้งหมดสำหรับเว็บไซต์นี้จะถูกลบออก แต่โค้ดสำหรับใช้ติดตามของคุณจะยังคงอยู่เหมือนเดิม.",
- "message.saved": "บันทึกข้อมูลเรียบร้อย.",
- "message.share-url": "นี่คือลิงก์ที่แชร์แบบสาธารณะสำหรับ {target}.",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "โค้ดสำหรับใช้ติดตาม",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "ผู้เข้าชมจาก {country} กำลังใช้งานผ่าน {browser} บน {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
deleted file mode 100644
index 34a81f75c..000000000
--- a/src/lang/tr-TR.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Erişim Kodu",
- "label.actions": "Hareketler",
- "label.activity": "Aktivite Kaydı",
- "label.add": "Ekle",
- "label.add-description": "Açıklama ekle",
- "label.add-member": "Üye ekle",
- "label.add-step": "Adım ekle",
- "label.add-website": "Web sitesi ekle",
- "label.admin": "Administrator",
- "label.after": "Sonra",
- "label.all": "Tümü",
- "label.all-time": "Tüm zamanlar",
- "label.analytics": "Analitik",
- "label.average": "Ortalama",
- "label.back": "Geri",
- "label.before": "Önce",
- "label.bounce-rate": "Tek sayfa ziyaret oranı",
- "label.breakdown": "Dağılım",
- "label.browser": "Tarayıcı",
- "label.browsers": "Tarayıcılar",
- "label.cancel": "İptal",
- "label.change-password": "Şifre değiştir",
- "label.cities": "Şehirler",
- "label.city": "Şehir",
- "label.clear-all": "Hepsini temizle",
- "label.compare": "Compare",
- "label.confirm": "Onayla",
- "label.confirm-password": "Parolayı onayla",
- "label.contains": "İçeriği",
- "label.continue": "Devam et",
- "label.count": "Count",
- "label.countries": "Ülkeler",
- "label.country": "Ülke",
- "label.create": "Oluştur",
- "label.create-report": "Rapor oluştur",
- "label.create-team": "Takım oluştur",
- "label.create-user": "Kullanıcı oluştur",
- "label.created": "Oluşturuldu",
- "label.created-by": "Tarafından oluşturldu",
- "label.current": "Current",
- "label.current-password": "Mevcut parola",
- "label.custom-range": "Özelleştirilmiş aralık",
- "label.dashboard": "Kontrol Paneli",
- "label.data": "Veri",
- "label.date": "Tarih",
- "label.date-range": "Tarih aralığı",
- "label.day": "Gün",
- "label.default-date-range": "Varsayılan tarih aralığı",
- "label.delete": "Sil",
- "label.delete-report": "Rapor sil",
- "label.delete-team": "Takım sil",
- "label.delete-user": "Kullanıcı sil",
- "label.delete-website": "Web sitesini sil",
- "label.description": "Açıklama",
- "label.desktop": "Masaüstü",
- "label.details": "Detaylar",
- "label.device": "Cihaz",
- "label.devices": "Cihazlar",
- "label.dismiss": "Reddet",
- "label.does-not-contain": "İçermez",
- "label.domain": "Alan adı",
- "label.dropoff": "Bırakma",
- "label.edit": "Düzenle",
- "label.edit-dashboard": "Kontrol panelini düzenle",
- "label.edit-member": "Üyeyi düzenle",
- "label.enable-share-url": "Anonim paylaşım URL'i aktif",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Olay",
- "label.event-data": "Olay verisi",
- "label.events": "Olaylar",
- "label.exit": "Exit URL",
- "label.false": "Yanlış",
- "label.field": "Alan",
- "label.fields": "Alanlar",
- "label.filter": "Filtre",
- "label.filter-combined": "Birleşik filtre",
- "label.filter-raw": "Ham filtre",
- "label.filters": "Filtreler",
- "label.first-seen": "First seen",
- "label.funnel": "Huni",
- "label.funnel-description": "Kullanıcıların dönüşüm ve ayrılma oranlarını anlayın.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Büyüktür",
- "label.greater-than-equals": "Büyük veya eşittir",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Segmentleri ve filtreleri kullanarak verilerinizi derinlemesine inceleyin.",
- "label.is": "Is",
- "label.is-not": "Değil",
- "label.is-not-set": "Ayarlanmamış",
- "label.is-set": "Ayarlandı",
- "label.join": "Katıl",
- "label.join-team": "Takıma katıl",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Dil",
- "label.languages": "Diller",
- "label.laptop": "Dizüstü",
- "label.last-days": "Son {x} gün",
- "label.last-hours": "Son {x} saat",
- "label.last-months": "Son {x} ay",
- "label.last-seen": "Last seen",
- "label.leave": "Ayrıl",
- "label.leave-team": "Takımdan Ayrıl",
- "label.less-than": "Küçüktür",
- "label.less-than-equals": "Küçük veya eşittir",
- "label.login": "Giriş Yap",
- "label.logout": "Çıkış Yap",
- "label.manage": "Yönet",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Üye",
- "label.members": "Üyeler",
- "label.min": "Min",
- "label.mobile": "Mobil Cihaz",
- "label.more": "Detaylı göster",
- "label.my-account": "Hesabım",
- "label.my-websites": "Web sitelerim",
- "label.name": "İsim",
- "label.new-password": "Yeni parola",
- "label.none": "Yok",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "TAMAM",
- "label.os": "OS",
- "label.overview": "Genel bakış",
- "label.owner": "Sahibi",
- "label.page-of": "{total} sayfada {current} ",
- "label.page-views": "Sayfa görünümü",
- "label.pageTitle": "Sayfa başlığı",
- "label.pages": "Sayfalar",
- "label.password": "Parola",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "Sağlayıcı: {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Profil",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Sorgular",
- "label.query": "Sorgu",
- "label.query-parameters": "Sorgu parametreleri",
- "label.realtime": "Gerçek Zamanlı",
- "label.referrer": "Referrer",
- "label.referrers": "Yönlendirenler",
- "label.refresh": "Yenile",
- "label.regenerate": "Yeniden Oluştur",
- "label.region": "Bölge",
- "label.regions": "Bölgeler",
- "label.remove": "Kaldır",
- "label.remove-member": "Üyeyi kaldır",
- "label.reports": "Raporlar",
- "label.required": "Zorunlu alan",
- "label.reset": "Sıfırla",
- "label.reset-website": "İstatistikleri sıfırla",
- "label.retention": "Geri dönüş",
- "label.retention-description": "Kullanıcıların ne sıklıkla geri döndüğünü takip ederek web sitenizin kalıcılığını ölçün.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Rol",
- "label.run-query": "Sorgu çalıştır",
- "label.save": "Kaydet",
- "label.screens": "Ekranlar",
- "label.search": "Ara",
- "label.select": "Seç",
- "label.select-date": "Tarih seç",
- "label.select-role": "Rol seç",
- "label.select-website": "Web sitesi seç",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "Ayarlar",
- "label.share-url": "Paylaşım adresi",
- "label.single-day": "Tekil gün",
- "label.start-step": "Start Step",
- "label.steps": "Adımlar",
- "label.sum": "Toplam",
- "label.tablet": "Tablet",
- "label.team": "Takım",
- "label.team-id": "Takım ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Takım üyesi",
- "label.team-name": "Takım ismi",
- "label.team-owner": "Takım sahibi",
- "label.team-view-only": "Yalnızca ekip görünümü",
- "label.team-websites": "Takım web siteleri",
- "label.teams": "Takımlar",
- "label.theme": "Tema",
- "label.this-month": "Bu ay",
- "label.this-week": "Bu hafta",
- "label.this-year": "Bu yıl",
- "label.timezone": "Zaman dilimi",
- "label.title": "Başlık",
- "label.today": "Bugün",
- "label.toggle-charts": "Grafikleri değiştir",
- "label.total": "Toplam",
- "label.total-records": "Toplam kayıt",
- "label.tracking-code": "İzleme kodu",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer web sitesi",
- "label.true": "Doğru",
- "label.type": "Tip",
- "label.unique": "Benzersiz",
- "label.unique-visitors": "Tekil kullanıcı",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Bilinmeyen",
- "label.untitled": "İsimsiz",
- "label.update": "Güncelle",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Kullanıcı",
- "label.user-property": "User Property",
- "label.username": "Kullanıcı adı",
- "label.users": "Kullanıcılar",
- "label.utm": "UTM",
- "label.utm-description": "Kampanyalarınızı UTM parametreleri aracılığıyla takip edin.",
- "label.value": "Değer",
- "label.view": "Görünüm",
- "label.view-details": "Detayı incele",
- "label.view-only": "Sadece görünüm",
- "label.views": "Görüntüleme",
- "label.views-per-visit": "Ziyaret başına görüntüleme",
- "label.visit-duration": "Ortalama ziyaret süresi",
- "label.visitors": "Ziyaretçi",
- "label.visits": "Ziyaretler",
- "label.website": "Web sitesi",
- "label.website-id": "Website ID",
- "label.websites": "Web siteleri",
- "label.window": "Pencere",
- "label.yesterday": "Dün",
- "message.action-confirmation": "Onaylamak için aşağıdaki kutuya {confirmation} yazın.",
- "message.active-users": "{x} aktif ziyaretçi",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "{target} kaydını silmek istediğinizden emin misiniz?",
- "message.confirm-leave": "{target} kaydından ayrılmak istediğinizden emin misiniz?",
- "message.confirm-remove": "{target} kaydını kaldırmak istediğinizden emin misiniz?",
- "message.confirm-reset": "{target} istatistiklerini sıfırlamak istediğinizden emin misiniz?",
- "message.delete-team-warning": "Bir takımı silmek tüm takım web sitelerini de silecektir.",
- "message.delete-website-warning": "İlişkili tüm veriler de silinecektir.",
- "message.error": "Bir şeyler ters gitti!",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "Ayarlara git",
- "message.incorrect-username-password": "Hatalı kullanıcı adı ya da parola.",
- "message.invalid-domain": "Geçersiz alan adı",
- "message.min-password-length": "Minimum {n} karakter uzunluğu",
- "message.new-version-available": "Yeni versiyon Umami {version} mevcut!",
- "message.no-data-available": "Henüz hiç veri yok.",
- "message.no-event-data": "Hiçbir olay verisi mevcut değil.",
- "message.no-match-password": "Parolalar uyuşmuyor",
- "message.no-results-found": "Hiçbir sonuç bulunamadı.",
- "message.no-team-websites": "Bu takımın herhangi bir web sitesi yok.",
- "message.no-teams": "Herhangi bir takım oluşturmadınız.",
- "message.no-users": "Kullanıcı yok.",
- "message.no-websites-configured": "Henüz hiç web sitesi tanımlamadınız",
- "message.page-not-found": "Sayfa bulunamadı.",
- "message.reset-website": "Bu websitesini sıfılamak için aşağıdaki kutuya {confirmation} yazın.",
- "message.reset-website-warning": "Bu web sitesi için tüm istatistikler silinecek, ancak izleme kodunuz bozulmadan kalacaktır.",
- "message.saved": "Başarıyla kaydedildi.",
- "message.share-url": "{target} için kullanılabilir anonim paylaşım adresidir.",
- "message.team-already-member": "Zaten bu takımın üyesisiniz",
- "message.team-not-found": "Takım bulunamadı",
- "message.team-websites-info": "Web siteleri takımdaki herkes tarafından görüntülenebilir.",
- "message.tracking-code": "İzleme kodu",
- "message.transfer-team-website-to-user": "Bu web sitesi hesbınıza aktarılsın mı?",
- "message.transfer-user-website-to-team": "Bu web sitesinin aktarılacağı takımı seçin.",
- "message.transfer-website": "Web sitesi sahipliğini hesabınıza veya başka bir takıma aktarın",
- "message.triggered-event": "Tetiklenen olay",
- "message.user-deleted": "Kullanıcı silindi.",
- "message.viewed-page": "Görüntülenen sayfa",
- "message.visitor-log": "Yeni ziyaretçi: {country}, {os}, {device}, {browser}",
- "message.visitors-dropped-off": "Bırakan ziyaretçiler"
-}
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
deleted file mode 100644
index c6843055f..000000000
--- a/src/lang/uk-UA.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Код доступу",
- "label.actions": "Дії",
- "label.activity": "Журнал",
- "label.add": "Додати",
- "label.add-description": "Додати опис",
- "label.add-member": "Додати учасника",
- "label.add-step": "Додати крок",
- "label.add-website": "Додати сайт",
- "label.admin": "Адміністратор",
- "label.after": "Після",
- "label.all": "Всі",
- "label.all-time": "Весь час",
- "label.analytics": "Аналітика",
- "label.average": "Середній",
- "label.back": "Назад",
- "label.before": "До",
- "label.bounce-rate": "Показник відмов",
- "label.breakdown": "Розподіл",
- "label.browser": "Браузер",
- "label.browsers": "Браузери",
- "label.cancel": "Відмінити",
- "label.change-password": "Змінити пароль",
- "label.cities": "Міста",
- "label.city": "Місто",
- "label.clear-all": "Очистити все",
- "label.compare": "Compare",
- "label.confirm": "Підтвердити",
- "label.confirm-password": "Підтвердити пароль",
- "label.contains": "Містить",
- "label.continue": "Продовжити",
- "label.count": "Count",
- "label.countries": "Країни",
- "label.country": "Країна",
- "label.create": "Створити",
- "label.create-report": "Створити звіт",
- "label.create-team": "Створити команду",
- "label.create-user": "Створити користувача",
- "label.created": "Створено",
- "label.created-by": "Створено",
- "label.current": "Current",
- "label.current-password": "Поточний пароль",
- "label.custom-range": "Довільний період",
- "label.dashboard": "Інформаційна панель",
- "label.data": "Дані",
- "label.date": "Дата",
- "label.date-range": "Діапазон дат",
- "label.day": "День",
- "label.default-date-range": "Діапазон дат за замовчуванням",
- "label.delete": "Видалити",
- "label.delete-report": "Видалити звіт",
- "label.delete-team": "Видалити команду",
- "label.delete-user": "Видалити користувача",
- "label.delete-website": "Видалити сайт",
- "label.description": "Опис",
- "label.desktop": "Настільний ПК",
- "label.details": "Деталі",
- "label.device": "Пристрій",
- "label.devices": "Пристрої",
- "label.dismiss": "Відхилити",
- "label.does-not-contain": "Не містить",
- "label.domain": "Домен",
- "label.dropoff": "Відсів",
- "label.edit": "Редагувати",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "Enable share URL",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Подія",
- "label.event-data": "Дані події",
- "label.events": "Події",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Поле",
- "label.fields": "Поля",
- "label.filter": "Фільтр",
- "label.filter-combined": "Об'єднані",
- "label.filter-raw": "Сирі дані",
- "label.filters": "Фільтри",
- "label.first-seen": "First seen",
- "label.funnel": "Воронка",
- "label.funnel-description": "Зрозуміти рівень конверсії та відсіву користувачів.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Більше ніж",
- "label.greater-than-equals": "Більше або рівно",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Інсайти",
- "label.insights-description": "Зануртеся глибше у свої дані за допомогою сегментів та фільтрів.",
- "label.is": "Є",
- "label.is-not": "Не є",
- "label.is-not-set": "Не встановлено",
- "label.is-set": "Встановлено",
- "label.join": "Приєднатись",
- "label.join-team": "Приєднатись до команди",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Мова",
- "label.languages": "Мови",
- "label.laptop": "Ноутбук",
- "label.last-days": "Останні {x} днів",
- "label.last-hours": "Останні {x} годин",
- "label.last-months": "Останні {x} місяців",
- "label.last-seen": "Last seen",
- "label.leave": "Покинути",
- "label.leave-team": "Покинути команду",
- "label.less-than": "Менше ніж",
- "label.less-than-equals": "Менше або дорівнює",
- "label.login": "Увійти",
- "label.logout": "Вийти",
- "label.manage": "Керувати",
- "label.manager": "Manager",
- "label.max": "Макс.",
- "label.member": "Учасник",
- "label.members": "Учасники",
- "label.min": "Мін.",
- "label.mobile": "Мобільний",
- "label.more": "Більше",
- "label.my-account": "Мій обліковий запис",
- "label.my-websites": "Мої сайти",
- "label.name": "Ім'я",
- "label.new-password": "Новий пароль",
- "label.none": "Нічого",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "ОС",
- "label.overview": "Огляд",
- "label.owner": "Власник",
- "label.page-of": "Сторінка {current} з {total}",
- "label.page-views": "Перегляди сторінок",
- "label.pageTitle": "Заголовок сторінки",
- "label.pages": "Сторінки",
- "label.password": "Пароль",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "На базі {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "Профіль",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Запити",
- "label.query": "Запит",
- "label.query-parameters": "Параметри запиту",
- "label.realtime": "У реальному часі",
- "label.referrer": "Джерело",
- "label.referrers": "Джерела",
- "label.refresh": "Оновити",
- "label.regenerate": "Згенерувати знову",
- "label.region": "Регіон",
- "label.regions": "Регіони",
- "label.remove": "Видалити",
- "label.remove-member": "Видалити користувача",
- "label.reports": "Звіти",
- "label.required": "Обов'язкове",
- "label.reset": "Скинути",
- "label.reset-website": "Скинути статистику сайту",
- "label.retention": "Липкість",
- "label.retention-description": "Виміряйте липкість вашого сайту, відстежуючи, як часто користувачі повертаються на нього.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Роль",
- "label.run-query": "Виконати запит",
- "label.save": "Зберегти",
- "label.screens": "Екрани",
- "label.search": "Пошук",
- "label.select": "Вибрати",
- "label.select-date": "Вибрати дату",
- "label.select-role": "Вибрати роль",
- "label.select-website": "Вибрати сайт",
- "label.session": "Session",
- "label.sessions": "Сесії",
- "label.settings": "Налаштування",
- "label.share-url": "Поділитися посилання",
- "label.single-day": "Один день",
- "label.start-step": "Start Step",
- "label.steps": "Кроки",
- "label.sum": "Сума",
- "label.tablet": "Планшет",
- "label.team": "Команда",
- "label.team-id": "Ідентифікатор команди",
- "label.team-manager": "Team manager",
- "label.team-member": "Учасник команди",
- "label.team-name": "Назва команди",
- "label.team-owner": "Власник команди",
- "label.team-view-only": "Тільки для командного перегляду",
- "label.team-websites": "Сайти команди",
- "label.teams": "Команди",
- "label.theme": "Тема",
- "label.this-month": "Цього місяця",
- "label.this-week": "Цього тижня",
- "label.this-year": "Цього ріку",
- "label.timezone": "Часовий пояс",
- "label.title": "Заголовок",
- "label.today": "Сьогодні",
- "label.toggle-charts": "Переключити графіки",
- "label.total": "Всього",
- "label.total-records": "Всього записів",
- "label.tracking-code": "Код для відслідковування",
- "label.transactions": "Transactions",
- "label.transfer": "Передати",
- "label.transfer-website": "Передати сайт",
- "label.true": "True",
- "label.type": "Тип",
- "label.unique": "Унікальний",
- "label.unique-visitors": "Унікальні відвідувачі",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "Невідомо",
- "label.untitled": "Без заголовку",
- "label.update": "Оновлення",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "Користувач",
- "label.user-property": "User Property",
- "label.username": "Ім'я користувача",
- "label.users": "Користувачі",
- "label.utm": "UTM",
- "label.utm-description": "Відстежуйте свої кампанії за допомогою параметрів UTM.",
- "label.value": "Значення",
- "label.view": "Перегляд",
- "label.view-details": "Переглянути деталі",
- "label.view-only": "Тільки для перегляду",
- "label.views": "Перегляди",
- "label.views-per-visit": "Перегляди за одне відвідування",
- "label.visit-duration": "Visit duration",
- "label.visitors": "Відвідувачі",
- "label.visits": "Відвідування",
- "label.website": "Сайт",
- "label.website-id": "Ідентифікатор сайту",
- "label.websites": "Сайти",
- "label.window": "Вікно",
- "label.yesterday": "Вчора",
- "message.action-confirmation": "Введіть {confirmation} у полі нижче, щоб підтвердити.",
- "message.active-users": "{x} поточних відвідувачів",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "Ви впевнені, що бажаєте видалити {target}?",
- "message.confirm-leave": "Ви впевнені, що бажаєте покинути {target}?",
- "message.confirm-remove": "Ви впевнені, що бажаєте видалити {target}?",
- "message.confirm-reset": "Ви впевнені, що бажаєте скинути статистику для {target}?",
- "message.delete-team-warning": "Видалення команди також призведе до видалення всіх її веб-сайтів.",
- "message.delete-website-warning": "Усі пов'язані дані будуть видалені також.",
- "message.error": "Щось пішло не так.",
- "message.event-log": "{event} на {url}",
- "message.go-to-settings": "Перейти до налаштувань",
- "message.incorrect-username-password": "Невірне ім'я користувача або пароль.",
- "message.invalid-domain": "Некоректний домен",
- "message.min-password-length": "Мінімальна довжина {n} символів",
- "message.new-version-available": "Вийшла нова версія Umami {version}!",
- "message.no-data-available": "Немає даних.",
- "message.no-event-data": "Дані про події відсутні.",
- "message.no-match-password": "Паролі не співпадають",
- "message.no-results-found": "Не знайдено жодного результату.",
- "message.no-team-websites": "У цієї команди немає жодного веб-сайту.",
- "message.no-teams": "Ви не створили жодної команди.",
- "message.no-users": "Немає жодного користувача.",
- "message.no-websites-configured": "У вас немає налаштованих сайтів.",
- "message.page-not-found": "Сторінку не знайдено.",
- "message.reset-website": "Щоб скинути налаштування цього веб-сайту, введіть {confirmation} у полі нижче для підтвердження.",
- "message.reset-website-warning": "Вся статистика для цього сайту буде видалена, проте код відслідковування буде продовжувати працювати.",
- "message.saved": "Збережено успішно.",
- "message.share-url": "Це публічне посилання для {target}.",
- "message.team-already-member": "Ви вже є членом команди.",
- "message.team-not-found": "Команду не знайдено.",
- "message.team-websites-info": "Веб-сайти може переглядати будь-хто з команди.",
- "message.tracking-code": "Код для відслідковування",
- "message.transfer-team-website-to-user": "Перенести цей сайт до свого облікового запису?",
- "message.transfer-user-website-to-team": "Виберіть команду, до якої ви хочете передати цей веб-сайт.",
- "message.transfer-website": "Передайте право власності на сайт своєму акаунту або іншій команді.",
- "message.triggered-event": "Подія, що спрацювала",
- "message.user-deleted": "Користувача видалено.",
- "message.viewed-page": "Переглянута сторінка",
- "message.visitor-log": "Відвідувач з {country} використовуючи {browser} на {os} {device}",
- "message.visitors-dropped-off": "Користувачі що відсіялись"
-}
diff --git a/src/lang/ur-PK.json b/src/lang/ur-PK.json
deleted file mode 100644
index 138ec1b3e..000000000
--- a/src/lang/ur-PK.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Access code",
- "label.actions": "اعمال",
- "label.activity": "Activity log",
- "label.add": "Add",
- "label.add-description": "Add description",
- "label.add-member": "Add member",
- "label.add-step": "Add step",
- "label.add-website": "ویب سائٹ کا اضافہ کریں",
- "label.admin": "منتظم",
- "label.after": "After",
- "label.all": "تمام",
- "label.all-time": "تمام وقت",
- "label.analytics": "Analytics",
- "label.average": "Average",
- "label.back": "پیچھے",
- "label.before": "Before",
- "label.bounce-rate": "اچھال کی شرح",
- "label.breakdown": "Breakdown",
- "label.browser": "Browser",
- "label.browsers": "براؤزرز",
- "label.cancel": "منسوخ",
- "label.change-password": "پاس ورڈ تبدیل کریں",
- "label.cities": "Cities",
- "label.city": "City",
- "label.clear-all": "Clear all",
- "label.compare": "Compare",
- "label.confirm": "Confirm",
- "label.confirm-password": "پاس ورڈ کی تصدیق کریں",
- "label.contains": "Contains",
- "label.continue": "Continue",
- "label.count": "Count",
- "label.countries": "ممالک",
- "label.country": "Country",
- "label.create": "Create",
- "label.create-report": "Create report",
- "label.create-team": "Create team",
- "label.create-user": "Create user",
- "label.created": "Created",
- "label.created-by": "Created By",
- "label.current": "Current",
- "label.current-password": "موجودہ پاس ورڈ",
- "label.custom-range": "اپنی مرضی کی حد",
- "label.dashboard": "ڈیش بورڈ",
- "label.data": "Data",
- "label.date": "Date",
- "label.date-range": "تاریخ کی حد",
- "label.day": "Day",
- "label.default-date-range": "پہلے سے طے شدہ تاریخ کی حد",
- "label.delete": "حذف کریں",
- "label.delete-report": "Delete report",
- "label.delete-team": "Delete team",
- "label.delete-user": "Delete user",
- "label.delete-website": "ویب سائٹ مٹایں",
- "label.description": "Description",
- "label.desktop": "ڈیسک ٹاپ",
- "label.details": "Details",
- "label.device": "Device",
- "label.devices": "آلات",
- "label.dismiss": "مسترد کریں",
- "label.does-not-contain": "Does not contain",
- "label.domain": "ڈومین",
- "label.dropoff": "Dropoff",
- "label.edit": "ترمیم",
- "label.edit-dashboard": "Edit dashboard",
- "label.edit-member": "Edit member",
- "label.enable-share-url": "شیئر یو آر ایل کو فعال کریں",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
- "label.event": "Event",
- "label.event-data": "Event data",
- "label.events": "واقعات",
- "label.exit": "Exit URL",
- "label.false": "False",
- "label.field": "Field",
- "label.fields": "Fields",
- "label.filter": "Filter",
- "label.filter-combined": "مشترکہ",
- "label.filter-raw": "خام",
- "label.filters": "Filters",
- "label.first-seen": "First seen",
- "label.funnel": "Funnel",
- "label.funnel-description": "Understand the conversion and drop-off rate of users.",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
- "label.greater-than": "Greater than",
- "label.greater-than-equals": "Greater than or equals",
- "label.host": "Host",
- "label.hosts": "Hosts",
- "label.insights": "Insights",
- "label.insights-description": "Dive deeper into your data by using segments and filters.",
- "label.is": "Is",
- "label.is-not": "Is not",
- "label.is-not-set": "Is not set",
- "label.is-set": "Is set",
- "label.join": "Join",
- "label.join-team": "Join team",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
- "label.language": "Language",
- "label.languages": "زبانیں",
- "label.laptop": "لیپ ٹاپ",
- "label.last-days": "پچھلے {x} دن",
- "label.last-hours": "پچھلے {x} گھنٹے",
- "label.last-months": "Last {x} months",
- "label.last-seen": "Last seen",
- "label.leave": "Leave",
- "label.leave-team": "Leave team",
- "label.less-than": "Less than",
- "label.less-than-equals": "Less than or equals",
- "label.login": "لاگ ان",
- "label.logout": "لاگ آوٹ",
- "label.manage": "Manage",
- "label.manager": "Manager",
- "label.max": "Max",
- "label.member": "Member",
- "label.members": "Members",
- "label.min": "Min",
- "label.mobile": "موبائل",
- "label.more": "مزید",
- "label.my-account": "My account",
- "label.my-websites": "My websites",
- "label.name": "نام",
- "label.new-password": "نیا پاس ورڈ",
- "label.none": "None",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
- "label.os": "OS",
- "label.overview": "Overview",
- "label.owner": "مالک",
- "label.page-of": "Page {current} of {total}",
- "label.page-views": "صفحہ کے نظارے",
- "label.pageTitle": "Page title",
- "label.pages": "صفحات",
- "label.password": "پاس ورڈ",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "تقویت یافتہ بذریعہ {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
- "label.profile": "پروفائل",
- "label.properties": "Properties",
- "label.property": "Property",
- "label.queries": "Queries",
- "label.query": "Query",
- "label.query-parameters": "Query parameters",
- "label.realtime": "براہ راست",
- "label.referrer": "Referrer",
- "label.referrers": "بھیجنے والے",
- "label.refresh": "تازہ دم کریں",
- "label.regenerate": "Regenerate",
- "label.region": "Region",
- "label.regions": "Regions",
- "label.remove": "Remove",
- "label.remove-member": "Remove member",
- "label.reports": "Reports",
- "label.required": "درکار ہے",
- "label.reset": "دوبارہ ترتیب دیں",
- "label.reset-website": "اعدادوشمار کو دوبارہ ترتیب دیں",
- "label.retention": "Retention",
- "label.retention-description": "Measure your website stickiness by tracking how often users return.",
- "label.revenue": "Revenue",
- "label.revenue-description": "Look into your revenue across time.",
- "label.revenue-property": "Revenue Property",
- "label.role": "Role",
- "label.run-query": "Run query",
- "label.save": "محفوظ کریں",
- "label.screens": "Screens",
- "label.search": "Search",
- "label.select": "Select",
- "label.select-date": "Select date",
- "label.select-role": "Select role",
- "label.select-website": "Select website",
- "label.session": "Session",
- "label.sessions": "Sessions",
- "label.settings": "ترتیبات",
- "label.share-url": "URL کا اشتراک کریں",
- "label.single-day": "ایک دن",
- "label.start-step": "Start Step",
- "label.steps": "Steps",
- "label.sum": "Sum",
- "label.tablet": "ٹیبلیٹ",
- "label.team": "Team",
- "label.team-id": "Team ID",
- "label.team-manager": "Team manager",
- "label.team-member": "Team member",
- "label.team-name": "Team name",
- "label.team-owner": "Team owner",
- "label.team-view-only": "Team view only",
- "label.team-websites": "Team websites",
- "label.teams": "Teams",
- "label.theme": "Theme",
- "label.this-month": "اس مہینے",
- "label.this-week": "اس ہفتے",
- "label.this-year": "اس سال",
- "label.timezone": "ٹائم زون",
- "label.title": "Title",
- "label.today": "آج",
- "label.toggle-charts": "چارٹ تبدیل کریں",
- "label.total": "Total",
- "label.total-records": "Total records",
- "label.tracking-code": "ٹریکنگ کوڈ",
- "label.transactions": "Transactions",
- "label.transfer": "Transfer",
- "label.transfer-website": "Transfer website",
- "label.true": "True",
- "label.type": "Type",
- "label.unique": "Unique",
- "label.unique-visitors": "منفرد زائرین",
- "label.uniqueCustomers": "Unique Customers",
- "label.unknown": "نامعلوم",
- "label.untitled": "Untitled",
- "label.update": "Update",
- "label.url": "URL",
- "label.urls": "URLs",
- "label.user": "User",
- "label.user-property": "User Property",
- "label.username": "صارف نام",
- "label.users": "Users",
- "label.utm": "UTM",
- "label.utm-description": "Track your campaigns through UTM parameters.",
- "label.value": "Value",
- "label.view": "View",
- "label.view-details": "تفصیلات دیکھیں",
- "label.view-only": "View only",
- "label.views": "مناظر",
- "label.views-per-visit": "Views per visit",
- "label.visit-duration": "وزٹ کا اوسط وقت",
- "label.visitors": "زائرین",
- "label.visits": "Visits",
- "label.website": "Website",
- "label.website-id": "Website ID",
- "label.websites": "ویب سائٹس",
- "label.window": "Window",
- "label.yesterday": "Yesterday",
- "message.action-confirmation": "Type {confirmation} in the box below to confirm.",
- "message.active-users": "{x} موجودہ {x, plural, one {زائر} other {زائرین}}",
- "message.collected-data": "Collected data",
- "message.confirm-delete": "کیا آپ واقعی {target} کو حذف کرنا چاہتے ہیں؟",
- "message.confirm-leave": "Are you sure you want to leave {target}?",
- "message.confirm-remove": "Are you sure you want to remove {target}?",
- "message.confirm-reset": "کیا آپ واقعی {target} کے اعدادوشمار کو دوبارہ ترتیب دینا چاہتے ہیں؟",
- "message.delete-team-warning": "Deleting a team will also delete all team websites.",
- "message.delete-website-warning": "تمام متعلقہ ڈیٹا بھی حذف کر دیا جائے گا۔",
- "message.error": "کچھ غلط ہو گیا.",
- "message.event-log": "{event} on {url}",
- "message.go-to-settings": "ترتیبات پر جائیں",
- "message.incorrect-username-password": "غلط صارف نام/پاس ورڈ۔",
- "message.invalid-domain": "غلط ڈومین",
- "message.min-password-length": "Minimum length of {n} characters",
- "message.new-version-available": "A new version of Umami {version} is available!",
- "message.no-data-available": "مواد موجود نہیں ہے.",
- "message.no-event-data": "No event data is available.",
- "message.no-match-password": "پاس ورڈز مماثل نہیں ہیں",
- "message.no-results-found": "No results were found.",
- "message.no-team-websites": "This team does not have any websites.",
- "message.no-teams": "You have not created any teams.",
- "message.no-users": "There are no users.",
- "message.no-websites-configured": "آپ کے پاس کوئی ویب سائٹ کنفیگر نہیں ہے۔",
- "message.page-not-found": "صفحہ نہیں ملا.",
- "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
- "message.reset-website-warning": "اس ویب سائٹ کے تمام اعدادوشمار کو حذف کر دیا جائے گا، لیکن آپ کا ٹریکنگ کوڈ برقرار رہے گا۔",
- "message.saved": "کامیابی سے محفوظ ہو گیا۔",
- "message.share-url": "یہ {target} کے لیے عوامی طور پر اشتراک کردہ URL ہے۔",
- "message.team-already-member": "You are already a member of the team.",
- "message.team-not-found": "Team not found.",
- "message.team-websites-info": "Websites can be viewed by anyone on the team.",
- "message.tracking-code": "ٹریکنگ کوڈ",
- "message.transfer-team-website-to-user": "Transfer this website to your account?",
- "message.transfer-user-website-to-team": "Select the team to transfer this website to.",
- "message.transfer-website": "Transfer website ownership to your account or another team.",
- "message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
- "message.visitor-log": "{os} {device} پر {browser} کا استعمال کرتے ہوئے {country} سے آنے والا",
- "message.visitors-dropped-off": "Visitors dropped off"
-}
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
deleted file mode 100644
index 5c9a78a24..000000000
--- a/src/lang/vi-VN.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "Mã truy cập",
- "label.actions": "Hành động",
- "label.activity": "Nhật ký hoạt động",
- "label.add": "Thêm",
- "label.add-description": "Thêm mô tả",
- "label.add-member": "Thêm thành viên",
- "label.add-step": "Thêm bước",
- "label.add-website": "Thêm website",
- "label.admin": "Quản trị",
- "label.after": "Sau đó",
- "label.all": "Tất cả",
- "label.all-time": "Toàn thời gian",
- "label.analytics": "Phân tích",
- "label.average": "Trung bình",
- "label.back": "Quay lại",
- "label.before": "Trước đó",
- "label.bounce-rate": "Tỷ lệ thoát trang",
- "label.breakdown": "Phân tích chi tiết",
- "label.browser": "Trình duyệt",
- "label.browsers": "Các trình duyệt",
- "label.cancel": "Hủy bỏ",
- "label.change-password": "Đổi mật khẩu",
- "label.cities": "Các thành phố",
- "label.city": "Thành phố",
- "label.clear-all": "Xóa tất cả",
- "label.compare": "So sánh",
- "label.confirm": "Xác nhận",
- "label.confirm-password": "Xác nhận mật khẩu",
- "label.contains": "Chứa",
- "label.continue": "Tiếp tục",
- "label.count": "Số lượng",
- "label.countries": "Các quốc gia",
- "label.country": "Quốc gia",
- "label.create": "Tạo",
- "label.create-report": "Tạo báo cáo",
- "label.create-team": "Tạo nhóm",
- "label.create-user": "Tạo người dùng",
- "label.created": "Đã tạo",
- "label.created-by": "Được tạo bởi",
- "label.current": "Hiện tại",
- "label.current-password": "Mật khẩu hiện tại",
- "label.custom-range": "Phạm vi tùy chỉnh",
- "label.dashboard": "Bảng điều khiển",
- "label.data": "Dữ liệu",
- "label.date": "Ngày",
- "label.date-range": "Phạm vi ngày",
- "label.day": "Ngày",
- "label.default-date-range": "Khoảng thời gian mặc định",
- "label.delete": "Xóa",
- "label.delete-report": "Xóa báo cáo",
- "label.delete-team": "Xóa nhóm",
- "label.delete-user": "Xóa người dùng",
- "label.delete-website": "Xóa website",
- "label.description": "Mô tả",
- "label.desktop": "Máy tính để bàn",
- "label.details": "Chi tiết",
- "label.device": "Thiết bị",
- "label.devices": "Các thiết bị",
- "label.dismiss": "Bỏ qua",
- "label.does-not-contain": "Không chứa",
- "label.domain": "Tên miền",
- "label.dropoff": "Tỷ lệ bỏ qua",
- "label.edit": "Chỉnh sửa",
- "label.edit-dashboard": "Chỉnh sửa bảng điều khiển",
- "label.edit-member": "Chỉnh sửa thành viên",
- "label.enable-share-url": "Bật chia sẻ URL",
- "label.end-step": "Bước kết thúc",
- "label.entry": "URL truy cập",
- "label.event": "Sự kiện",
- "label.event-data": "Dữ liệu sự kiện",
- "label.events": "Các sự kiện",
- "label.exit": "URL thoát",
- "label.false": "Sai",
- "label.field": "Trường",
- "label.fields": "Các trường",
- "label.filter": "Lọc",
- "label.filter-combined": "Kết hợp lọc",
- "label.filter-raw": "Lọc thô",
- "label.filters": "Bộ lọc",
- "label.first-seen": "Lần đầu tiên nhìn thấy",
- "label.funnel": "Phễu",
- "label.funnel-description": "Tìm hiểu tỷ lệ chuyển đổi và bỏ qua của người dùng.",
- "label.goal": "Mục tiêu",
- "label.goals": "Các mục tiêu",
- "label.goals-description": "Theo dõi các mục tiêu của bạn cho lượt xem trang và sự kiện.",
- "label.greater-than": "Lớn hơn",
- "label.greater-than-equals": "Lớn hơn hoặc bằng",
- "label.host": "Máy chủ",
- "label.hosts": "Các máy chủ",
- "label.insights": "Thông tin chi tiết",
- "label.insights-description": "Tìm hiểu sâu hơn về dữ liệu của bạn bằng cách sử dụng phân đoạn và bộ lọc.",
- "label.is": "Là",
- "label.is-not": "Không phải là",
- "label.is-not-set": "Chưa được đặt",
- "label.is-set": "Đã đặt",
- "label.join": "Tham gia",
- "label.join-team": "Tham gia nhóm",
- "label.journey": "Hành trình",
- "label.journey-description": "Hiểu cách người dùng điều hướng qua website của bạn.",
- "label.language": "Ngôn ngữ",
- "label.languages": "Các ngôn ngữ",
- "label.laptop": "Máy tính xách tay",
- "label.last-days": "{x} ngày gần nhất",
- "label.last-hours": "{x} giờ gần nhất",
- "label.last-months": "{x} tháng gần nhất",
- "label.last-seen": "Lần cuối cùng nhìn thấy",
- "label.leave": "Rời khỏi",
- "label.leave-team": "Rời nhóm",
- "label.less-than": "Nhỏ hơn",
- "label.less-than-equals": "Nhỏ hơn hoặc bằng",
- "label.login": "Đăng nhập",
- "label.logout": "Đăng xuất",
- "label.manage": "Quản lý",
- "label.manager": "Quản lý",
- "label.max": "Tối đa",
- "label.member": "Thành viên",
- "label.members": "Các thành viên",
- "label.min": "Tối thiểu",
- "label.mobile": "Di động",
- "label.more": "Thêm",
- "label.my-account": "Tài khoản của tôi",
- "label.my-websites": "Các website của tôi",
- "label.name": "Tên",
- "label.new-password": "Mật khẩu mới",
- "label.none": "Không",
- "label.number-of-records": "{x} {x, plural, one {bản ghi} other {bản ghi}}",
- "label.ok": "OK",
- "label.os": "Hệ điều hành",
- "label.overview": "Tổng quan",
- "label.owner": "Chủ sở hữu",
- "label.page-of": "Trang {current} trên {total}",
- "label.page-views": "Lượt xem trang",
- "label.pageTitle": "Tiêu đề trang",
- "label.pages": "Các trang",
- "label.password": "Mật khẩu",
- "label.path": "Đường dẫn",
- "label.paths": "Các đường dẫn",
- "label.powered-by": "Được cung cấp bởi {name}",
- "label.previous": "Trước",
- "label.previous-period": "Kỳ trước",
- "label.previous-year": "Năm trước",
- "label.profile": "Hồ sơ",
- "label.properties": "Thuộc tính",
- "label.property": "Thuộc tính",
- "label.queries": "Truy vấn",
- "label.query": "Truy vấn",
- "label.query-parameters": "Tham số truy vấn",
- "label.realtime": "Thời gian thực",
- "label.referrer": "Nguồn giới thiệu",
- "label.referrers": "Các nguồn giới thiệu",
- "label.refresh": "Làm mới",
- "label.regenerate": "Tạo lại",
- "label.region": "Vùng",
- "label.regions": "Các vùng",
- "label.remove": "Xóa",
- "label.remove-member": "Xóa thành viên",
- "label.reports": "Báo cáo",
- "label.required": "Yêu cầu",
- "label.reset": "Đặt lại",
- "label.reset-website": "Đặt lại thống kê website",
- "label.retention": "Tỷ lệ giữ chân",
- "label.retention-description": "Đo lường mức độ gắn bó của website bằng cách theo dõi tần suất người dùng quay lại.",
- "label.revenue": "Doanh thu",
- "label.revenue-description": "Xem xét doanh thu của bạn theo thời gian.",
- "label.revenue-property": "Thuộc tính doanh thu",
- "label.role": "Vai trò",
- "label.run-query": "Chạy truy vấn",
- "label.save": "Lưu",
- "label.screens": "Màn hình",
- "label.search": "Tìm kiếm",
- "label.select": "Chọn",
- "label.select-date": "Chọn ngày",
- "label.select-role": "Chọn vai trò",
- "label.select-website": "Chọn website",
- "label.session": "Phiên",
- "label.sessions": "Các phiên",
- "label.settings": "Cài đặt",
- "label.share-url": "Chia sẻ URL",
- "label.single-day": "Một ngày",
- "label.start-step": "Bước bắt đầu",
- "label.steps": "Các bước",
- "label.sum": "Tổng",
- "label.tablet": "Máy tính bảng",
- "label.team": "Nhóm",
- "label.team-id": "ID nhóm",
- "label.team-manager": "Quản lý nhóm",
- "label.team-member": "Thành viên nhóm",
- "label.team-name": "Tên nhóm",
- "label.team-owner": "Chủ sở hữu nhóm",
- "label.team-view-only": "Chỉ xem nhóm",
- "label.team-websites": "Các website của nhóm",
- "label.teams": "Các nhóm",
- "label.theme": "Chủ đề",
- "label.this-month": "Tháng này",
- "label.this-week": "Tuần này",
- "label.this-year": "Năm nay",
- "label.timezone": "Múi giờ",
- "label.title": "Tiêu đề",
- "label.today": "Hôm nay",
- "label.toggle-charts": "Bật/tắt biểu đồ",
- "label.total": "Tổng",
- "label.total-records": "Tổng số bản ghi",
- "label.tracking-code": "Mã theo dõi",
- "label.transactions": "Giao dịch",
- "label.transfer": "Chuyển giao",
- "label.transfer-website": "Chuyển giao website",
- "label.true": "Đúng",
- "label.type": "Loại",
- "label.unique": "Duy nhất",
- "label.unique-visitors": "Khách truy cập duy nhất",
- "label.uniqueCustomers": "Khách hàng duy nhất",
- "label.unknown": "Không rõ",
- "label.untitled": "Không có tiêu đề",
- "label.update": "Cập nhật",
- "label.url": "URL",
- "label.urls": "Các URL",
- "label.user": "Người dùng",
- "label.user-property": "Thuộc tính người dùng",
- "label.username": "Tên đăng nhập",
- "label.users": "Người dùng",
- "label.utm": "UTM",
- "label.utm-description": "Theo dõi các chiến dịch của bạn thông qua các tham số UTM.",
- "label.value": "Giá trị",
- "label.view": "Xem",
- "label.view-details": "Xem chi tiết",
- "label.view-only": "Chỉ xem",
- "label.views": "Lượt xem",
- "label.views-per-visit": "Lượt xem trên mỗi lượt truy cập",
- "label.visit-duration": "Thời lượng truy cập",
- "label.visitors": "Khách truy cập",
- "label.visits": "Lượt truy cập",
- "label.website": "Website",
- "label.website-id": "ID website",
- "label.websites": "Các website",
- "label.window": "Cửa sổ",
- "label.yesterday": "Hôm qua",
- "message.action-confirmation": "Nhập {confirmation} vào ô bên dưới để xác nhận.",
- "message.active-users": "{x} {x, plural, one {người dùng} other {người dùng}} đang hoạt động",
- "message.collected-data": "Dữ liệu đã thu thập",
- "message.confirm-delete": "Bạn có chắc chắn muốn xóa {target}?",
- "message.confirm-leave": "Bạn có chắc chắn muốn rời {target}?",
- "message.confirm-remove": "Bạn có chắc chắn muốn xóa {target}?",
- "message.confirm-reset": "Bạn có chắc chắn muốn đặt lại thống kê {target}?",
- "message.delete-team-warning": "Việc xóa một nhóm cũng sẽ xóa tất cả các website của nhóm.",
- "message.delete-website-warning": "Tất cả dữ liệu liên quan cũng sẽ bị xóa.",
- "message.error": "Đã xảy ra lỗi.",
- "message.event-log": "{event} trên {url}",
- "message.go-to-settings": "Chuyển đến cài đặt",
- "message.incorrect-username-password": "Sai tên đăng nhập/mật khẩu.",
- "message.invalid-domain": "Tên miền không hợp lệ",
- "message.min-password-length": "Độ dài tối thiểu {n} ký tự",
- "message.new-version-available": "Có phiên bản mới của Umami {version}!",
- "message.no-data-available": "Không có dữ liệu.",
- "message.no-event-data": "Không có dữ liệu sự kiện.",
- "message.no-match-password": "Mật khẩu không khớp",
- "message.no-results-found": "Không tìm thấy kết quả nào.",
- "message.no-team-websites": "Nhóm này không có bất kỳ website nào.",
- "message.no-teams": "Bạn chưa tạo nhóm nào.",
- "message.no-users": "Không có người dùng nào.",
- "message.no-websites-configured": "Bạn chưa cấu hình bất kỳ website nào.",
- "message.page-not-found": "Không tìm thấy trang.",
- "message.reset-website": "Để đặt lại website này, nhập {confirmation} vào ô bên dưới để xác nhận.",
- "message.reset-website-warning": "Tất cả số liệu thống kê của website này sẽ bị xóa, nhưng mã theo dõi sẽ vẫn giữ nguyên.",
- "message.saved": "Đã lưu thành công.",
- "message.share-url": "Đây là đường dẫn URL cho {target}.",
- "message.team-already-member": "Bạn đã là thành viên của nhóm.",
- "message.team-not-found": "Không tìm thấy nhóm.",
- "message.team-websites-info": "Bất kỳ ai trong nhóm đều có thể xem các website.",
- "message.tracking-code": "Mã theo dõi",
- "message.transfer-team-website-to-user": "Chuyển website này sang tài khoản của bạn?",
- "message.transfer-user-website-to-team": "Chọn nhóm để chuyển website này đến.",
- "message.transfer-website": "Chuyển quyền sở hữu website sang tài khoản của bạn hoặc một nhóm khác.",
- "message.triggered-event": "Sự kiện được kích hoạt",
- "message.user-deleted": "Người dùng đã bị xóa.",
- "message.viewed-page": "Đã xem trang",
- "message.visitor-log": "Khách từ {country} đang sử dụng {browser} trên {os} {device}",
- "message.visitors-dropped-off": "Khách truy cập đã rời đi"
-}
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
deleted file mode 100644
index 6892f2e59..000000000
--- a/src/lang/zh-CN.json
+++ /dev/null
@@ -1,280 +0,0 @@
-{
- "label.access-code": "访问代码",
- "label.actions": "用户行为",
- "label.activity": "活动日志",
- "label.add": "添加",
- "label.add-description": "添加描述",
- "label.add-member": "添加成员",
- "label.add-step": "添加步骤",
- "label.add-website": "添加网站",
- "label.admin": "管理员",
- "label.after": "之后",
- "label.all": "所有",
- "label.all-time": "所有时间段",
- "label.analytics": "分析",
- "label.average": "平均",
- "label.back": "返回",
- "label.before": "之前",
- "label.bounce-rate": "跳出率",
- "label.breakdown": "故障",
- "label.browser": "浏览器",
- "label.browsers": "浏览器",
- "label.cancel": "取消",
- "label.change-password": "修改密码",
- "label.channels": "渠道",
- "label.cities": "市/县",
- "label.city": "市/县",
- "label.clear-all": "清除全部",
- "label.compare": "比较",
- "label.confirm": "确认",
- "label.confirm-password": "确认密码",
- "label.contains": "包含",
- "label.continue": "继续",
- "label.count": "统计",
- "label.countries": "国家/地区",
- "label.country": "国家/地区",
- "label.create": "创建",
- "label.create-report": "创建报告",
- "label.create-team": "创建团队",
- "label.create-user": "创建用户",
- "label.created": "已创建",
- "label.created-by": "创建者",
- "label.current": "当前",
- "label.current-password": "当前密码",
- "label.custom-range": "自定义时间段",
- "label.dashboard": "仪表盘",
- "label.data": "统计数据",
- "label.date": "日期",
- "label.date-range": "时间段",
- "label.day": "日",
- "label.default-date-range": "默认时间段",
- "label.delete": "删除",
- "label.delete-report": "删除报告",
- "label.delete-team": "删除团队",
- "label.delete-user": "删除用户",
- "label.delete-website": "删除网站",
- "label.description": "描述",
- "label.desktop": "台式机",
- "label.details": "详细信息",
- "label.device": "设备",
- "label.devices": "设备",
- "label.dismiss": "关闭",
- "label.does-not-contain": "不包含",
- "label.domain": "域名",
- "label.dropoff": "丢弃",
- "label.edit": "编辑",
- "label.edit-dashboard": "编辑仪表盘",
- "label.edit-member": "编辑成员",
- "label.enable-share-url": "启用共享链接",
- "label.end-step": "结束步骤",
- "label.entry": "入口 URL",
- "label.event": "事件",
- "label.event-data": "事件数据",
- "label.events": "行为类别",
- "label.exit": "退出 URL",
- "label.false": "否",
- "label.field": "字段",
- "label.fields": "字段",
- "label.filter": "筛选器",
- "label.filter-combined": "合并",
- "label.filter-raw": "原始",
- "label.filters": "筛选",
- "label.first-seen": "首次出现",
- "label.funnel": "分析",
- "label.funnel-description": "了解用户的转化率和跳出率。",
- "label.goal": "目标",
- "label.goals": "目标",
- "label.goals-description": "跟踪页面浏览量和事件的目标。",
- "label.greater-than": "大于",
- "label.greater-than-equals": "大于或等于",
- "label.host": "主机",
- "label.hosts": "主机",
- "label.insights": "见解",
- "label.insights-description": "通过使用筛选器和划分时间段来更深入地研究数据。",
- "label.is": "等于",
- "label.is-not": "不等于",
- "label.is-not-set": "未设置",
- "label.is-set": "已设置",
- "label.join": "加入",
- "label.join-team": "加入团队",
- "label.journey": "用户浏览轨迹",
- "label.journey-description": "了解用户如何浏览网站。",
- "label.language": "语言",
- "label.languages": "语言",
- "label.laptop": "笔记本",
- "label.last-days": "最近 {x} 天",
- "label.last-hours": "最近 {x} 小时",
- "label.last-months": "最近 {x} 个月",
- "label.last-seen": "最后出现",
- "label.leave": "离开",
- "label.leave-team": "离开团队",
- "label.less-than": "少于",
- "label.less-than-equals": "少于等于",
- "label.login": "登录",
- "label.logout": "退出",
- "label.manage": "管理",
- "label.manager": "管理者",
- "label.max": "最大",
- "label.member": "成员",
- "label.members": "成员",
- "label.min": "最小",
- "label.mobile": "手机",
- "label.more": "更多",
- "label.my-account": "我的账户",
- "label.my-websites": "我的网站",
- "label.name": "名字",
- "label.new-password": "新密码",
- "label.none": "无",
- "label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "好的",
- "label.os": "操作系统",
- "label.overview": "概览",
- "label.owner": "所有者",
- "label.page-of": "总 {total} 中的第 {current} 页",
- "label.page-views": "页面浏览量",
- "label.pageTitle": "标题",
- "label.pages": "网页",
- "label.password": "密码",
- "label.path": "Path",
- "label.paths": "Paths",
- "label.powered-by": "由 {name} 提供支持",
- "label.previous": "先前",
- "label.previous-period": "上一时期",
- "label.previous-year": "上一年",
- "label.profile": "个人资料",
- "label.properties": "属性",
- "label.property": "属性",
- "label.queries": "查询",
- "label.query": "查询",
- "label.query-parameters": "查询参数",
- "label.realtime": "实时",
- "label.referrer": "来源",
- "label.referrers": "来源域名",
- "label.refresh": "刷新",
- "label.regenerate": "重新生成",
- "label.region": "州/省",
- "label.regions": "州/省",
- "label.remove": "移除",
- "label.remove-member": "移除成员",
- "label.reports": "报告",
- "label.required": "必填",
- "label.reset": "重置",
- "label.reset-website": "重置统计数据",
- "label.retention": "保留",
- "label.retention-description": "通过追踪用户回访频率来衡量您网站的用户粘性。",
- "label.revenue": "收入",
- "label.revenue-description": "查看随时间变化的收入数据。",
- "label.revenue-property": "收入值",
- "label.role": "角色",
- "label.run-query": "查询",
- "label.save": "保存",
- "label.screens": "屏幕尺寸",
- "label.search": "搜索",
- "label.select": "选择",
- "label.select-date": "选择日期",
- "label.select-role": "选择角色",
- "label.select-website": "选择网站",
- "label.session": "Session",
- "label.sessions": "会话",
- "label.settings": "设置",
- "label.share-url": "共享链接",
- "label.single-day": "单日",
- "label.start-step": "开始步骤",
- "label.steps": "步骤",
- "label.sum": "总和",
- "label.tablet": "平板",
- "label.team": "团队",
- "label.team-id": "团队 ID",
- "label.team-manager": "团队管理员",
- "label.team-member": "团队成员",
- "label.team-name": "团队名称",
- "label.team-owner": "团队所有者",
- "label.team-view-only": "仅团队视图",
- "label.team-websites": "团队网站",
- "label.teams": "团队",
- "label.theme": "主题",
- "label.this-month": "本月",
- "label.this-week": "本周",
- "label.this-year": "今年",
- "label.timezone": "时区",
- "label.title": "标题",
- "label.today": "今天",
- "label.toggle-charts": "切换图表",
- "label.total": "总数",
- "label.total-records": "总记录数",
- "label.tracking-code": "跟踪代码",
- "label.transactions": "交易",
- "label.transfer": "转移",
- "label.transfer-website": "转移网站",
- "label.true": "是",
- "label.type": "类型",
- "label.unique": "独立",
- "label.unique-visitors": "独立访客",
- "label.uniqueCustomers": "独特客户",
- "label.unknown": "未知",
- "label.untitled": "未命名",
- "label.update": "更新",
- "label.url": "网址",
- "label.urls": "网址",
- "label.user": "用户",
- "label.user-property": "用户属性",
- "label.username": "用户名",
- "label.users": "用户",
- "label.utm": "UTM",
- "label.utm-description": "通过 UTM 参数追踪您的广告活动。",
- "label.value": "值",
- "label.view": "查看",
- "label.view-details": "查看更多",
- "label.view-only": "仅浏览",
- "label.views": "浏览量",
- "label.views-per-visit": "每次访问的浏览量",
- "label.visit-duration": "平均访问时长",
- "label.visitors": "访客",
- "label.visits": "访问次数",
- "label.website": "网站",
- "label.website-id": "网站 ID",
- "label.websites": "网站",
- "label.window": "窗口",
- "label.yesterday": "昨天",
- "message.action-confirmation": "请在下方输入框中输入 {confirmation} 以确认操作。",
- "message.active-users": "当前在线 {x} 位访客",
- "message.collected-data": "已收集的数据",
- "message.confirm-delete": "你确定要删除 {target} 吗?",
- "message.confirm-leave": "你确定要离开 {target} 吗?",
- "message.confirm-remove": "您确定要移除 {target} ?",
- "message.confirm-reset": "您确定要重置 {target} 的数据吗?",
- "message.delete-team-warning": "删除团队也会删除所有团队网站。",
- "message.delete-website-warning": "所有相关数据将会被删除。",
- "message.error": "发生错误。",
- "message.event-log": "{url} 上的 {event}",
- "message.go-to-settings": "去设置",
- "message.incorrect-username-password": "用户名或密码不正确。",
- "message.invalid-domain": "无效域名",
- "message.min-password-length": "密码最短长度为 {n} 个字符",
- "message.new-version-available": "Umami 新版本 {version} 已发布!",
- "message.no-data-available": "暂无数据。",
- "message.no-event-data": "无可用事件。",
- "message.no-match-password": "密码不一致",
- "message.no-results-found": "未找到结果。",
- "message.no-team-websites": "该团队暂无网站。",
- "message.no-teams": "您尚未创建任何团队。",
- "message.no-users": "暂无用户。",
- "message.no-websites-configured": "你还没有设置任何网站。",
- "message.page-not-found": "页面未找到。",
- "message.reset-website": "如确定要重置该网站,请在下面输入 {confirmation} 以确认。",
- "message.reset-website-warning": "此网站的所有统计数据将被删除,但您的跟踪代码将保持不变。",
- "message.saved": "保存成功。",
- "message.share-url": "这是 {target} 的共享链接。",
- "message.team-already-member": "你已是该团队的成员。",
- "message.team-not-found": "未找到团队。",
- "message.team-websites-info": "团队成员均可查看网站数据。",
- "message.tracking-code": "跟踪代码",
- "message.transfer-team-website-to-user": "将此网站转移到您的账户?",
- "message.transfer-user-website-to-team": "选择要转移此网站的团队。",
- "message.transfer-website": "将网站所有权转移到您的账户或其他团队。",
- "message.triggered-event": "触发事件",
- "message.user-deleted": "用户已删除。",
- "message.viewed-page": "已浏览页面",
- "message.visitor-log": "来自 {country} 的访客在搭载 {os} 的 {device} 上使用 {browser} 浏览器进行访问。",
- "message.visitors-dropped-off": "访客减少"
-}
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
deleted file mode 100644
index 46cdbde1f..000000000
--- a/src/lang/zh-TW.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
- "label.access-code": "存取碼",
- "label.actions": "行為",
- "label.activity": "活動紀錄",
- "label.add": "新增",
- "label.add-description": "新增描述",
- "label.add-member": "新增成員",
- "label.add-step": "新增步驟",
- "label.add-website": "新增網站",
- "label.admin": "管理員",
- "label.after": "之後",
- "label.all": "全部",
- "label.all-time": "所有時間",
- "label.analytics": "分析",
- "label.average": "平均",
- "label.back": "返回",
- "label.before": "之前",
- "label.bounce-rate": "跳出率",
- "label.breakdown": "細項分析",
- "label.browser": "瀏覽器",
- "label.browsers": "瀏覽器",
- "label.cancel": "取消",
- "label.change-password": "更改密碼",
- "label.cities": "城市",
- "label.city": "城市",
- "label.clear-all": "全部清除",
- "label.compare": "比較",
- "label.confirm": "確認",
- "label.confirm-password": "確認密碼",
- "label.contains": "包含",
- "label.continue": "繼續",
- "label.count": "數量",
- "label.countries": "國家",
- "label.country": "國家",
- "label.create": "建立",
- "label.create-report": "建立報表",
- "label.create-team": "建立團隊",
- "label.create-user": "建立使用者",
- "label.created": "已建立",
- "label.created-by": "建立者",
- "label.current": "目前",
- "label.current-password": "目前密碼",
- "label.custom-range": "自訂範圍",
- "label.dashboard": "儀表板",
- "label.data": "資料",
- "label.date": "日期",
- "label.date-range": "日期範圍",
- "label.day": "日",
- "label.default-date-range": "預設日期範圍",
- "label.delete": "刪除",
- "label.delete-report": "刪除報表",
- "label.delete-team": "刪除團隊",
- "label.delete-user": "刪除使用者",
- "label.delete-website": "刪除網站",
- "label.description": "描述",
- "label.desktop": "桌上型電腦",
- "label.details": "詳細資訊",
- "label.device": "裝置",
- "label.devices": "裝置",
- "label.dismiss": "關閉",
- "label.does-not-contain": "不包含",
- "label.domain": "網域",
- "label.dropoff": "離開",
- "label.edit": "編輯",
- "label.edit-dashboard": "編輯儀表板",
- "label.edit-member": "編輯成員",
- "label.enable-share-url": "啟用分享連結",
- "label.end-step": "結束步驟",
- "label.entry": "進入網址",
- "label.event": "事件",
- "label.event-data": "事件資料",
- "label.events": "事件",
- "label.exit": "離開網址",
- "label.false": "否",
- "label.field": "欄位",
- "label.fields": "欄位",
- "label.filter": "篩選器",
- "label.filter-combined": "組合",
- "label.filter-raw": "原始",
- "label.filters": "篩選條件",
- "label.first-seen": "首次造訪",
- "label.funnel": "漏斗分析",
- "label.funnel-description": "瞭解使用者的轉換率與流失率。",
- "label.goal": "目標",
- "label.goals": "目標",
- "label.goals-description": "追蹤網頁瀏覽和事件的目標。",
- "label.greater-than": "大於",
- "label.greater-than-equals": "大於或等於",
- "label.host": "主機名稱",
- "label.hosts": "主機名稱",
- "label.insights": "洞察",
- "label.insights-description": "使用區段和篩選器來深入分析您的資料。",
- "label.is": "是",
- "label.is-not": "不是",
- "label.is-not-set": "未設定",
- "label.is-set": "已設定",
- "label.join": "加入",
- "label.join-team": "加入團隊",
- "label.journey": "使用者旅程",
- "label.journey-description": "瞭解使用者如何瀏覽您的網站。",
- "label.language": "語言",
- "label.languages": "語言",
- "label.laptop": "筆記型電腦",
- "label.last-days": "最近 {x} 天",
- "label.last-hours": "最近 {x} 小時",
- "label.last-months": "最近 {x} 個月",
- "label.last-seen": "最後造訪",
- "label.leave": "離開",
- "label.leave-team": "離開團隊",
- "label.less-than": "小於",
- "label.less-than-equals": "小於或等於",
- "label.login": "登入",
- "label.logout": "登出",
- "label.manage": "管理",
- "label.manager": "管理者",
- "label.max": "最大值",
- "label.member": "成員",
- "label.members": "成員",
- "label.min": "最小值",
- "label.mobile": "行動裝置",
- "label.more": "更多",
- "label.my-account": "我的帳號",
- "label.my-websites": "我的網站",
- "label.name": "名稱",
- "label.new-password": "新密碼",
- "label.none": "無",
- "label.number-of-records": "{x} 筆紀錄",
- "label.ok": "OK",
- "label.os": "作業系統",
- "label.overview": "總覽",
- "label.owner": "擁有者",
- "label.page-of": "第 {current} 頁,共 {total} 頁",
- "label.page-views": "網頁瀏覽次數",
- "label.pageTitle": "網頁標題",
- "label.pages": "網頁",
- "label.password": "密碼",
- "label.path": "路徑",
- "label.paths": "路徑",
- "label.powered-by": "由 {name} 提供技術支援",
- "label.previous": "上一個",
- "label.previous-period": "上一期間",
- "label.previous-year": "去年",
- "label.profile": "個人檔案",
- "label.properties": "屬性",
- "label.property": "屬性",
- "label.queries": "查詢",
- "label.query": "查詢",
- "label.query-parameters": "查詢參數",
- "label.realtime": "即時",
- "label.referrer": "參照來源",
- "label.referrers": "參照來源",
- "label.refresh": "重新整理",
- "label.regenerate": "重新產生",
- "label.region": "地區",
- "label.regions": "地區",
- "label.remove": "移除",
- "label.remove-member": "移除成員",
- "label.reports": "報表",
- "label.required": "必填",
- "label.reset": "重設",
- "label.reset-website": "重設網站統計資料",
- "label.retention": "留存率",
- "label.retention-description": "透過追蹤使用者回訪的頻率來衡量您的網站黏著度。",
- "label.revenue": "營收",
- "label.revenue-description": "查看您的營收趨勢。",
- "label.revenue-property": "營收屬性",
- "label.role": "角色",
- "label.run-query": "執行查詢",
- "label.save": "儲存",
- "label.screens": "螢幕",
- "label.search": "搜尋",
- "label.select": "選取",
- "label.select-date": "選取日期",
- "label.select-role": "選取角色",
- "label.select-website": "選取網站",
- "label.session": "工作階段",
- "label.sessions": "工作階段",
- "label.settings": "設定",
- "label.share-url": "分享連結",
- "label.single-day": "單日",
- "label.start-step": "起始步驟",
- "label.steps": "步驟",
- "label.sum": "總和",
- "label.tablet": "平板",
- "label.team": "團隊",
- "label.team-id": "團隊 ID",
- "label.team-manager": "團隊管理者",
- "label.team-member": "團隊成員",
- "label.team-name": "團隊名稱",
- "label.team-owner": "團隊擁有者",
- "label.team-view-only": "團隊僅供檢視",
- "label.team-websites": "團隊網站",
- "label.teams": "團隊",
- "label.theme": "主題",
- "label.this-month": "本月",
- "label.this-week": "本週",
- "label.this-year": "今年",
- "label.timezone": "時區",
- "label.title": "標題",
- "label.today": "今天",
- "label.toggle-charts": "切換圖表",
- "label.total": "總計",
- "label.total-records": "紀錄總數",
- "label.tracking-code": "追蹤代碼",
- "label.transactions": "交易",
- "label.transfer": "轉移",
- "label.transfer-website": "轉移網站",
- "label.true": "是",
- "label.type": "類型",
- "label.unique": "不重複",
- "label.unique-visitors": "不重複訪客",
- "label.uniqueCustomers": "不重複客戶",
- "label.unknown": "未知",
- "label.untitled": "未命名",
- "label.update": "更新",
- "label.url": "網址",
- "label.urls": "網址",
- "label.user": "使用者",
- "label.user-property": "使用者屬性",
- "label.username": "使用者名稱",
- "label.users": "使用者",
- "label.utm": "UTM",
- "label.utm-description": "透過 UTM 參數追蹤您的行銷活動。",
- "label.value": "值",
- "label.view": "檢視",
- "label.view-details": "檢視詳細資訊",
- "label.view-only": "僅供檢視",
- "label.views": "瀏覽次數",
- "label.views-per-visit": "每次造訪的瀏覽次數",
- "label.visit-duration": "造訪時間",
- "label.visitors": "訪客",
- "label.visits": "造訪次數",
- "label.website": "網站",
- "label.website-id": "網站 ID",
- "label.websites": "網站",
- "label.window": "視窗",
- "label.yesterday": "昨天",
- "message.action-confirmation": "請在下方欄位輸入 {confirmation} 以確認。",
- "message.active-users": "目前有 {x} 位訪客",
- "message.collected-data": "已蒐集的資料",
- "message.confirm-delete": "您確定要刪除 {target} 嗎?",
- "message.confirm-leave": "您確定要離開 {target} 嗎?",
- "message.confirm-remove": "您確定要移除 {target} 嗎?",
- "message.confirm-reset": "您確定要重設 {target} 的統計資料嗎?",
- "message.delete-team-warning": "刪除團隊的同時也會刪除所有團隊的網站。",
- "message.delete-website-warning": "所有網站資料都將被刪除。",
- "message.error": "發生錯誤。",
- "message.event-log": "在 {url} 上的 {event}",
- "message.go-to-settings": "前往設定",
- "message.incorrect-username-password": "使用者名稱或密碼不正確。",
- "message.invalid-domain": "無效的網域。請勿包含 http/https。",
- "message.min-password-length": "密碼長度至少需 {n} 個字元",
- "message.new-version-available": "Umami {version} 的新版本已推出!",
- "message.no-data-available": "沒有可用的資料。",
- "message.no-event-data": "沒有可用的事件資料。",
- "message.no-match-password": "密碼不一致。",
- "message.no-results-found": "找不到結果。",
- "message.no-team-websites": "此團隊沒有任何網站。",
- "message.no-teams": "您尚未建立任何團隊。",
- "message.no-users": "沒有任何使用者。",
- "message.no-websites-configured": "您尚未設定任何網站。",
- "message.page-not-found": "找不到網頁",
- "message.reset-website": "要重設此網站的統計資料,請在下方欄位輸入 {confirmation} 以確認。",
- "message.reset-website-warning": "此網站的所有統計資料都將被刪除,但您的設定將保持不變。",
- "message.saved": "已儲存。",
- "message.share-url": "您的網站統計資料可在以下網址公開檢視:",
- "message.team-already-member": "您已是該團隊的成員。",
- "message.team-not-found": "找不到團隊。",
- "message.team-websites-info": "團隊中的所有成員都可以檢視網站。",
- "message.tracking-code": "要追蹤此網站的統計資料,請將以下程式碼放在您 HTML 的 ... 區段中。",
- "message.transfer-team-website-to-user": "要將此網站轉移至您的帳號嗎?",
- "message.transfer-user-website-to-team": "請選擇要轉移此網站的團隊。",
- "message.transfer-website": "將網站所有權轉移至您的帳號或其他團隊。",
- "message.triggered-event": "已觸發的事件",
- "message.user-deleted": "使用者已刪除。",
- "message.viewed-page": "已瀏覽的網頁",
- "message.visitor-log": "來自 {country} 的訪客在 {device} 上的 {os} 使用 {browser} 瀏覽。",
- "message.visitors-dropped-off": "訪客已離開"
-}
diff --git a/src/lib/__tests__/boards.test.ts b/src/lib/__tests__/boards.test.ts
new file mode 100644
index 000000000..4d6a8f435
--- /dev/null
+++ b/src/lib/__tests__/boards.test.ts
@@ -0,0 +1,29 @@
+import {
+ BOARD_ENTITY_TYPES,
+ isBoardComponentSupported,
+} from '../boards';
+import {
+ BOARD_COMPONENT_COMPATIBILITY_MATRIX,
+ getSupportedBoardComponentEntityTypes,
+} from '../boardComponentCompatibility';
+
+test('isBoardComponentSupported allows events chart on website boards', () => {
+ expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.website)).toBe(true);
+});
+
+test('isBoardComponentSupported rejects events chart on pixel and link boards', () => {
+ expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.pixel)).toBe(false);
+ expect(isBoardComponentSupported('EventsChart', BOARD_ENTITY_TYPES.link)).toBe(false);
+});
+
+test('board component compatibility matrix defines website-only components explicitly', () => {
+ expect(BOARD_COMPONENT_COMPATIBILITY_MATRIX.EventsChart).toEqual([BOARD_ENTITY_TYPES.website]);
+ expect(getSupportedBoardComponentEntityTypes('EventsChart')).toEqual([
+ BOARD_ENTITY_TYPES.website,
+ ]);
+});
+
+test('isBoardComponentSupported leaves other components available for all board entities', () => {
+ expect(isBoardComponentSupported('WebsiteChart', BOARD_ENTITY_TYPES.pixel)).toBe(true);
+ expect(isBoardComponentSupported('TextBlock', BOARD_ENTITY_TYPES.link)).toBe(true);
+});
diff --git a/src/lib/__tests__/charts.test.ts b/src/lib/__tests__/charts.test.ts
index 601ee63d8..e81be161c 100644
--- a/src/lib/__tests__/charts.test.ts
+++ b/src/lib/__tests__/charts.test.ts
@@ -14,23 +14,21 @@ describe('renderNumberLabels', () => {
expect(renderNumberLabels(input)).toBe(expected);
});
- test.each([['12500', '12.5k']])(
- "formats numbers ≥ 10K as 'X.Xk' (%s → %s)",
- (input, expected) => {
- expect(renderNumberLabels(input)).toBe(expected);
- },
- );
+ test.each([
+ ['12500', '12.5k'],
+ ])("formats numbers ≥ 10K as 'X.Xk' (%s → %s)", (input, expected) => {
+ expect(renderNumberLabels(input)).toBe(expected);
+ });
test.each([['1500', '1.50k']])("formats numbers ≥ 1K as 'X.XXk' (%s → %s)", (input, expected) => {
expect(renderNumberLabels(input)).toBe(expected);
});
- test.each([['999', '999']])(
- 'calls formatNumber for values < 1000 (%s → %s)',
- (input, expected) => {
- expect(renderNumberLabels(input)).toBe(expected);
- },
- );
+ test.each([
+ ['999', '999'],
+ ])('calls formatNumber for values < 1000 (%s → %s)', (input, expected) => {
+ expect(renderNumberLabels(input)).toBe(expected);
+ });
test.each([
['0', '0'],
diff --git a/src/lib/__tests__/detect.test.ts b/src/lib/__tests__/detect.test.ts
index 0ee345726..c41523d15 100644
--- a/src/lib/__tests__/detect.test.ts
+++ b/src/lib/__tests__/detect.test.ts
@@ -1,5 +1,4 @@
-import * as detect from '../detect';
-import { expect } from '@jest/globals';
+import { getIpAddress } from '../ip';
const IP = '127.0.0.1';
const BAD_IP = '127.127.127.127';
@@ -7,23 +6,17 @@ const BAD_IP = '127.127.127.127';
test('getIpAddress: Custom header', () => {
process.env.CLIENT_IP_HEADER = 'x-custom-ip-header';
- expect(detect.getIpAddress(new Headers({ 'x-custom-ip-header': IP }))).toEqual(IP);
+ expect(getIpAddress(new Headers({ 'x-custom-ip-header': IP }))).toEqual(IP);
});
test('getIpAddress: CloudFlare header', () => {
- expect(detect.getIpAddress(new Headers({ 'cf-connecting-ip': IP }))).toEqual(IP);
+ expect(getIpAddress(new Headers({ 'cf-connecting-ip': IP }))).toEqual(IP);
});
test('getIpAddress: Standard header', () => {
- expect(detect.getIpAddress(new Headers({ 'x-forwarded-for': IP }))).toEqual(IP);
-});
-
-test('getIpAddress: CloudFlare header is lower priority than standard header', () => {
- expect(
- detect.getIpAddress(new Headers({ 'cf-connecting-ip': BAD_IP, 'x-forwarded-for': IP })),
- ).toEqual(IP);
+ expect(getIpAddress(new Headers({ 'x-forwarded-for': IP }))).toEqual(IP);
});
test('getIpAddress: No header', () => {
- expect(detect.getIpAddress(new Headers())).toEqual(null);
+ expect(getIpAddress(new Headers())).toEqual(undefined);
});
diff --git a/src/lib/__tests__/format.test.ts b/src/lib/__tests__/format.test.ts
index 2f68dc188..6e1b319f0 100644
--- a/src/lib/__tests__/format.test.ts
+++ b/src/lib/__tests__/format.test.ts
@@ -1,5 +1,4 @@
import * as format from '../format';
-import { expect } from '@jest/globals';
test('parseTime', () => {
expect(format.parseTime(86400 + 3600 + 60 + 1)).toEqual({
diff --git a/src/lib/__tests__/get-base-url.test.ts b/src/lib/__tests__/get-base-url.test.ts
new file mode 100644
index 000000000..5bca0f193
--- /dev/null
+++ b/src/lib/__tests__/get-base-url.test.ts
@@ -0,0 +1,48 @@
+import { HOMEPAGE_URL } from '../constants';
+import { getBaseUrl } from '../get-base-url';
+
+function createHeaders(entries: Record) {
+ return {
+ get(name: string) {
+ return entries[name.toLowerCase()] ?? null;
+ },
+ };
+}
+
+test('prefers forwarded host and protocol', () => {
+ const url = getBaseUrl(
+ createHeaders({
+ 'x-forwarded-host': 'umami.is',
+ 'x-forwarded-proto': 'https',
+ host: 'localhost:3000',
+ }),
+ );
+
+ expect(url.toString()).toBe('https://umami.is/');
+});
+
+test('falls back to host header', () => {
+ const url = getBaseUrl(
+ createHeaders({
+ host: 'analytics.example.com',
+ }),
+ );
+
+ expect(url.toString()).toBe('https://analytics.example.com/');
+});
+
+test('uses http for localhost hosts', () => {
+ const url = getBaseUrl(
+ createHeaders({
+ host: 'localhost:3000',
+ }),
+ );
+
+ expect(url.toString()).toBe('http://localhost:3000/');
+});
+
+test('falls back to homepage when host is missing', () => {
+ const url = getBaseUrl(createHeaders({}));
+
+ expect(url.toString()).toBe(`${HOMEPAGE_URL}/`);
+});
diff --git a/src/lib/__tests__/match-configured-path.test.ts b/src/lib/__tests__/match-configured-path.test.ts
new file mode 100644
index 000000000..f70ba9c1e
--- /dev/null
+++ b/src/lib/__tests__/match-configured-path.test.ts
@@ -0,0 +1,17 @@
+import { matchesConfiguredPath } from '../match-configured-path';
+
+test('matches the exact configured path', () => {
+ expect(matchesConfiguredPath('/d.js', 'd.js')).toBe(true);
+});
+
+test('does not match unrelated asset paths that only share the suffix', () => {
+ expect(matchesConfiguredPath('/_next/static/chunks/app/dashboard.js', 'd.js')).toBe(false);
+});
+
+test('matches paths under the configured base path', () => {
+ expect(matchesConfiguredPath('/umami/d.js', 'd.js', '/umami')).toBe(true);
+});
+
+test('normalizes leading slashes in configured paths', () => {
+ expect(matchesConfiguredPath('/script.js', '/script.js')).toBe(true);
+});
diff --git a/src/lib/auth.ts b/src/lib/auth.ts
index d67566b82..832dfb600 100644
--- a/src/lib/auth.ts
+++ b/src/lib/auth.ts
@@ -1,33 +1,26 @@
-import bcrypt from 'bcryptjs';
-import { Report } from '@prisma/client';
-import redis from '@/lib/redis';
import debug from 'debug';
-import { PERMISSIONS, ROLE_PERMISSIONS, ROLES, SHARE_TOKEN_HEADER } from '@/lib/constants';
-import { secret, getRandomChars } from '@/lib/crypto';
+import { ROLE_PERMISSIONS, ROLES, SHARE_TOKEN_HEADER } from '@/lib/constants';
+import { createAuthKey, secret } from '@/lib/crypto';
import { createSecureToken, parseSecureToken, parseToken } from '@/lib/jwt';
+import redis from '@/lib/redis';
import { ensureArray } from '@/lib/utils';
-import { getTeamUser, getUser, getWebsite } from '@/queries';
-import { Auth } from './types';
+import { getUser } from '@/queries/prisma/user';
const log = debug('umami:auth');
-const cloudMode = process.env.CLOUD_MODE;
-const SALT_ROUNDS = 10;
-export function hashPassword(password: string, rounds = SALT_ROUNDS) {
- return bcrypt.hashSync(password, rounds);
-}
+export function getBearerToken(request: Request) {
+ const auth = request.headers.get('authorization');
-export function checkPassword(password: string, passwordHash: string) {
- return bcrypt.compareSync(password, passwordHash);
+ return auth?.split(' ')[1];
}
export async function checkAuth(request: Request) {
- const token = request.headers.get('authorization')?.split(' ')?.[1];
+ const token = getBearerToken(request);
const payload = parseSecureToken(token, secret());
- const shareToken = await parseShareToken(request.headers);
+ const shareToken = await parseShareToken(request);
let user = null;
- const { userId, authKey, grant } = payload || {};
+ const { userId, authKey } = payload || {};
if (userId) {
user = await getUser(userId);
@@ -39,12 +32,10 @@ export async function checkAuth(request: Request) {
}
}
- if (process.env.NODE_ENV === 'development') {
- log('checkAuth:', { token, shareToken, payload, user, grant });
- }
+ log({ token, payload, authKey, shareToken, user });
if (!user?.id && !shareToken) {
- log('checkAuth: User not authorized');
+ log('User not authorized');
return null;
}
@@ -53,16 +44,15 @@ export async function checkAuth(request: Request) {
}
return {
- user,
- grant,
token,
- shareToken,
authKey,
+ shareToken,
+ user,
};
}
export async function saveAuth(data: any, expire = 0) {
- const authKey = `auth:${getRandomChars(32)}`;
+ const authKey = `auth:${createAuthKey()}`;
if (redis.enabled) {
await redis.client.set(authKey, data);
@@ -75,247 +65,15 @@ export async function saveAuth(data: any, expire = 0) {
return createSecureToken({ authKey }, secret());
}
-export function parseShareToken(headers: Headers) {
+export async function hasPermission(role: string, permission: string | string[]) {
+ return ensureArray(permission).some(e => ROLE_PERMISSIONS[role]?.includes(e));
+}
+
+export function parseShareToken(request: Request) {
try {
- return parseToken(headers.get(SHARE_TOKEN_HEADER), secret());
+ return parseToken(request.headers.get(SHARE_TOKEN_HEADER), secret());
} catch (e) {
log(e);
return null;
}
}
-
-export async function canViewWebsite({ user, shareToken }: Auth, websiteId: string) {
- if (user?.isAdmin) {
- return true;
- }
-
- if (shareToken?.websiteId === websiteId) {
- return true;
- }
-
- const website = await getWebsite(websiteId);
-
- if (website.userId) {
- return user.id === website.userId;
- }
-
- if (website.teamId) {
- const teamUser = await getTeamUser(website.teamId, user.id);
-
- return !!teamUser;
- }
-
- return false;
-}
-
-export async function canViewAllWebsites({ user }: Auth) {
- return user.isAdmin;
-}
-
-export async function canCreateWebsite({ user, grant }: Auth) {
- if (cloudMode) {
- return !!grant?.find(a => a === PERMISSIONS.websiteCreate);
- }
-
- if (user.isAdmin) {
- return true;
- }
-
- return hasPermission(user.role, PERMISSIONS.websiteCreate);
-}
-
-export async function canUpdateWebsite({ user }: Auth, websiteId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- const website = await getWebsite(websiteId);
-
- if (website.userId) {
- return user.id === website.userId;
- }
-
- if (website.teamId) {
- const teamUser = await getTeamUser(website.teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
- }
-
- return false;
-}
-
-export async function canTransferWebsiteToUser({ user }: Auth, websiteId: string, userId: string) {
- const website = await getWebsite(websiteId);
-
- if (website.teamId && user.id === userId) {
- const teamUser = await getTeamUser(website.teamId, userId);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteTransferToUser);
- }
-
- return false;
-}
-
-export async function canTransferWebsiteToTeam({ user }: Auth, websiteId: string, teamId: string) {
- const website = await getWebsite(websiteId);
-
- if (website.userId && website.userId === user.id) {
- const teamUser = await getTeamUser(teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteTransferToTeam);
- }
-
- return false;
-}
-
-export async function canDeleteWebsite({ user }: Auth, websiteId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- const website = await getWebsite(websiteId);
-
- if (website.userId) {
- return user.id === website.userId;
- }
-
- if (website.teamId) {
- const teamUser = await getTeamUser(website.teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
- }
-
- return false;
-}
-
-export async function canViewReport(auth: Auth, report: Report) {
- if (auth.user.isAdmin) {
- return true;
- }
-
- if (auth.user.id == report.userId) {
- return true;
- }
-
- return !!(await canViewWebsite(auth, report.websiteId));
-}
-
-export async function canUpdateReport({ user }: Auth, report: Report) {
- if (user.isAdmin) {
- return true;
- }
-
- return user.id == report.userId;
-}
-
-export async function canDeleteReport(auth: Auth, report: Report) {
- return canUpdateReport(auth, report);
-}
-
-export async function canCreateTeam({ user, grant }: Auth) {
- if (cloudMode) {
- return !!grant?.find(a => a === PERMISSIONS.teamCreate);
- }
-
- if (user.isAdmin) {
- return true;
- }
-
- return !!user;
-}
-
-export async function canViewTeam({ user }: Auth, teamId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- return getTeamUser(teamId, user.id);
-}
-
-export async function canUpdateTeam({ user, grant }: Auth, teamId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- if (cloudMode) {
- return !!grant?.find(a => a === PERMISSIONS.teamUpdate);
- }
-
- const teamUser = await getTeamUser(teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamUpdate);
-}
-
-export async function canAddUserToTeam({ user, grant }: Auth) {
- if (cloudMode) {
- return !!grant?.find(a => a === PERMISSIONS.teamUpdate);
- }
-
- return user.isAdmin;
-}
-
-export async function canDeleteTeam({ user }: Auth, teamId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- const teamUser = await getTeamUser(teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamDelete);
-}
-
-export async function canDeleteTeamUser({ user }: Auth, teamId: string, removeUserId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- if (removeUserId === user.id) {
- return true;
- }
-
- const teamUser = await getTeamUser(teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamUpdate);
-}
-
-export async function canCreateTeamWebsite({ user }: Auth, teamId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- const teamUser = await getTeamUser(teamId, user.id);
-
- return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteCreate);
-}
-
-export async function canCreateUser({ user }: Auth) {
- return user.isAdmin;
-}
-
-export async function canViewUser({ user }: Auth, viewedUserId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- return user.id === viewedUserId;
-}
-
-export async function canViewUsers({ user }: Auth) {
- return user.isAdmin;
-}
-
-export async function canUpdateUser({ user }: Auth, viewedUserId: string) {
- if (user.isAdmin) {
- return true;
- }
-
- return user.id === viewedUserId;
-}
-
-export async function canDeleteUser({ user }: Auth) {
- return user.isAdmin;
-}
-
-export async function hasPermission(role: string, permission: string | string[]) {
- return ensureArray(permission).some(e => ROLE_PERMISSIONS[role]?.includes(e));
-}
diff --git a/src/lib/boardComponentCompatibility.ts b/src/lib/boardComponentCompatibility.ts
new file mode 100644
index 000000000..943701962
--- /dev/null
+++ b/src/lib/boardComponentCompatibility.ts
@@ -0,0 +1,22 @@
+import type { BoardEntityType } from './boards';
+
+export const BOARD_COMPONENT_COMPATIBILITY_MATRIX = {
+ EventsChart: ['website'],
+} as const satisfies Partial>;
+
+export function getSupportedBoardComponentEntityTypes(componentType: string) {
+ return BOARD_COMPONENT_COMPATIBILITY_MATRIX[componentType];
+}
+
+export function isBoardComponentSupportedByEntityType(
+ componentType: string,
+ entityType?: BoardEntityType,
+) {
+ const supportedEntityTypes = getSupportedBoardComponentEntityTypes(componentType);
+
+ if (!entityType || !supportedEntityTypes) {
+ return true;
+ }
+
+ return supportedEntityTypes.includes(entityType);
+}
diff --git a/src/lib/boards.ts b/src/lib/boards.ts
new file mode 100644
index 000000000..e0087c16c
--- /dev/null
+++ b/src/lib/boards.ts
@@ -0,0 +1,220 @@
+import type { Board, BoardComponentConfig, BoardParameters } from './types';
+import { isBoardComponentSupportedByEntityType } from './boardComponentCompatibility';
+
+export const BOARD_TYPES = {
+ dashboard: 'dashboard',
+ mixed: 'mixed',
+ website: 'website',
+ pixel: 'pixel',
+ link: 'link',
+} as const;
+
+export const BOARD_ENTITY_TYPES = {
+ website: 'website',
+ pixel: 'pixel',
+ link: 'link',
+} as const;
+
+export type BoardType = (typeof BOARD_TYPES)[keyof typeof BOARD_TYPES];
+export type BoardEntityType = (typeof BOARD_ENTITY_TYPES)[keyof typeof BOARD_ENTITY_TYPES];
+
+const boardTypes = new Set(Object.values(BOARD_TYPES));
+
+export function getLegacyBoardType(parameters?: BoardParameters): BoardType {
+ if (parameters?.pixelId) {
+ return BOARD_TYPES.pixel;
+ }
+
+ if (parameters?.linkId) {
+ return BOARD_TYPES.link;
+ }
+
+ if (parameters?.websiteId) {
+ return BOARD_TYPES.website;
+ }
+
+ return BOARD_TYPES.mixed;
+}
+
+export function normalizeBoardType(type?: string): BoardType | undefined {
+ if (type === 'open') {
+ return BOARD_TYPES.mixed;
+ }
+
+ if (type && boardTypes.has(type)) {
+ return type as BoardType;
+ }
+
+ return undefined;
+}
+
+export function getBoardType(
+ board?: Pick | Partial,
+ { coerceDashboard = false }: { coerceDashboard?: boolean } = {},
+): BoardType {
+ const type = board?.type;
+
+ if (type === BOARD_TYPES.dashboard && coerceDashboard) {
+ return getLegacyBoardType(board?.parameters);
+ }
+
+ const normalizedType = normalizeBoardType(type);
+
+ if (normalizedType) {
+ return normalizedType;
+ }
+
+ return getLegacyBoardType(board?.parameters);
+}
+
+export function isOpenBoardType(type?: string) {
+ return type === BOARD_TYPES.mixed || type === BOARD_TYPES.dashboard || type === 'open';
+}
+
+export function requiresBoardEntity(type?: string) {
+ return (
+ type === BOARD_TYPES.website || type === BOARD_TYPES.pixel || type === BOARD_TYPES.link
+ );
+}
+
+export function getBoardEntity(board?: Pick | Partial): {
+ entityType?: BoardEntityType;
+ entityId?: string;
+} {
+ const type = getBoardType(board);
+
+ if (type === BOARD_TYPES.website) {
+ return {
+ entityType: BOARD_ENTITY_TYPES.website,
+ entityId: board?.parameters?.websiteId,
+ };
+ }
+
+ if (type === BOARD_TYPES.pixel) {
+ return {
+ entityType: BOARD_ENTITY_TYPES.pixel,
+ entityId: board?.parameters?.pixelId,
+ };
+ }
+
+ if (type === BOARD_TYPES.link) {
+ return {
+ entityType: BOARD_ENTITY_TYPES.link,
+ entityId: board?.parameters?.linkId,
+ };
+ }
+
+ return {};
+}
+
+export function getComponentEntity(config?: BoardComponentConfig): {
+ entityType?: BoardEntityType;
+ entityId?: string;
+} {
+ if (config?.entityType && config?.entityId) {
+ return {
+ entityType: config.entityType,
+ entityId: config.entityId,
+ };
+ }
+
+ if (config?.websiteId) {
+ return {
+ entityType: BOARD_ENTITY_TYPES.website,
+ entityId: config.websiteId,
+ };
+ }
+
+ return {};
+}
+
+export function getResolvedComponentEntity(
+ board?: Pick | Partial,
+ config?: BoardComponentConfig,
+) {
+ const boardEntity = getBoardEntity(board);
+
+ if (boardEntity.entityId) {
+ return boardEntity;
+ }
+
+ return getComponentEntity(config);
+}
+
+export function isBoardComponentSupported(
+ componentType: string,
+ entityType?: BoardEntityType,
+) {
+ return isBoardComponentSupportedByEntityType(componentType, entityType);
+}
+
+export function getFirstBoardComponentEntity(
+ board?: Pick | Partial,
+) {
+ for (const row of board?.parameters?.rows ?? []) {
+ for (const column of row.columns ?? []) {
+ const entity = getComponentEntity(column.component);
+
+ if (entity.entityId) {
+ return entity;
+ }
+ }
+ }
+
+ return {};
+}
+
+export function getBoardWebsiteIds(
+ board?: Pick | Partial,
+): string[] {
+ const ids = new Set();
+ const boardEntity = getBoardEntity(board);
+
+ if (boardEntity.entityType === BOARD_ENTITY_TYPES.website && boardEntity.entityId) {
+ ids.add(boardEntity.entityId);
+ }
+
+ if (board?.parameters?.websiteId) {
+ ids.add(board.parameters.websiteId);
+ }
+
+ for (const row of board?.parameters?.rows ?? []) {
+ for (const column of row.columns ?? []) {
+ const entity = getComponentEntity(column.component);
+
+ if (entity.entityType === BOARD_ENTITY_TYPES.website && entity.entityId) {
+ ids.add(entity.entityId);
+ }
+ }
+ }
+
+ return [...ids];
+}
+
+export function clearBoardEntity(parameters: BoardParameters = {}): BoardParameters {
+ const { websiteId, pixelId, linkId, ...rest } = parameters;
+
+ return rest;
+}
+
+export function setBoardEntity(
+ parameters: BoardParameters = {},
+ type: BoardType,
+ entityId?: string,
+): BoardParameters {
+ const next = clearBoardEntity(parameters);
+
+ if (type === BOARD_TYPES.website && entityId) {
+ next.websiteId = entityId;
+ }
+
+ if (type === BOARD_TYPES.pixel && entityId) {
+ next.pixelId = entityId;
+ }
+
+ if (type === BOARD_TYPES.link && entityId) {
+ next.linkId = entityId;
+ }
+
+ return next;
+}
diff --git a/src/lib/charts.ts b/src/lib/charts.ts
index 7d4208e2a..1458cff84 100644
--- a/src/lib/charts.ts
+++ b/src/lib/charts.ts
@@ -11,7 +11,6 @@ export function renderDateLabels(unit: string, locale: string) {
switch (unit) {
case 'minute':
- return formatDate(d, 'h:mm', locale);
case 'hour':
return formatDate(d, 'p', locale);
case 'day':
diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts
index 062952d75..ef134a0cb 100644
--- a/src/lib/clickhouse.ts
+++ b/src/lib/clickhouse.ts
@@ -1,12 +1,10 @@
-import { ClickHouseClient, createClient } from '@clickhouse/client';
+import { type ClickHouseClient, createClient } from '@clickhouse/client';
import { formatInTimeZone } from 'date-fns-tz';
import debug from 'debug';
import { CLICKHOUSE } from '@/lib/db';
-import { getWebsite } from '@/queries';
-import { DEFAULT_PAGE_SIZE, OPERATORS } from './constants';
-import { maxDate } from './date';
-import { filtersToArray } from './params';
-import { PageParams, QueryFilters, QueryOptions } from './types';
+import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS, OPERATORS } from './constants';
+import { filtersObjectToArray } from './params';
+import type { QueryFilters, QueryOptions } from './types';
export const CLICKHOUSE_DATE_FORMATS = {
utc: '%Y-%m-%dT%H:%i:%SZ',
@@ -41,7 +39,7 @@ function getClient() {
});
if (process.env.NODE_ENV !== 'production') {
- global[CLICKHOUSE] = client;
+ globalThis[CLICKHOUSE] = client;
}
log('Clickhouse initialized');
@@ -72,91 +70,116 @@ function getSearchSQL(column: string, param: string = 'search'): string {
return `and positionCaseInsensitive(${column}, {${param}:String}) > 0`;
}
-function mapFilter(column: string, operator: string, name: string, type: string = 'String') {
- const value = `{${name}:${type}}`;
+function mapFilter(
+ column: string,
+ operator: string,
+ name: string,
+ type: string = 'String',
+ paramName?: string,
+) {
+ const param = paramName ?? name;
+ const value = `{${param}:${type}}`;
switch (operator) {
case OPERATORS.equals:
- return `${column} = ${value}`;
+ return `${column} IN {${param}:Array(${type})}`;
case OPERATORS.notEquals:
- return `${column} != ${value}`;
+ return `${column} NOT IN {${param}:Array(${type})}`;
case OPERATORS.contains:
return `positionCaseInsensitive(${column}, ${value}) > 0`;
case OPERATORS.doesNotContain:
return `positionCaseInsensitive(${column}, ${value}) = 0`;
+ case OPERATORS.regex:
+ return `match(${column}, ${value})`;
+ case OPERATORS.notRegex:
+ return `not match(${column}, ${value})`;
default:
return '';
}
}
-function mapCohortFilter(column: string, operator: string, value: string) {
- switch (operator) {
- case OPERATORS.equals:
- return `${column} = '${value}'`;
- case OPERATORS.notEquals:
- return `${column} != '${value}'`;
- case OPERATORS.contains:
- return `positionCaseInsensitive(${column}, '${value}') > 0`;
- case OPERATORS.doesNotContain:
- return `positionCaseInsensitive(${column}, '${value}') = 0`;
- default:
- return '';
- }
-}
+function getFilterQuery(filters: Record, options: QueryOptions = {}) {
+ const { isCohort, cohortMatch, cohortActionName } = options;
+ const isOr = isCohort ? cohortMatch === 'any' : filters.match === 'any';
+ const orClauses: string[] = [];
+ const andClauses: string[] = [];
-function getFilterQuery(filters: QueryFilters = {}, options: QueryOptions = {}) {
- const query = filtersToArray(filters, options).reduce((arr, { name, column, operator }) => {
- if (column) {
- arr.push(`and ${mapFilter(column, operator, name)}`);
-
- if (name === 'referrer') {
- arr.push(`and referrer_domain != hostname`);
- }
+ filtersObjectToArray(filters, options).forEach(({ name, column, operator, paramName }) => {
+ if (isCohort) {
+ column = FILTER_COLUMNS[name.slice('cohort_'.length)];
}
- return arr;
- }, []);
+ if (column) {
+ const isAlwaysAnd = name === 'eventType' || (isCohort && name === cohortActionName);
- return query.join('\n');
-}
-
-function getCohortQuery(websiteId: string, filters: QueryFilters = {}, options: QueryOptions = {}) {
- const query = filtersToArray(filters, options).reduce(
- (arr, { name, column, operator, value }) => {
- if (column) {
- arr.push(
- `${arr.length === 0 ? 'where' : 'and'} ${mapCohortFilter(column, operator, value)}`,
+ if (isAlwaysAnd) {
+ andClauses.push(
+ `and ${mapFilter(column, operator, name, name === 'eventType' ? 'UInt32' : 'String', paramName)}`,
);
-
- if (name === 'referrer') {
- arr.push(`and referrer_domain != hostname`);
- }
+ } else if (isOr) {
+ orClauses.push(mapFilter(column, operator, name, 'String', paramName));
+ } else {
+ andClauses.push(`and ${mapFilter(column, operator, name, 'String', paramName)}`);
}
- return arr;
- },
- [],
- );
+ if (name === 'referrer') {
+ andClauses.push(`and referrer_domain != hostname`);
+ }
+ }
+ });
- if (query.length > 0) {
- // add website and date range filters
- query.push(`and website_id = '${websiteId}'`);
- query.push(
- `and created_at between parseDateTimeBestEffort('${filters.startDate}') and parseDateTimeBestEffort('${filters.endDate}')`,
- );
+ const parts: string[] = [];
- return `join
- (select distinct session_id
- from website_event
- ${query.join('\n')}) cohort
- on cohort.session_id = website_event.session_id
- `;
+ if (orClauses.length > 0) {
+ parts.push(`and (\n ${orClauses.join('\n or ')}\n)`);
}
- return '';
+ parts.push(...andClauses);
+
+ return parts.join('\n');
}
-function getDateQuery(filters: QueryFilters = {}) {
+function getCohortQuery(filters: Record) {
+ if (!filters || Object.keys(filters).length === 0) {
+ return '';
+ }
+
+ const cohortMatch = filters.cohort_match;
+ const cohortActionName = filters.cohort_actionName;
+
+ const filterQuery = getFilterQuery(filters, { isCohort: true, cohortMatch, cohortActionName });
+
+ return `join (
+ select distinct session_id
+ from website_event
+ where website_id = {websiteId:UUID}
+ and created_at between {cohort_startDate:DateTime64} and {cohort_endDate:DateTime64}
+ ${filterQuery}
+ ) as cohort
+ on cohort.session_id = website_event.session_id
+ `;
+}
+
+function getExcludeBounceQuery(filters: Record) {
+ if (!filters.excludeBounce === true) {
+ return '';
+ }
+
+ return `join
+ (select distinct session_id, visit_id
+ from website_event_stats_hourly
+ where website_id = {websiteId:UUID}
+ and created_at between {startDate:DateTime64} and {endDate:DateTime64}
+ and event_type = 1
+ group by session_id, visit_id
+ having sum(views) > 1
+ ) excludeBounce
+ on excludeBounce.session_id = website_event.session_id
+ and excludeBounce.visit_id = website_event.visit_id
+ `;
+}
+
+function getDateQuery(filters: Record) {
const { startDate, endDate, timezone } = filters;
if (startDate) {
@@ -176,37 +199,49 @@ function getDateQuery(filters: QueryFilters = {}) {
return '';
}
-function getFilterParams(filters: QueryFilters = {}) {
- return filtersToArray(filters).reduce((obj, { name, value }) => {
- if (name && value !== undefined) {
- obj[name] = value;
- }
+function getQueryParams(filters: Record) {
+ return {
+ ...filters,
+ ...filtersObjectToArray(filters).reduce((obj, { name, column, operator, value, paramName }) => {
+ const resolvedColumn =
+ column || (name?.startsWith('cohort_') && FILTER_COLUMNS[name.slice('cohort_'.length)]);
- return obj;
- }, {});
+ if (!resolvedColumn || !name || value === undefined) return obj;
+
+ const key = paramName ?? name;
+
+ obj[key] = ([OPERATORS.equals, OPERATORS.notEquals] as string[]).includes(operator)
+ ? Array.isArray(value)
+ ? value
+ : [value]
+ : value;
+
+ return obj;
+ }, {}),
+ };
}
-async function parseFilters(websiteId: string, filters: QueryFilters = {}, options?: QueryOptions) {
- const website = await getWebsite(websiteId);
+function parseFilters(filters: Record, options?: QueryOptions) {
+ const cohortFilters = Object.fromEntries(
+ Object.entries(filters).filter(([key]) => key.startsWith('cohort_')),
+ );
return {
filterQuery: getFilterQuery(filters, options),
dateQuery: getDateQuery(filters),
- params: {
- ...getFilterParams(filters),
- websiteId,
- startDate: maxDate(filters.startDate, new Date(website?.resetAt)),
- },
- cohortQuery: getCohortQuery(websiteId, filters?.cohort),
+ queryParams: getQueryParams(filters),
+ cohortQuery: getCohortQuery(cohortFilters),
+ excludeBounceQuery: getExcludeBounceQuery(filters),
};
}
-async function pagedQuery(
+async function pagedRawQuery(
query: string,
- queryParams: { [key: string]: any },
- pageParams: PageParams = {},
+ queryParams: Record,
+ filters: QueryFilters,
+ name?: string,
) {
- const { page = 1, pageSize, orderBy, sortDescending = false } = pageParams;
+ const { page = 1, pageSize, orderBy, sortDescending = false, search } = filters;
const size = +pageSize || DEFAULT_PAGE_SIZE;
const offset = +size * (+page - 1);
const direction = sortDescending ? 'desc' : 'asc';
@@ -222,18 +257,18 @@ async function pagedQuery(
res => res[0].num,
);
- const data = await rawQuery(`${query}${statements}`, queryParams);
+ const data = await rawQuery(`${query}${statements}`, queryParams, name);
- return { data, count, page: +page, pageSize: size, orderBy };
+ return { data, count, page: +page, pageSize: size, orderBy, search };
}
async function rawQuery(
query: string,
params: Record = {},
+ name?: string,
): Promise {
if (process.env.LOG_QUERY) {
- log('QUERY:\n', query);
- log('PARAMETERS:\n', params);
+ log({ query, params, name });
}
await connect();
@@ -271,7 +306,7 @@ async function findFirst(data: any[]) {
async function connect() {
if (enabled && !clickhouse) {
- clickhouse = process.env.CLICKHOUSE_URL && (global[CLICKHOUSE] || getClient());
+ clickhouse = process.env.CLICKHOUSE_URL && (globalThis[CLICKHOUSE] || getClient());
}
return clickhouse;
@@ -288,7 +323,7 @@ export default {
getFilterQuery,
getUTCString,
parseFilters,
- pagedQuery,
+ pagedRawQuery,
findUnique,
findFirst,
rawQuery,
diff --git a/src/lib/client.ts b/src/lib/client.ts
index 795e7780c..e176215e6 100644
--- a/src/lib/client.ts
+++ b/src/lib/client.ts
@@ -1,4 +1,4 @@
-import { getItem, setItem, removeItem } from '@/lib/storage';
+import { getItem, removeItem, setItem } from '@/lib/storage';
import { AUTH_TOKEN } from './constants';
export function getClientAuthToken() {
diff --git a/src/lib/colors.ts b/src/lib/colors.ts
index ba329805d..2ae9bda59 100644
--- a/src/lib/colors.ts
+++ b/src/lib/colors.ts
@@ -1,4 +1,15 @@
-import md5 from 'md5';
+import { colord } from 'colord';
+import { THEME_COLORS } from '@/lib/constants';
+
+export function hex6(str: string) {
+ let h = 0x811c9dc5; // FNV-1a 32-bit offset
+ for (let i = 0; i < str.length; i++) {
+ h ^= str.charCodeAt(i);
+ h = (h >>> 0) * 0x01000193; // FNV prime
+ }
+ // use lower 24 bits; pad to 6 hex chars
+ return ((h >>> 0) & 0xffffff).toString(16).padStart(6, '0');
+}
export const pick = (num: number, arr: any[]) => {
return arr[num % arr.length];
@@ -38,8 +49,43 @@ export function getPastel(color: string, factor: number = 0.5, prefix = '') {
}
export function getColor(seed: string, min: number = 0, max: number = 255) {
- const color = md5(seed).substring(0, 6);
+ const color = hex6(seed);
const { r, g, b } = hex2RGB(color, min, max);
return rgb2Hex(r, g, b);
}
+
+export function getThemeColors(theme: string) {
+ const { primary, text, line, fill } = THEME_COLORS[theme];
+ const primaryColor = colord(THEME_COLORS[theme].primary);
+
+ return {
+ colors: {
+ theme: {
+ ...THEME_COLORS[theme],
+ },
+ chart: {
+ text,
+ line,
+ views: {
+ hoverBackgroundColor: primaryColor.alpha(0.7).toRgbString(),
+ backgroundColor: primaryColor.alpha(0.4).toRgbString(),
+ borderColor: primaryColor.alpha(0.7).toRgbString(),
+ hoverBorderColor: primaryColor.toRgbString(),
+ },
+ visitors: {
+ hoverBackgroundColor: primaryColor.alpha(0.9).toRgbString(),
+ backgroundColor: primaryColor.alpha(0.6).toRgbString(),
+ borderColor: primaryColor.alpha(0.9).toRgbString(),
+ hoverBorderColor: primaryColor.toRgbString(),
+ },
+ },
+ map: {
+ baseColor: primary,
+ fillColor: fill,
+ strokeColor: primary,
+ hoverColor: primary,
+ },
+ },
+ };
+}
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index e13ca3813..a4a004f31 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -4,45 +4,51 @@ export const LOCALE_CONFIG = 'umami.locale';
export const TIMEZONE_CONFIG = 'umami.timezone';
export const DATE_RANGE_CONFIG = 'umami.date-range';
export const THEME_CONFIG = 'umami.theme';
+export const CURRENCY_CONFIG = 'umami.currency';
export const DASHBOARD_CONFIG = 'umami.dashboard';
+export const LAST_TEAM_CONFIG = 'umami.last-team';
export const VERSION_CHECK = 'umami.version-check';
export const SHARE_TOKEN_HEADER = 'x-umami-share-token';
export const HOMEPAGE_URL = 'https://umami.is';
+export const DOCS_URL = 'https://umami.is/docs';
export const REPO_URL = 'https://github.com/umami-software/umami';
export const UPDATES_URL = 'https://api.umami.is/v1/updates';
export const TELEMETRY_PIXEL = 'https://i.umami.is/a.png';
export const FAVICON_URL = 'https://icons.duckduckgo.com/ip3/{{domain}}.ico';
+export const LINKS_URL = `${globalThis?.location?.origin}/q`;
+export const PIXELS_URL = `${globalThis?.location?.origin}/p`;
export const DEFAULT_LOCALE = 'en-US';
export const DEFAULT_THEME = 'light';
export const DEFAULT_ANIMATION_DURATION = 300;
-export const DEFAULT_DATE_RANGE = '24hour';
+export const DEFAULT_DATE_RANGE_VALUE = '24hour';
export const DEFAULT_WEBSITE_LIMIT = 10;
export const DEFAULT_RESET_DATE = '2000-01-01';
-export const DEFAULT_PAGE_SIZE = 10;
+export const DEFAULT_PAGE_SIZE = 20;
export const DEFAULT_DATE_COMPARE = 'prev';
+export const DEFAULT_CURRENCY = 'USD';
export const REALTIME_RANGE = 30;
export const REALTIME_INTERVAL = 10000;
-export const FILTER_COMBINED = 'filter-combined';
-export const FILTER_RAW = 'filter-raw';
-export const FILTER_DAY = 'filter-day';
-export const FILTER_RANGE = 'filter-range';
-export const FILTER_REFERRERS = 'filter-referrers';
-export const FILTER_PAGES = 'filter-pages';
-
export const UNIT_TYPES = ['year', 'month', 'hour', 'day', 'minute'];
+
export const EVENT_COLUMNS = [
- 'url',
+ 'path',
'entry',
'exit',
'referrer',
+ 'domain',
'title',
'query',
'event',
'tag',
- 'host',
+ 'hostname',
+ 'utmSource',
+ 'utmMedium',
+ 'utmCampaign',
+ 'utmContent',
+ 'utmTerm',
];
export const SESSION_COLUMNS = [
@@ -54,19 +60,22 @@ export const SESSION_COLUMNS = [
'country',
'city',
'region',
+ 'distinctId',
];
-export const FILTER_GROUPS = {
+export const SEGMENT_TYPES = {
segment: 'segment',
cohort: 'cohort',
};
export const FILTER_COLUMNS = {
- url: 'url_path',
+ path: 'url_path',
entry: 'url_path',
exit: 'url_path',
referrer: 'referrer_domain',
- host: 'hostname',
+ domain: 'referrer_domain',
+ hostname: 'hostname',
+ distinctId: 'distinct_id',
title: 'page_title',
query: 'url_query',
os: 'os',
@@ -78,16 +87,42 @@ export const FILTER_COLUMNS = {
language: 'language',
event: 'event_name',
tag: 'tag',
+ eventType: 'event_type',
+ utmSource: 'utm_source',
+ utmMedium: 'utm_medium',
+ utmCampaign: 'utm_campaign',
+ utmContent: 'utm_content',
+ utmTerm: 'utm_term',
};
export const COLLECTION_TYPE = {
event: 'event',
identify: 'identify',
-};
+ performance: 'performance',
+ record: 'record',
+} as const;
+
+export const WEB_VITALS_THRESHOLDS = {
+ lcp: { good: 2500, poor: 4000, unit: 'ms' },
+ inp: { good: 200, poor: 500, unit: 'ms' },
+ cls: { good: 0.1, poor: 0.25, unit: '' },
+ fcp: { good: 1800, poor: 3000, unit: 'ms' },
+ ttfb: { good: 800, poor: 1800, unit: 'ms' },
+} as const;
export const EVENT_TYPE = {
pageView: 1,
customEvent: 2,
+ linkEvent: 3,
+ pixelEvent: 4,
+ performance: 5,
+} as const;
+
+export const ENTITY_TYPE = {
+ website: 1,
+ link: 2,
+ pixel: 3,
+ board: 4,
} as const;
export const DATA_TYPE = {
@@ -105,6 +140,8 @@ export const OPERATORS = {
notSet: 'ns',
contains: 'c',
doesNotContain: 'dnc',
+ regex: 're',
+ notRegex: 'nre',
true: 't',
false: 'f',
greaterThan: 'gt',
@@ -115,51 +152,22 @@ export const OPERATORS = {
after: 'af',
} as const;
-export const OPERATOR_PREFIXES = {
- [OPERATORS.equals]: '',
- [OPERATORS.notEquals]: '!',
- [OPERATORS.contains]: '~',
- [OPERATORS.doesNotContain]: '!~',
-};
-
export const DATA_TYPES = {
[DATA_TYPE.string]: 'string',
[DATA_TYPE.number]: 'number',
[DATA_TYPE.boolean]: 'boolean',
[DATA_TYPE.date]: 'date',
[DATA_TYPE.array]: 'array',
-};
-
-export const REPORT_TYPES = {
- funnel: 'funnel',
- goals: 'goals',
- insights: 'insights',
- retention: 'retention',
- utm: 'utm',
- journey: 'journey',
- revenue: 'revenue',
- attribution: 'attribution',
-} as const;
-
-export const REPORT_PARAMETERS = {
- fields: 'fields',
- filters: 'filters',
- groups: 'groups',
-} as const;
-
-export const KAFKA_TOPIC = {
- event: 'event',
- eventData: 'event_data',
} as const;
export const ROLES = {
admin: 'admin',
- teamManager: 'team-manager',
- teamMember: 'team-member',
- teamOwner: 'team-owner',
- teamViewOnly: 'team-view-only',
user: 'user',
viewOnly: 'view-only',
+ teamOwner: 'team-owner',
+ teamManager: 'team-manager',
+ teamMember: 'team-member',
+ teamViewOnly: 'team-view-only',
} as const;
export const PERMISSIONS = {
@@ -210,33 +218,17 @@ export const ROLE_PERMISSIONS = {
export const THEME_COLORS = {
light: {
primary: '#2680eb',
- gray50: '#ffffff',
- gray75: '#fafafa',
- gray100: '#f5f5f5',
- gray200: '#eaeaea',
- gray300: '#e1e1e1',
- gray400: '#cacaca',
- gray500: '#b3b3b3',
- gray600: '#8e8e8e',
- gray700: '#6e6e6e',
- gray800: '#4b4b4b',
- gray900: '#2c2c2c',
+ text: '#838383',
+ line: '#d9d9d9',
+ fill: '#f9f9f9',
},
dark: {
primary: '#2680eb',
- gray50: '#252525',
- gray75: '#2f2f2f',
- gray100: '#323232',
- gray200: '#3e3e3e',
- gray300: '#4a4a4a',
- gray400: '#5a5a5a',
- gray500: '#6e6e6e',
- gray600: '#909090',
- gray700: '#b9b9b9',
- gray800: '#e3e3e3',
- gray900: '#ffffff',
+ text: '#7b7b7b',
+ line: '#3a3a3a',
+ fill: '#191919',
},
-};
+} as const;
export const CHART_COLORS = [
'#2680eb',
@@ -255,52 +247,23 @@ export const CHART_COLORS = [
export const DOMAIN_REGEX =
/^(localhost(:[1-9]\d{0,4})?|((?=[a-z0-9-_]{1,63}\.)(xn--)?[a-z0-9-_]+(-[a-z0-9-_]+)*\.)+(xn--)?[a-z0-9-_]{2,63})$/;
-export const SHARE_ID_REGEX = /^[a-zA-Z0-9]{8,16}$/;
+export const SHARE_ID_REGEX = /^[a-zA-Z0-9]{8,50}$/;
export const DATETIME_REGEX =
/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{3}(Z|\+[0-9]{2}:[0-9]{2})?)?$/;
-export const DESKTOP_SCREEN_WIDTH = 1920;
-export const LAPTOP_SCREEN_WIDTH = 1024;
-export const MOBILE_SCREEN_WIDTH = 479;
-
export const URL_LENGTH = 500;
export const PAGE_TITLE_LENGTH = 500;
export const EVENT_NAME_LENGTH = 50;
export const UTM_PARAMS = ['utm_campaign', 'utm_content', 'utm_medium', 'utm_source', 'utm_term'];
-export const DESKTOP_OS = [
- 'BeOS',
- 'Chrome OS',
- 'Linux',
- 'Mac OS',
- 'Open BSD',
- 'OS/2',
- 'QNX',
- 'Sun OS',
- 'Windows 10',
- 'Windows 2000',
- 'Windows 3.11',
- 'Windows 7',
- 'Windows 8',
- 'Windows 8.1',
- 'Windows 95',
- 'Windows 98',
- 'Windows ME',
- 'Windows Server 2003',
- 'Windows Vista',
- 'Windows XP',
-];
-
-export const MOBILE_OS = ['Amazon OS', 'Android OS', 'BlackBerry OS', 'iOS', 'Windows Mobile'];
-
export const OS_NAMES = {
'Android OS': 'Android',
'Chrome OS': 'ChromeOS',
'Mac OS': 'macOS',
'Sun OS': 'SunOS',
'Windows 10': 'Windows 10/11',
-};
+} as const;
export const BROWSERS = {
android: 'Android',
@@ -331,25 +294,7 @@ export const BROWSERS = {
searchbot: 'Searchbot',
silk: 'Silk',
yandexbrowser: 'Yandex',
-};
-
-// The order here is important and influences how IPs are detected by lib/detect.ts
-// Please do not change the order unless you know exactly what you're doing - read https://developers.cloudflare.com/fundamentals/reference/http-headers/
-export const IP_ADDRESS_HEADERS = [
- 'x-client-ip',
- 'x-forwarded-for',
- 'cf-connecting-ip', // This should be *after* x-forwarded-for, so that x-forwarded-for is respected if present
- 'do-connecting-ip',
- 'fastly-client-ip',
- 'true-client-ip',
- 'x-real-ip',
- 'x-cluster-client-ip',
- 'x-forwarded',
- 'forwarded',
- 'x-appengine-user-ip',
- 'x-nf-client-connection-ip',
- 'x-real-ip',
-];
+} as const;
export const SOCIAL_DOMAINS = [
'bsky.app',
@@ -427,6 +372,7 @@ export const PAID_AD_PARAMS = [
];
export const GROUPED_DOMAINS = [
+ { name: 'Baidu', domain: 'baidu.com', match: 'baidu.' },
{ name: 'Bing', domain: 'bing.com', match: 'bing.' },
{ name: 'Brave', domain: 'brave.com', match: 'brave.' },
{ name: 'ChatGPT', domain: 'chatgpt.com', match: 'chatgpt.' },
@@ -441,6 +387,8 @@ export const GROUPED_DOMAINS = [
{ name: 'Reddit', domain: 'reddit.com', match: 'reddit.' },
{ name: 'Snapchat', domain: 'snapchat.com', match: 'snapchat.' },
{ name: 'Twitter', domain: 'twitter.com', match: ['twitter.', 't.co', 'x.com'] },
+ { name: 'Yahoo', domain: 'yahoo.com', match: 'yahoo.' },
+ { name: 'Yandex', domain: 'yandex.ru', match: 'yandex.' },
];
export const MAP_FILE = '/datamaps.world.json';
@@ -692,3 +640,77 @@ export const ISO_COUNTRIES = {
ZMB: 'ZM',
ZWE: 'ZW',
};
+
+export const CURRENCIES = [
+ { id: 'USD', name: 'US Dollar' },
+ { id: 'EUR', name: 'Euro' },
+ { id: 'GBP', name: 'British Pound' },
+ { id: 'JPY', name: 'Japanese Yen' },
+ { id: 'CNY', name: 'Chinese Renminbi (Yuan)' },
+ { id: 'CAD', name: 'Canadian Dollar' },
+ { id: 'HKD', name: 'Hong Kong Dollar' },
+ { id: 'AUD', name: 'Australian Dollar' },
+ { id: 'SGD', name: 'Singapore Dollar' },
+ { id: 'CHF', name: 'Swiss Franc' },
+ { id: 'SEK', name: 'Swedish Krona' },
+ { id: 'PLN', name: 'Polish Złoty' },
+ { id: 'NOK', name: 'Norwegian Krone' },
+ { id: 'DKK', name: 'Danish Krone' },
+ { id: 'NZD', name: 'New Zealand Dollar' },
+ { id: 'ZAR', name: 'South African Rand' },
+ { id: 'MXN', name: 'Mexican Peso' },
+ { id: 'THB', name: 'Thai Baht' },
+ { id: 'HUF', name: 'Hungarian Forint' },
+ { id: 'MYR', name: 'Malaysian Ringgit' },
+ { id: 'INR', name: 'Indian Rupee' },
+ { id: 'KRW', name: 'South Korean Won' },
+ { id: 'BRL', name: 'Brazilian Real' },
+ { id: 'TRY', name: 'Turkish Lira' },
+ { id: 'CZK', name: 'Czech Koruna' },
+ { id: 'ILS', name: 'Israeli New Shekel' },
+ { id: 'RUB', name: 'Russian Ruble' },
+ { id: 'AED', name: 'United Arab Emirates Dirham' },
+ { id: 'IDR', name: 'Indonesian Rupiah' },
+ { id: 'PHP', name: 'Philippine Peso' },
+ { id: 'RON', name: 'Romanian Leu' },
+ { id: 'COP', name: 'Colombian Peso' },
+ { id: 'SAR', name: 'Saudi Riyal' },
+ { id: 'ARS', name: 'Argentine Peso' },
+ { id: 'VND', name: 'Vietnamese Dong' },
+ { id: 'CLP', name: 'Chilean Peso' },
+ { id: 'EGP', name: 'Egyptian Pound' },
+ { id: 'KWD', name: 'Kuwaiti Dinar' },
+ { id: 'PKR', name: 'Pakistani Rupee' },
+ { id: 'QAR', name: 'Qatari Riyal' },
+ { id: 'BHD', name: 'Bahraini Dinar' },
+ { id: 'UAH', name: 'Ukrainian Hryvnia' },
+ { id: 'PEN', name: 'Peruvian Sol' },
+ { id: 'BDT', name: 'Bangladeshi Taka' },
+ { id: 'MAD', name: 'Moroccan Dirham' },
+ { id: 'KES', name: 'Kenyan Shilling' },
+ { id: 'NGN', name: 'Nigerian Naira' },
+ { id: 'TND', name: 'Tunisian Dinar' },
+ { id: 'OMR', name: 'Omani Rial' },
+ { id: 'GHS', name: 'Ghanaian Cedi' },
+];
+
+export const TIMEZONE_LEGACY: Record = {
+ 'Asia/Batavia': 'Asia/Jakarta',
+ 'Asia/Calcutta': 'Asia/Kolkata',
+ 'Asia/Chongqing': 'Asia/Shanghai',
+ 'Asia/Harbin': 'Asia/Shanghai',
+ 'Asia/Jayapura': 'Asia/Pontianak',
+ 'Asia/Katmandu': 'Asia/Kathmandu',
+ 'Asia/Macao': 'Asia/Macau',
+ 'Asia/Rangoon': 'Asia/Yangon',
+ 'Asia/Saigon': 'Asia/Ho_Chi_Minh',
+ 'Europe/Kiev': 'Europe/Kyiv',
+ 'Europe/Zaporozhye': 'Europe/Kyiv',
+ 'Etc/UTC': 'UTC',
+ 'US/Arizona': 'America/Phoenix',
+ 'US/Central': 'America/Chicago',
+ 'US/Eastern': 'America/New_York',
+ 'US/Mountain': 'America/Denver',
+ 'US/Pacific': 'America/Los_Angeles',
+ 'US/Samoa': 'Pacific/Pago_Pago',
+};
diff --git a/src/lib/crypto.ts b/src/lib/crypto.ts
index d22bad091..6dde8826d 100644
--- a/src/lib/crypto.ts
+++ b/src/lib/crypto.ts
@@ -1,6 +1,6 @@
-import crypto from 'crypto';
-import prand from 'pure-rand';
-import { v4, v5 } from 'uuid';
+import crypto from 'node:crypto';
+import { startOfDay, startOfMonth, startOfWeek } from 'date-fns';
+import { v4, v5, v7 } from 'uuid';
const ALGORITHM = 'aes-256-gcm';
const IV_LENGTH = 16;
@@ -12,25 +12,6 @@ const ENC_POSITION = TAG_POSITION + TAG_LENGTH;
const HASH_ALGO = 'sha512';
const HASH_ENCODING = 'hex';
-const seed = Date.now() ^ (Math.random() * 0x100000000);
-const rng = prand.xoroshiro128plus(seed);
-
-export function random(min: number, max: number) {
- return prand.unsafeUniformIntDistribution(min, max, rng);
-}
-
-export function getRandomChars(
- n: number,
- chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
-) {
- const arr = chars.split('');
- let s = '';
- for (let i = 0; i < n; i++) {
- s += arr[random(0, arr.length - 1)];
- }
- return s;
-}
-
const getKey = (password: string, salt: Buffer) =>
crypto.pbkdf2Sync(password, salt, 10000, 32, 'sha512');
@@ -77,7 +58,21 @@ export function secret() {
}
export function uuid(...args: any) {
- if (!args.length) return v4();
+ if (args.length) {
+ return v5(hash(...args, secret()), v5.DNS);
+ }
- return v5(hash(...args, secret()), v5.DNS);
+ return process.env.USE_UUIDV7 ? v7() : v4();
+}
+
+export function createAuthKey() {
+ return crypto.randomBytes(16).toString('hex');
+}
+
+export function getSalt(saltRotation: string, createdAt: Date): string {
+ return hash(
+ (saltRotation === 'day' ? startOfDay : saltRotation === 'week' ? startOfWeek : startOfMonth)(
+ createdAt,
+ ).toUTCString(),
+ );
}
diff --git a/src/lib/data.ts b/src/lib/data.ts
index cf2722b5c..fe69edf04 100644
--- a/src/lib/data.ts
+++ b/src/lib/data.ts
@@ -1,8 +1,8 @@
import { DATA_TYPE, DATETIME_REGEX } from './constants';
-import { DynamicDataType } from './types';
+import type { DynamicDataType } from './types';
export function flattenJSON(
- eventData: { [key: string]: any },
+ eventData: Record,
keyValues: { key: string; value: any; dataType: DynamicDataType }[] = [],
parentKey = '',
): { key: string; value: any; dataType: DynamicDataType }[] {
diff --git a/src/lib/date.ts b/src/lib/date.ts
index 85f64f253..91af88f67 100644
--- a/src/lib/date.ts
+++ b/src/lib/date.ts
@@ -1,42 +1,46 @@
import {
- addMinutes,
- addHours,
addDays,
+ addHours,
+ addMinutes,
addMonths,
+ addWeeks,
addYears,
- subMinutes,
- subHours,
- subDays,
- subMonths,
- subYears,
- startOfMinute,
- startOfHour,
- startOfDay,
- startOfWeek,
- startOfMonth,
- startOfYear,
- endOfHour,
- endOfDay,
- endOfWeek,
- endOfMonth,
- endOfYear,
- differenceInMinutes,
- differenceInHours,
differenceInCalendarDays,
- differenceInCalendarWeeks,
differenceInCalendarMonths,
+ differenceInCalendarWeeks,
differenceInCalendarYears,
+ differenceInDays,
+ differenceInHours,
+ differenceInMinutes,
+ endOfDay,
+ endOfHour,
+ endOfMinute,
+ endOfMonth,
+ endOfWeek,
+ endOfYear,
format,
+ isBefore,
+ isDate,
+ isEqual,
+ isSameDay,
max,
min,
- isDate,
- addWeeks,
+ startOfDay,
+ startOfHour,
+ startOfMinute,
+ startOfMonth,
+ startOfWeek,
+ startOfYear,
+ subDays,
+ subHours,
+ subMinutes,
+ subMonths,
subWeeks,
- endOfMinute,
- isSameDay,
+ subYears,
} from 'date-fns';
+import { utcToZonedTime } from 'date-fns-tz';
import { getDateLocale } from '@/lib/lang';
-import { DateRange } from '@/lib/types';
+import type { DateRange } from '@/lib/types';
export const TIME_UNIT = {
minute: 'minute',
@@ -47,19 +51,7 @@ export const TIME_UNIT = {
year: 'year',
};
-export const CUSTOM_FORMATS = {
- 'en-US': {
- p: 'ha',
- pp: 'h:mm:ss',
- },
- 'fr-FR': {
- 'M/d': 'd/M',
- 'MMM d': 'd MMM',
- 'EEE M/d': 'EEE d/M',
- },
-};
-
-const DATE_FUNCTIONS = {
+export const DATE_FUNCTIONS = {
minute: {
diff: differenceInMinutes,
add: addMinutes,
@@ -104,6 +96,15 @@ const DATE_FUNCTIONS = {
},
};
+export const DATE_FORMATS = {
+ minute: 'yyyy-MM-dd HH:mm',
+ hour: 'yyyy-MM-dd HH',
+ day: 'yyyy-MM-dd',
+ week: "yyyy-'W'II",
+ month: 'yyyy-MM',
+ year: 'yyyy',
+};
+
const TIMEZONE_MAPPINGS: Record = {
'Asia/Calcutta': 'Asia/Kolkata',
};
@@ -117,7 +118,7 @@ export function isValidTimezone(timezone: string) {
const normalizedTimezone = normalizeTimezone(timezone);
Intl.DateTimeFormat(undefined, { timeZone: normalizedTimezone });
return true;
- } catch (error) {
+ } catch {
return false;
}
}
@@ -136,54 +137,52 @@ export function parseDateValue(value: string) {
return { num: +num, unit };
}
-export function parseDateRange(value: string | object, locale = 'en-US'): DateRange {
- if (typeof value === 'object') {
- return value as DateRange;
+export function parseDateRange(
+ value: string,
+ unitValue?: string,
+ locale = 'en-US',
+ timezone?: string,
+): DateRange {
+ if (typeof value !== 'string') {
+ return null;
}
- if (value === 'all') {
- return {
- startDate: new Date(0),
- endDate: new Date(1),
- value,
- };
- }
-
- if (value?.startsWith?.('range')) {
+ if (value.startsWith('range')) {
const [, startTime, endTime] = value.split(':');
const startDate = new Date(+startTime);
const endDate = new Date(+endTime);
+ const unit = getMinimumUnit(startDate, endDate, true);
return {
startDate,
endDate,
value,
...parseDateValue(value),
- offset: 0,
- unit: getMinimumUnit(startDate, endDate),
+ unit,
};
}
- const now = new Date();
+ const date = new Date();
+ const now = timezone ? utcToZonedTime(date, timezone) : date;
const dateLocale = getDateLocale(locale);
- const { num, unit } = parseDateValue(value);
+ const { num = 1, unit } = parseDateValue(value);
switch (unit) {
case 'hour':
return {
- startDate: num ? subHours(startOfHour(now), num - 1) : startOfHour(now),
+ startDate: num ? subHours(startOfHour(now), num) : startOfHour(now),
endDate: endOfHour(now),
offset: 0,
num: num || 1,
- unit,
+ unit: unitValue || unit,
value,
};
case 'day':
return {
- startDate: num ? subDays(startOfDay(now), num - 1) : startOfDay(now),
+ startDate: num ? subDays(startOfDay(now), num) : startOfDay(now),
endDate: endOfDay(now),
- unit: num ? 'day' : 'hour',
+ unit: unitValue ? unitValue : num ? 'day' : 'hour',
offset: 0,
num: num || 1,
value,
@@ -191,28 +190,28 @@ export function parseDateRange(value: string | object, locale = 'en-US'): DateRa
case 'week':
return {
startDate: num
- ? subWeeks(startOfWeek(now, { locale: dateLocale }), num - 1)
+ ? subWeeks(startOfWeek(now, { locale: dateLocale }), num)
: startOfWeek(now, { locale: dateLocale }),
endDate: endOfWeek(now, { locale: dateLocale }),
- unit: 'day',
+ unit: unitValue || 'day',
offset: 0,
num: num || 1,
value,
};
case 'month':
return {
- startDate: num ? subMonths(startOfMonth(now), num - 1) : startOfMonth(now),
+ startDate: num ? subMonths(startOfMonth(now), num) : startOfMonth(now),
endDate: endOfMonth(now),
- unit: num ? 'month' : 'day',
+ unit: unitValue ? unitValue : num ? 'month' : 'day',
offset: 0,
num: num || 1,
value,
};
case 'year':
return {
- startDate: num ? subYears(startOfYear(now), num - 1) : startOfYear(now),
+ startDate: num ? subYears(startOfYear(now), num) : startOfYear(now),
endDate: endOfYear(now),
- unit: 'month',
+ unit: unitValue || 'month',
offset: 0,
num: num || 1,
value,
@@ -220,10 +219,14 @@ export function parseDateRange(value: string | object, locale = 'en-US'): DateRa
}
}
-export function getOffsetDateRange(dateRange: DateRange, increment: number) {
- const { startDate, endDate, unit, num, offset, value } = dateRange;
+export function getOffsetDateRange(dateRange: DateRange, offset: number) {
+ if (offset === 0) {
+ return dateRange;
+ }
- const change = num * increment;
+ const { startDate, endDate, unit, num, value } = dateRange;
+
+ const change = num * offset;
const { add } = DATE_FUNCTIONS[unit];
const { unit: originalUnit } = parseDateValue(value) || {};
@@ -231,39 +234,39 @@ export function getOffsetDateRange(dateRange: DateRange, increment: number) {
case 'day':
return {
...dateRange,
+ offset,
startDate: addDays(startDate, change),
endDate: addDays(endDate, change),
- offset: offset + increment,
};
case 'week':
return {
...dateRange,
+ offset,
startDate: addWeeks(startDate, change),
endDate: addWeeks(endDate, change),
- offset: offset + increment,
};
case 'month':
return {
...dateRange,
+ offset,
startDate: addMonths(startDate, change),
endDate: addMonths(endDate, change),
- offset: offset + increment,
};
case 'year':
return {
...dateRange,
+ offset,
startDate: addYears(startDate, change),
endDate: addYears(endDate, change),
- offset: offset + increment,
};
default:
return {
startDate: add(startDate, change),
endDate: add(endDate, change),
+ offset,
value,
unit,
num,
- offset: offset + increment,
};
}
}
@@ -276,12 +279,20 @@ export function getAllowedUnits(startDate: Date, endDate: Date) {
return index >= 0 ? units.splice(index) : [];
}
-export function getMinimumUnit(startDate: number | Date, endDate: number | Date) {
+export function getMinimumUnit(
+ startDate: number | Date,
+ endDate: number | Date,
+ isDateRange: boolean = false,
+) {
if (differenceInMinutes(endDate, startDate) <= 60) {
return 'minute';
- } else if (differenceInHours(endDate, startDate) <= 48) {
+ } else if (
+ isDateRange
+ ? differenceInHours(endDate, startDate) <= 48
+ : differenceInDays(endDate, startDate) <= 30
+ ) {
return 'hour';
- } else if (differenceInCalendarMonths(endDate, startDate) <= 6) {
+ } else if (differenceInCalendarMonths(endDate, startDate) <= 7) {
return 'day';
} else if (differenceInCalendarMonths(endDate, startDate) <= 24) {
return 'month';
@@ -290,31 +301,6 @@ export function getMinimumUnit(startDate: number | Date, endDate: number | Date)
return 'year';
}
-export function getDateArray(data: any[], startDate: Date, endDate: Date, unit: string) {
- const arr = [];
- const { diff, add, start } = DATE_FUNCTIONS[unit];
- const n = diff(endDate, startDate);
-
- for (let i = 0; i <= n; i++) {
- const t = start(add(startDate, i));
- const y = data.find(({ x }) => start(new Date(x)).getTime() === t.getTime())?.y || 0;
-
- arr.push({ x: t, y });
- }
-
- return arr;
-}
-
-export function formatDate(date: string | number | Date, str: string, locale = 'en-US') {
- return format(
- typeof date === 'string' ? new Date(date) : date,
- CUSTOM_FORMATS?.[locale]?.[str] || str,
- {
- locale: getDateLocale(locale),
- },
- );
-}
-
export function maxDate(...args: Date[]) {
return max(args.filter(n => isDate(n)));
}
@@ -323,23 +309,18 @@ export function minDate(...args: any[]) {
return min(args.filter(n => isDate(n)));
}
-export function getLocalTime(t: string | number | Date) {
- return addMinutes(new Date(t), new Date().getTimezoneOffset());
-}
-
-export function getDateLength(startDate: Date, endDate: Date, unit: string | number) {
- const { diff } = DATE_FUNCTIONS[unit];
- return diff(endDate, startDate) + 1;
-}
-
export function getCompareDate(compare: string, startDate: Date, endDate: Date) {
if (compare === 'yoy') {
- return { startDate: subYears(startDate, 1), endDate: subYears(endDate, 1) };
+ return { compare, startDate: subYears(startDate, 1), endDate: subYears(endDate, 1) };
}
- const diff = differenceInMinutes(endDate, startDate);
+ if (compare === 'prev') {
+ const diff = differenceInMinutes(endDate, startDate);
- return { startDate: subMinutes(startDate, diff), endDate: subMinutes(endDate, diff) };
+ return { compare, startDate: subMinutes(startDate, diff), endDate: subMinutes(endDate, diff) };
+ }
+
+ return {};
}
export function getDayOfWeekAsDate(dayOfWeek: number) {
@@ -354,3 +335,55 @@ export function getDayOfWeekAsDate(dayOfWeek: number) {
return currentDate;
}
+
+export function formatDate(
+ date: string | number | Date,
+ dateFormat: string = 'PPpp',
+ locale = 'en-US',
+) {
+ return format(typeof date === 'string' ? new Date(date) : date, dateFormat, {
+ locale: getDateLocale(locale),
+ });
+}
+
+export function generateTimeSeries(
+ data: { x: string; y: number; d?: string }[],
+ minDate: Date,
+ maxDate: Date,
+ unit: string,
+ locale: string,
+) {
+ const add = DATE_FUNCTIONS[unit].add;
+ const start = DATE_FUNCTIONS[unit].start;
+ const fmt = DATE_FORMATS[unit];
+
+ let current = start(minDate);
+ const end = start(maxDate);
+
+ const timeseries: string[] = [];
+
+ while (isBefore(current, end) || isEqual(current, end)) {
+ timeseries.push(formatDate(current, fmt, locale));
+ current = add(current, 1);
+ }
+
+ const lookup = new Map(data.map(({ x, y, d }) => [formatDate(x, fmt, locale), { x, y, d }]));
+
+ return timeseries.map(t => {
+ const { x, y, d } = lookup.get(t) || {};
+
+ return { x: t, d: d ?? x, y: y ?? null };
+ });
+}
+
+export function getDateRangeValue(startDate: Date, endDate: Date) {
+ return `range:${startDate.getTime()}:${endDate.getTime()}`;
+}
+
+export function getMonthDateRangeValue(date: Date) {
+ return getDateRangeValue(startOfMonth(date), endOfMonth(date));
+}
+
+export function isInvalidDate(date: any) {
+ return date instanceof Date && Number.isNaN(date.getTime());
+}
diff --git a/src/lib/db.ts b/src/lib/db.ts
index 0ffedd0d8..7b6e8368b 100644
--- a/src/lib/db.ts
+++ b/src/lib/db.ts
@@ -1,17 +1,16 @@
export const PRISMA = 'prisma';
export const POSTGRESQL = 'postgresql';
-export const MYSQL = 'mysql';
export const CLICKHOUSE = 'clickhouse';
export const KAFKA = 'kafka';
export const KAFKA_PRODUCER = 'kafka-producer';
// Fixes issue with converting bigint values
-BigInt.prototype['toJSON'] = function () {
+BigInt.prototype.toJSON = function () {
return Number(this);
};
export function getDatabaseType(url = process.env.DATABASE_URL) {
- const type = url && url.split(':')[0];
+ const type = url?.split(':')[0];
if (type === 'postgres') {
return POSTGRESQL;
@@ -31,7 +30,7 @@ export async function runQuery(queries: any) {
const db = getDatabaseType();
- if (db === POSTGRESQL || db === MYSQL) {
+ if (db === POSTGRESQL) {
return queries[PRISMA]();
}
}
diff --git a/src/lib/detect.ts b/src/lib/detect.ts
index 17fb574c0..2e78a1f35 100644
--- a/src/lib/detect.ts
+++ b/src/lib/detect.ts
@@ -1,21 +1,25 @@
-import path from 'path';
+import path from 'node:path';
import { browserName, detectOS } from 'detect-browser';
-import isLocalhost from 'is-localhost-ip';
import ipaddr from 'ipaddr.js';
+import isLocalhost from 'is-localhost-ip';
import maxmind from 'maxmind';
-import {
- DESKTOP_OS,
- DESKTOP_SCREEN_WIDTH,
- IP_ADDRESS_HEADERS,
- LAPTOP_SCREEN_WIDTH,
- MOBILE_OS,
- MOBILE_SCREEN_WIDTH,
-} from './constants';
+import { UAParser } from 'ua-parser-js';
+import { getIpAddress, stripPort } from '@/lib/ip';
import { safeDecodeURIComponent } from '@/lib/url';
const MAXMIND = 'maxmind';
const PROVIDER_HEADERS = [
+ // Umami custom headers (cloud mode only)
+ ...(process.env.CLOUD_MODE
+ ? [
+ {
+ countryHeader: 'x-umami-client-country',
+ regionHeader: 'x-umami-client-region',
+ cityHeader: 'x-umami-client-city',
+ },
+ ]
+ : []),
// Cloudflare headers
{
countryHeader: 'cf-ipcountry',
@@ -34,62 +38,26 @@ const PROVIDER_HEADERS = [
regionHeader: 'cloudfront-viewer-country-region',
cityHeader: 'cloudfront-viewer-city',
},
+ // EdgeOne headers (requires custom request headers in Rule Priorities, see: https://edgeone.ai/document/46151)
+ {
+ countryHeader: 'eo-ipcountry',
+ regionHeader: 'eo-region-code',
+ cityHeader: 'eo-ipcity',
+ },
];
-export function getIpAddress(headers: Headers) {
- const customHeader = process.env.CLIENT_IP_HEADER;
-
- if (customHeader && headers.get(customHeader)) {
- return headers.get(customHeader);
- }
-
- const header = IP_ADDRESS_HEADERS.find(name => {
- return headers.get(name);
- });
-
- const ip = headers.get(header);
-
- if (header === 'x-forwarded-for') {
- return ip?.split(',')?.[0]?.trim();
- }
-
- if (header === 'forwarded') {
- const match = ip.match(/for=(\[?[0-9a-fA-F:.]+\]?)/);
-
- if (match) {
- return match[1];
- }
- }
-
- return ip;
-}
-
-export function getDevice(screen: string, os: string) {
- if (!screen) return;
+export function getDevice(userAgent: string, screen: string = '') {
+ const { device } = UAParser(userAgent);
const [width] = screen.split('x');
- if (DESKTOP_OS.includes(os)) {
- if (os === 'Chrome OS' || +width < DESKTOP_SCREEN_WIDTH) {
- return 'laptop';
- }
- return 'desktop';
- } else if (MOBILE_OS.includes(os)) {
- if (os === 'Amazon OS' || +width > MOBILE_SCREEN_WIDTH) {
- return 'tablet';
- }
- return 'mobile';
+ const type = device?.type || 'desktop';
+
+ if (type === 'desktop' && screen && +width <= 1920) {
+ return 'laptop';
}
- if (+width >= DESKTOP_SCREEN_WIDTH) {
- return 'desktop';
- } else if (+width >= LAPTOP_SCREEN_WIDTH) {
- return 'laptop';
- } else if (+width >= MOBILE_SCREEN_WIDTH) {
- return 'tablet';
- } else {
- return 'mobile';
- }
+ return type;
}
function getRegionCode(country: string, region: string) {
@@ -108,21 +76,13 @@ function decodeHeader(s: string | undefined | null): string | undefined | null {
return Buffer.from(s, 'latin1').toString('utf-8');
}
-function removePortFromIP(ip: string = "") {
- const split = ip.split(":");
-
- // Assuming ip is a valid IPv4/IPv6 address, 3 colons is the minumum for IPv6
- const ipv4 = split.length - 1 < 3;
- return ipv4 ? split[0] : ip;
-}
-
-export async function getLocation(ip: string = '', headers: Headers, hasPayloadIP: boolean) {
+export async function getLocation(ip: string = '', headers: Headers, skipHeaders: boolean) {
// Ignore local ips
- if (await isLocalhost(ip)) {
- return;
+ if (!ip || (await isLocalhost(ip))) {
+ return null;
}
- if (!hasPayloadIP && !process.env.SKIP_LOCATION_HEADERS) {
+ if (!skipHeaders && !process.env.SKIP_LOCATION_HEADERS) {
for (const provider of PROVIDER_HEADERS) {
const countryHeader = headers.get(provider.countryHeader);
if (countryHeader) {
@@ -140,17 +100,15 @@ export async function getLocation(ip: string = '', headers: Headers, hasPayloadI
}
// Database lookup
- if (!global[MAXMIND]) {
+ if (!globalThis[MAXMIND]) {
const dir = path.join(process.cwd(), 'geo');
- global[MAXMIND] = await maxmind.open(
+ globalThis[MAXMIND] = await maxmind.open(
process.env.GEOLITE_DB_PATH || path.resolve(dir, 'GeoLite2-City.mmdb'),
);
}
- // When the client IP is extracted from headers, sometimes the value includes a port
- const cleanIp = removePortFromIP(ip);
- const result = global[MAXMIND].get(cleanIp);
+ const result = globalThis[MAXMIND]?.get(stripPort(ip));
if (result) {
const country = result.country?.iso_code ?? result?.registered_country?.iso_code;
@@ -172,9 +130,9 @@ export async function getClientInfo(request: Request, payload: Record {
+ const [website, link, pixel, board] = await Promise.all([
+ getWebsite(entityId),
+ getLink(entityId),
+ getPixel(entityId),
+ getBoard(entityId),
+ ]);
+
+ const entity = website || link || pixel || board;
+
+ return entity;
+}
diff --git a/src/lib/fetch.ts b/src/lib/fetch.ts
index ee9e160f8..1086973f3 100644
--- a/src/lib/fetch.ts
+++ b/src/lib/fetch.ts
@@ -1,10 +1,18 @@
-import { buildUrl } from '@/lib/url';
+import { buildPath } from '@/lib/url';
+
+export interface ErrorResponse {
+ error: {
+ status: number;
+ message: string;
+ code?: string;
+ };
+}
export interface FetchResponse {
ok: boolean;
status: number;
data?: any;
- error?: any;
+ error?: ErrorResponse;
}
export async function request(
@@ -28,24 +36,23 @@ export async function request(
return {
ok: res.ok,
status: res.status,
- data: res.ok ? data : undefined,
- error: res.ok ? undefined : data,
+ data,
};
});
}
-export async function httpGet(url: string, params: object = {}, headers: object = {}) {
- return request('GET', buildUrl(url, params), undefined, headers);
+export async function httpGet(path: string, params: object = {}, headers: object = {}) {
+ return request('GET', buildPath(path, params), undefined, headers);
}
-export async function httpDelete(url: string, params: object = {}, headers: object = {}) {
- return request('DELETE', buildUrl(url, params), undefined, headers);
+export async function httpDelete(path: string, params: object = {}, headers: object = {}) {
+ return request('DELETE', buildPath(path, params), undefined, headers);
}
-export async function httpPost(url: string, params: object = {}, headers: object = {}) {
- return request('POST', url, JSON.stringify(params), headers);
+export async function httpPost(path: string, params: object = {}, headers: object = {}) {
+ return request('POST', path, JSON.stringify(params), headers);
}
-export async function httpPut(url: string, params: object = {}, headers: object = {}) {
- return request('PUT', url, JSON.stringify(params), headers);
+export async function httpPut(path: string, params: object = {}, headers: object = {}) {
+ return request('PUT', path, JSON.stringify(params), headers);
}
diff --git a/src/lib/filters.ts b/src/lib/filters.ts
index 1b4a5a1e2..3da268d8a 100644
--- a/src/lib/filters.ts
+++ b/src/lib/filters.ts
@@ -1,52 +1,5 @@
-export const urlFilter = (data: any[]) => {
- const map = data.reduce((obj, { x, y }) => {
- if (x) {
- if (!obj[x]) {
- obj[x] = y;
- } else {
- obj[x] += y;
- }
- }
-
- return obj;
- }, {});
-
- return Object.keys(map).map(key => ({ x: key, y: map[key] }));
-};
-
-export const refFilter = (data: any[]) => {
- const links = {};
-
- const map = data.reduce((obj, { x, y }) => {
- let id;
-
- try {
- const url = new URL(x);
-
- id = url.hostname.replace(/www\./, '') || url.href;
- } catch {
- id = '';
- }
-
- links[id] = x;
-
- if (!obj[id]) {
- obj[id] = y;
- } else {
- obj[id] += y;
- }
-
- return obj;
- }, {});
-
- return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] }));
-};
-
-export const emptyFilter = (data: any[]) => {
- return data.map(item => (item.x ? item : null)).filter(n => n);
-};
-
export const percentFilter = (data: any[]) => {
+ if (!Array.isArray(data)) return [];
const total = data.reduce((n, { y }) => n + y, 0);
return data.map(({ x, y, ...props }) => ({ x, y, z: total ? (y / total) * 100 : 0, ...props }));
};
diff --git a/src/lib/format.ts b/src/lib/format.ts
index e497464a6..035a18111 100644
--- a/src/lib/format.ts
+++ b/src/lib/format.ts
@@ -1,3 +1,5 @@
+import { DEFAULT_CURRENCY } from './constants';
+
export function parseTime(val: number) {
const days = ~~(val / 86400);
const hours = ~~(val / 3600) - days * 24;
@@ -77,24 +79,24 @@ export function stringToColor(str: string) {
let color = '#';
for (let i = 0; i < 3; i++) {
const value = (hash >> (i * 8)) & 0xff;
- color += ('00' + value.toString(16)).slice(-2);
+ color += `00${value.toString(16)}`.slice(-2);
}
return color;
}
export function formatCurrency(value: number, currency: string, locale = 'en-US') {
- let formattedValue;
+ let formattedValue: Intl.NumberFormat;
try {
formattedValue = new Intl.NumberFormat(locale, {
style: 'currency',
currency: currency,
});
- } catch (error) {
+ } catch {
// Fallback to default currency format if an error occurs
formattedValue = new Intl.NumberFormat(locale, {
style: 'currency',
- currency: 'USD',
+ currency: DEFAULT_CURRENCY,
});
}
diff --git a/src/lib/generate.ts b/src/lib/generate.ts
new file mode 100644
index 000000000..8e25aa091
--- /dev/null
+++ b/src/lib/generate.ts
@@ -0,0 +1,20 @@
+import prand from 'pure-rand';
+
+const seed = Date.now() ^ (Math.random() * 0x100000000);
+const rng = prand.xoroshiro128plus(seed);
+
+export function random(min: number, max: number) {
+ return prand.unsafeUniformIntDistribution(min, max, rng);
+}
+
+export function getRandomChars(
+ n: number,
+ chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+) {
+ const arr = chars.split('');
+ let s = '';
+ for (let i = 0; i < n; i++) {
+ s += arr[random(0, arr.length - 1)];
+ }
+ return s;
+}
diff --git a/src/lib/get-base-url.ts b/src/lib/get-base-url.ts
new file mode 100644
index 000000000..512b321a9
--- /dev/null
+++ b/src/lib/get-base-url.ts
@@ -0,0 +1,40 @@
+import { HOMEPAGE_URL } from './constants';
+
+type HeaderStore = Pick;
+
+function getFirstHeaderValue(value?: string | null) {
+ return value?.split(',')[0]?.trim();
+}
+
+function getDefaultProtocol(host?: string) {
+ if (!host) {
+ return 'https';
+ }
+
+ if (host.startsWith('localhost') || host.startsWith('127.0.0.1') || host.startsWith('[::1]')) {
+ return 'http';
+ }
+
+ return 'https';
+}
+
+export function getBaseUrl(headers?: HeaderStore) {
+ const host =
+ getFirstHeaderValue(headers?.get('x-forwarded-host')) ||
+ getFirstHeaderValue(headers?.get('host'));
+
+ if (!host) {
+ return new URL(HOMEPAGE_URL);
+ }
+
+ const protocol =
+ getFirstHeaderValue(headers?.get('x-forwarded-proto')) ||
+ getFirstHeaderValue(headers?.get('x-forwarded-protocol')) ||
+ getDefaultProtocol(host);
+
+ try {
+ return new URL(`${protocol}://${host}`);
+ } catch {
+ return new URL(HOMEPAGE_URL);
+ }
+}
diff --git a/src/lib/ip.ts b/src/lib/ip.ts
new file mode 100644
index 000000000..a78c7e56e
--- /dev/null
+++ b/src/lib/ip.ts
@@ -0,0 +1,115 @@
+import ipaddr from 'ipaddr.js';
+
+export const IP_ADDRESS_HEADERS = [
+ ...(process.env.CLOUD_MODE ? ['x-umami-client-ip'] : []), // Umami custom header (cloud mode only)
+ 'true-client-ip', // CDN
+ 'cf-connecting-ip', // Cloudflare
+ 'fastly-client-ip', // Fastly
+ 'x-nf-client-connection-ip', // Netlify
+ 'do-connecting-ip', // Digital Ocean
+ 'x-real-ip', // Reverse proxy
+ 'x-appengine-user-ip', // Google App Engine
+ 'x-forwarded-for',
+ 'forwarded',
+ 'x-client-ip',
+ 'x-cluster-client-ip',
+ 'x-forwarded',
+];
+
+/**
+ * Normalize IP strings to a canonical form:
+ * - strips IPv4-mapped IPv6 (e.g. ::ffff:192.0.2.1 -> 192.0.2.1)
+ * - keeps valid IPv4/IPv6 as-is (canonically formatted by ipaddr.js)
+ */
+function normalizeIp(ip?: string | null) {
+ if (!ip) return ip;
+
+ try {
+ const parsed = ipaddr.parse(ip);
+
+ if (parsed.kind() === 'ipv6' && (parsed as ipaddr.IPv6).isIPv4MappedAddress()) {
+ return (parsed as ipaddr.IPv6).toIPv4Address().toString();
+ }
+
+ return parsed.toString();
+ } catch {
+ // Fallback: return original if parsing fails
+ return ip;
+ }
+}
+
+function resolveIp(ip?: string | null) {
+ if (!ip) return ip;
+
+ // First, try as-is
+ const normalized = normalizeIp(ip);
+ try {
+ ipaddr.parse(normalized);
+ return normalized;
+ } catch {
+ // try stripping port (handles IPv4:port; leaves IPv6 intact)
+ const stripped = stripPort(ip);
+ if (stripped !== ip) {
+ const normalizedStripped = normalizeIp(stripped);
+ try {
+ ipaddr.parse(normalizedStripped);
+ return normalizedStripped;
+ } catch {
+ return normalizedStripped;
+ }
+ }
+
+ return normalized;
+ }
+}
+
+export function getIpAddress(headers: Headers) {
+ const customHeader = process.env.CLIENT_IP_HEADER;
+
+ if (customHeader && headers.get(customHeader)) {
+ return resolveIp(headers.get(customHeader));
+ }
+
+ const header = IP_ADDRESS_HEADERS.find(name => headers.get(name));
+ if (!header) {
+ return undefined;
+ }
+
+ const ip = headers.get(header);
+
+ if (header === 'x-forwarded-for') {
+ return resolveIp(ip?.split(',')?.[0]?.trim());
+ }
+
+ if (header === 'forwarded') {
+ const match = ip.match(/for=(\[?[0-9a-fA-F:.]+]?)/);
+
+ if (match) {
+ return resolveIp(match[1]);
+ }
+ }
+
+ return resolveIp(ip);
+}
+
+export function stripPort(ip?: string | null) {
+ if (!ip) {
+ return ip;
+ }
+
+ if (ip.startsWith('[')) {
+ const endBracket = ip.indexOf(']');
+ if (endBracket !== -1) {
+ return ip.slice(0, endBracket + 1);
+ }
+ }
+
+ const idx = ip.lastIndexOf(':');
+ if (idx !== -1) {
+ if (ip.includes('.') || /^[a-zA-Z0-9.-]+$/.test(ip.slice(0, idx))) {
+ return ip.slice(0, idx);
+ }
+ }
+
+ return ip;
+}
diff --git a/src/lib/kafka.ts b/src/lib/kafka.ts
index e7f069102..1d60e1f28 100644
--- a/src/lib/kafka.ts
+++ b/src/lib/kafka.ts
@@ -1,8 +1,8 @@
-import { serializeError } from 'serialize-error';
+import type * as tls from 'node:tls';
import debug from 'debug';
-import { Kafka, Producer, RecordMetadata, SASLOptions, logLevel } from 'kafkajs';
+import { Kafka, logLevel, type Producer, type RecordMetadata, type SASLOptions } from 'kafkajs';
+import { serializeError } from 'serialize-error';
import { KAFKA, KAFKA_PRODUCER } from '@/lib/db';
-import * as tls from 'tls';
const log = debug('umami:kafka');
const CONNECT_TIMEOUT = 5000;
@@ -16,7 +16,8 @@ const enabled = Boolean(process.env.KAFKA_URL && process.env.KAFKA_BROKER);
function getClient() {
const { username, password } = new URL(process.env.KAFKA_URL);
const brokers = process.env.KAFKA_BROKER.split(',');
- const mechanism = process.env.KAFKA_SASL_MECHANISM as 'plain' | 'scram-sha-256' | 'scram-sha-512';
+ const mechanism =
+ (process.env.KAFKA_SASL_MECHANISM as 'plain' | 'scram-sha-256' | 'scram-sha-512') || 'plain';
const ssl: { ssl?: tls.ConnectionOptions | boolean; sasl?: SASLOptions } =
username && password
@@ -41,7 +42,7 @@ function getClient() {
});
if (process.env.NODE_ENV !== 'production') {
- global[KAFKA] = client;
+ globalThis[KAFKA] = client;
}
log('Kafka initialized');
@@ -54,7 +55,7 @@ async function getProducer(): Promise {
await producer.connect();
if (process.env.NODE_ENV !== 'production') {
- global[KAFKA_PRODUCER] = producer;
+ globalThis[KAFKA_PRODUCER] = producer;
}
log('Kafka producer initialized');
@@ -64,7 +65,7 @@ async function getProducer(): Promise {
async function sendMessage(
topic: string,
- message: { [key: string]: string | number } | { [key: string]: string | number }[],
+ message: Record | Record[],
): Promise {
try {
await connect();
@@ -91,10 +92,10 @@ async function sendMessage(
async function connect(): Promise {
if (!kafka) {
- kafka = process.env.KAFKA_URL && process.env.KAFKA_BROKER && (global[KAFKA] || getClient());
+ kafka = process.env.KAFKA_URL && process.env.KAFKA_BROKER && (globalThis[KAFKA] || getClient());
if (kafka) {
- producer = global[KAFKA_PRODUCER] || (await getProducer());
+ producer = globalThis[KAFKA_PRODUCER] || (await getProducer());
}
}
diff --git a/src/lib/lang.ts b/src/lib/lang.ts
index 48176d0a9..f874640c4 100644
--- a/src/lib/lang.ts
+++ b/src/lib/lang.ts
@@ -1,23 +1,24 @@
import {
arSA,
be,
- bn,
bg,
+ bn,
bs,
+ ca,
cs,
- sk,
da,
de,
el,
- enUS,
enGB,
+ enUS,
es,
+ faIR,
fi,
fr,
- faIR,
he,
hi,
hr,
+ hu,
id,
it,
ja,
@@ -33,17 +34,17 @@ import {
ptBR,
ro,
ru,
+ sk,
sl,
sv,
ta,
th,
tr,
uk,
+ uz,
+ vi,
zhCN,
zhTW,
- ca,
- hu,
- vi,
} from 'date-fns/locale';
export const languages = {
@@ -95,6 +96,7 @@ export const languages = {
'tr-TR': { label: 'Türkçe', dateLocale: tr },
'uk-UA': { label: 'українська', dateLocale: uk },
'ur-PK': { label: 'Urdu (Pakistan)', dateLocale: uk, dir: 'rtl' },
+ 'uz-UZ': { label: 'O‘zbekcha', dateLocale: uz },
'vi-VN': { label: 'Tiếng Việt', dateLocale: vi },
'zh-CN': { label: '中文', dateLocale: zhCN },
'zh-TW': { label: '中文(繁體)', dateLocale: zhTW },
diff --git a/src/lib/load.ts b/src/lib/load.ts
index d9aa23c28..f2c9c7981 100644
--- a/src/lib/load.ts
+++ b/src/lib/load.ts
@@ -1,6 +1,7 @@
-import { Website, Session } from '@prisma/client';
+import type { Session, Website } from '@/generated/prisma/client';
import redis from '@/lib/redis';
-import { getWebsiteSession, getWebsite } from '@/queries';
+import { getWebsite } from '@/queries/prisma';
+import { getWebsiteSession } from '@/queries/sql';
export async function fetchWebsite(websiteId: string): Promise {
let website = null;
@@ -37,3 +38,15 @@ export async function fetchSession(websiteId: string, sessionId: string): Promis
return session;
}
+
+export async function fetchAccount(userId: string) {
+ const account = await redis.client.get(`account:${userId}`);
+
+ return account;
+}
+
+export async function fetchTeam(teamId: string) {
+ const team = await redis.client.get(`team:${teamId}`);
+
+ return team;
+}
diff --git a/src/lib/match-configured-path.ts b/src/lib/match-configured-path.ts
new file mode 100644
index 000000000..104319f2d
--- /dev/null
+++ b/src/lib/match-configured-path.ts
@@ -0,0 +1,38 @@
+function normalizePathname(pathname?: string) {
+ if (!pathname) {
+ return '';
+ }
+
+ return `/${pathname.replace(/^\/+/, '')}`;
+}
+
+function normalizeBasePath(basePath?: string) {
+ if (!basePath) {
+ return '';
+ }
+
+ return `/${basePath.replace(/^\/+|\/+$/g, '')}`;
+}
+
+export function matchesConfiguredPath(
+ pathname: string,
+ configuredPath?: string,
+ basePath?: string,
+) {
+ const normalizedPathname = normalizePathname(pathname);
+ const normalizedConfiguredPath = normalizePathname(configuredPath);
+
+ if (!normalizedConfiguredPath) {
+ return false;
+ }
+
+ if (normalizedPathname === normalizedConfiguredPath) {
+ return true;
+ }
+
+ const normalizedBasePath = normalizeBasePath(basePath);
+
+ return normalizedBasePath
+ ? normalizedPathname === `${normalizedBasePath}${normalizedConfiguredPath}`
+ : false;
+}
diff --git a/src/lib/params.ts b/src/lib/params.ts
index 8e631ed8a..f1452254d 100644
--- a/src/lib/params.ts
+++ b/src/lib/params.ts
@@ -1,17 +1,29 @@
-import { FILTER_COLUMNS, OPERATOR_PREFIXES, OPERATORS } from '@/lib/constants';
-import { QueryFilters, QueryOptions } from '@/lib/types';
+import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants';
+import type { Filter, QueryFilters, QueryOptions } from '@/lib/types';
-export function parseParameterValue(param: any) {
+export function parseFilterValue(param: any) {
if (typeof param === 'string') {
- const [, prefix, value] = param.match(/^(!~|!|~)?(.*)$/);
+ const operatorValues = Object.values(OPERATORS).join('|');
- const operator =
- Object.keys(OPERATOR_PREFIXES).find(key => OPERATOR_PREFIXES[key] === prefix) ||
- OPERATORS.equals;
+ const regex = new RegExp(`^(${operatorValues})\\.(.*)$`);
- return { operator, value };
+ const [, operator, value] = param.match(regex) || [];
+
+ const resolvedOperator = operator || OPERATORS.equals;
+ const resolvedValue = value ?? param;
+
+ if (resolvedOperator === OPERATORS.equals || resolvedOperator === OPERATORS.notEquals) {
+ return { operator: resolvedOperator, value: resolvedValue.split(',') };
+ }
+
+ return { operator: resolvedOperator, value: resolvedValue };
}
- return { operator: OPERATORS.equals, value: param };
+
+ if (Array.isArray(param)) {
+ return { operator: OPERATORS.equals, value: param };
+ }
+
+ return { operator: OPERATORS.equals, value: [param] };
}
export function isEqualsOperator(operator: any) {
@@ -19,10 +31,19 @@ export function isEqualsOperator(operator: any) {
}
export function isSearchOperator(operator: any) {
- return [OPERATORS.contains, OPERATORS.doesNotContain].includes(operator);
+ return [
+ OPERATORS.contains,
+ OPERATORS.doesNotContain,
+ OPERATORS.regex,
+ OPERATORS.notRegex,
+ ].includes(operator);
}
-export function filtersToArray(filters: QueryFilters = {}, options: QueryOptions = {}) {
+export function filtersObjectToArray(filters: QueryFilters, options: QueryOptions = {}): Filter[] {
+ if (!filters) {
+ return [];
+ }
+
return Object.keys(filters).reduce((arr, key) => {
const filter = filters[key];
@@ -30,17 +51,40 @@ export function filtersToArray(filters: QueryFilters = {}, options: QueryOptions
return arr;
}
+ const baseName = key.replace(/\d+$/, '');
+ const paramName = key !== baseName ? key : undefined;
+
if (filter?.name && filter?.value !== undefined) {
- return arr.concat({ ...filter, column: options?.columns?.[key] ?? FILTER_COLUMNS[key] });
+ return arr.concat({
+ ...filter,
+ column: options?.columns?.[baseName] ?? FILTER_COLUMNS[baseName],
+ paramName: paramName ?? filter.paramName,
+ });
}
- const { operator, value } = parseParameterValue(filter);
+ const { operator, value } = parseFilterValue(filter);
return arr.concat({
- name: key,
- column: options?.columns?.[key] ?? FILTER_COLUMNS[key],
+ name: baseName,
+ paramName,
+ column: options?.columns?.[baseName] ?? FILTER_COLUMNS[baseName],
operator,
value,
+ prefix: options?.prefix,
});
}, []);
}
+
+export function filtersArrayToObject(filters: Filter[]) {
+ const nameCounts: Record = {};
+ return filters.reduce((obj, filter: Filter) => {
+ const { name, operator, value } = filter;
+ const count = nameCounts[name] ?? 0;
+ const key = count === 0 ? name : `${name}${count}`;
+ nameCounts[name] = count + 1;
+
+ obj[key] = `${operator}.${Array.isArray(value) ? value.join(',') : value}`;
+
+ return obj;
+ }, {});
+}
diff --git a/src/lib/password.ts b/src/lib/password.ts
new file mode 100644
index 000000000..f5c450bd9
--- /dev/null
+++ b/src/lib/password.ts
@@ -0,0 +1,11 @@
+import bcrypt from 'bcryptjs';
+
+const SALT_ROUNDS = 10;
+
+export function hashPassword(password: string, rounds = SALT_ROUNDS) {
+ return bcrypt.hashSync(password, rounds);
+}
+
+export function checkPassword(password: string, passwordHash: string) {
+ return bcrypt.compareSync(password, passwordHash);
+}
diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts
index 273d63fa9..19fd421ec 100644
--- a/src/lib/prisma.ts
+++ b/src/lib/prisma.ts
@@ -1,35 +1,25 @@
-import debug from 'debug';
-import { PrismaClient } from '@prisma/client';
+import { PrismaPg } from '@prisma/adapter-pg';
import { readReplicas } from '@prisma/extension-read-replicas';
-import { formatInTimeZone } from 'date-fns-tz';
-import { MYSQL, POSTGRESQL, getDatabaseType } from '@/lib/db';
-import { SESSION_COLUMNS, OPERATORS, DEFAULT_PAGE_SIZE } from './constants';
-import { fetchWebsite } from './load';
-import { maxDate } from './date';
-import { QueryFilters, QueryOptions, PageParams } from './types';
-import { filtersToArray } from './params';
+import debug from 'debug';
+import { PrismaClient } from '@/generated/prisma/client';
+import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS, OPERATORS, SESSION_COLUMNS } from './constants';
+import { filtersObjectToArray } from './params';
+import type { Operator, QueryFilters, QueryOptions } from './types';
const log = debug('umami:prisma');
const PRISMA = 'prisma';
+
const PRISMA_LOG_OPTIONS = {
log: [
{
- emit: 'event',
- level: 'query',
+ emit: 'event' as const,
+ level: 'query' as const,
},
],
};
-const MYSQL_DATE_FORMATS = {
- minute: '%Y-%m-%dT%H:%i:00',
- hour: '%Y-%m-%d %H:00:00',
- day: '%Y-%m-%d 00:00:00',
- month: '%Y-%m-01 00:00:00',
- year: '%Y-01-01 00:00:00',
-};
-
-const POSTGRESQL_DATE_FORMATS = {
+const DATE_FORMATS = {
minute: 'YYYY-MM-DD HH24:MI:00',
hour: 'YYYY-MM-DD HH24:00:00',
day: 'YYYY-MM-DD HH24:00:00',
@@ -37,198 +27,171 @@ const POSTGRESQL_DATE_FORMATS = {
year: 'YYYY-01-01 HH24:00:00',
};
+const DATE_FORMATS_UTC = {
+ minute: 'YYYY-MM-DD"T"HH24:MI:00"Z"',
+ hour: 'YYYY-MM-DD"T"HH24:00:00"Z"',
+ day: 'YYYY-MM-DD"T"HH24:00:00"Z"',
+ month: 'YYYY-MM-01"T"HH24:00:00"Z"',
+ year: 'YYYY-01-01"T"HH24:00:00"Z"',
+};
+
function getAddIntervalQuery(field: string, interval: string): string {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `${field} + interval '${interval}'`;
- }
-
- if (db === MYSQL) {
- return `DATE_ADD(${field}, interval ${interval})`;
- }
+ return `${field} + interval '${interval}'`;
}
function getDayDiffQuery(field1: string, field2: string): string {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `${field1}::date - ${field2}::date`;
- }
-
- if (db === MYSQL) {
- return `DATEDIFF(${field1}, ${field2})`;
- }
+ return `${field1}::date - ${field2}::date`;
}
function getCastColumnQuery(field: string, type: string): string {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `${field}::${type}`;
- }
-
- if (db === MYSQL) {
- return `${field}`;
- }
+ return `${field}::${type}`;
}
function getDateSQL(field: string, unit: string, timezone?: string): string {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- if (timezone) {
- return `to_char(date_trunc('${unit}', ${field} at time zone '${timezone}'), '${POSTGRESQL_DATE_FORMATS[unit]}')`;
- }
- return `to_char(date_trunc('${unit}', ${field}), '${POSTGRESQL_DATE_FORMATS[unit]}')`;
+ if (timezone && timezone !== 'utc') {
+ return `to_char(date_trunc('${unit}', ${field} at time zone '${timezone}'), '${DATE_FORMATS[unit]}')`;
}
- if (db === MYSQL) {
- if (timezone) {
- const tz = formatInTimeZone(new Date(), timezone, 'xxx');
- return `date_format(convert_tz(${field},'+00:00','${tz}'), '${MYSQL_DATE_FORMATS[unit]}')`;
- }
- return `date_format(${field}, '${MYSQL_DATE_FORMATS[unit]}')`;
- }
+ return `to_char(date_trunc('${unit}', ${field}), '${DATE_FORMATS_UTC[unit]}')`;
}
function getDateWeeklySQL(field: string, timezone?: string) {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `concat(extract(dow from (${field} at time zone '${timezone}')), ':', to_char((${field} at time zone '${timezone}'), 'HH24'))`;
- }
-
- if (db === MYSQL) {
- const tz = formatInTimeZone(new Date(), timezone, 'xxx');
- return `date_format(convert_tz(${field},'+00:00','${tz}'), '%w:%H')`;
- }
+ return `concat(extract(dow from (${field} at time zone '${timezone}')), ':', to_char((${field} at time zone '${timezone}'), 'HH24'))`;
}
export function getTimestampSQL(field: string) {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `floor(extract(epoch from ${field}))`;
- }
-
- if (db === MYSQL) {
- return `UNIX_TIMESTAMP(${field})`;
- }
+ return `floor(extract(epoch from ${field}))`;
}
function getTimestampDiffSQL(field1: string, field2: string): string {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return `floor(extract(epoch from (${field2} - ${field1})))`;
- }
-
- if (db === MYSQL) {
- return `timestampdiff(second, ${field1}, ${field2})`;
- }
+ return `floor(extract(epoch from (${field2} - ${field1})))`;
}
function getSearchSQL(column: string, param: string = 'search'): string {
- const db = getDatabaseType();
- const like = db === POSTGRESQL ? 'ilike' : 'like';
-
- return `and ${column} ${like} {{${param}}}`;
+ return `and ${column} ilike {{${param}}}`;
}
-function mapFilter(column: string, operator: string, name: string, type: string = '') {
- const db = getDatabaseType();
- const like = db === POSTGRESQL ? 'ilike' : 'like';
- const value = `{{${name}${type ? `::${type}` : ''}}}`;
+function mapFilter(
+ column: string,
+ operator: string,
+ name: string,
+ type: string = '',
+ paramName?: string,
+) {
+ const param = paramName ?? name;
+ const value = `{{${param}${type ? `::${type}` : ''}}}`;
+
+ if (name.startsWith('cohort_')) {
+ name = name.slice('cohort_'.length);
+ }
+
+ const table = SESSION_COLUMNS.includes(name) ? 'session' : 'website_event';
switch (operator) {
case OPERATORS.equals:
- return `${column} = ${value}`;
+ return `${table}.${column} = ANY(${value})`;
case OPERATORS.notEquals:
- return `${column} != ${value}`;
+ return `${table}.${column} != ALL(${value})`;
case OPERATORS.contains:
- return `${column} ${like} ${value}`;
+ return `${table}.${column} ilike ${value}`;
case OPERATORS.doesNotContain:
- return `${column} not ${like} ${value}`;
+ return `${table}.${column} not ilike ${value}`;
+ case OPERATORS.regex:
+ return `${table}.${column} ~ ${value}`;
+ case OPERATORS.notRegex:
+ return `${table}.${column} !~ ${value}`;
default:
return '';
}
}
-function mapCohortFilter(column: string, operator: string, value: string) {
- const db = getDatabaseType();
- const like = db === POSTGRESQL ? 'ilike' : 'like';
+function getFilterQuery(filters: Record, options: QueryOptions = {}): string {
+ const { isCohort, cohortMatch, cohortActionName } = options;
+ const isOr = isCohort ? cohortMatch === 'any' : filters.match === 'any';
+ const orClauses: string[] = [];
+ const andClauses: string[] = [];
- switch (operator) {
- case OPERATORS.equals:
- return `${column} = '${value}'`;
- case OPERATORS.notEquals:
- return `${column} != '${value}'`;
- case OPERATORS.contains:
- return `${column} ${like} '${value}'`;
- case OPERATORS.doesNotContain:
- return `${column} not ${like} '${value}'`;
- default:
- return '';
- }
-}
-
-function getFilterQuery(filters: QueryFilters = {}, options: QueryOptions = {}): string {
- const query = filtersToArray(filters, options).reduce((arr, { name, column, operator }) => {
- if (column) {
- arr.push(`and ${mapFilter(column, operator, name)}`);
-
- if (name === 'referrer') {
- arr.push(
- `and (website_event.referrer_domain != website_event.hostname or website_event.referrer_domain is null)`,
- );
+ filtersObjectToArray(filters, options).forEach(
+ ({ name, column, operator, prefix = '', paramName }) => {
+ if (isCohort) {
+ column = FILTER_COLUMNS[name.slice('cohort_'.length)];
}
- }
- return arr;
- }, []);
-
- return query.join('\n');
-}
-
-function getCohortQuery(websiteId: string, filters: QueryFilters = {}, options: QueryOptions = {}) {
- const query = filtersToArray(filters, options).reduce(
- (arr, { name, column, operator, value }) => {
if (column) {
- arr.push(
- `${arr.length === 0 ? 'where' : 'and'} ${mapCohortFilter(column, operator, value)}`,
- );
+ const clause = mapFilter(`${prefix}${column}`, operator, name, '', paramName);
+ const isAlwaysAnd = name === 'eventType' || (isCohort && name === cohortActionName);
+
+ if (isAlwaysAnd) {
+ andClauses.push(`and ${clause}`);
+ } else if (isOr) {
+ orClauses.push(clause);
+ } else {
+ andClauses.push(`and ${clause}`);
+ }
if (name === 'referrer') {
- arr.push(`and referrer_domain != hostname`);
+ andClauses.push(
+ `and (website_event.referrer_domain != regexp_replace(website_event.hostname, '^www.', '') or website_event.referrer_domain is null)`,
+ );
}
}
-
- return arr;
},
- [],
);
- if (query.length > 0) {
- // add website and date range filters
- query.push(`and website_event.website_id = '${websiteId}'`);
- query.push(
- `and website_event.created_at between '${filters.startDate}'::timestamptz and '${filters.endDate}'::timestamptz`,
- );
+ const parts: string[] = [];
- return `join
+ if (orClauses.length > 0) {
+ parts.push(`and (\n ${orClauses.join('\n or ')}\n)`);
+ }
+
+ parts.push(...andClauses);
+
+ return parts.join('\n');
+}
+
+function getCohortQuery(filters: QueryFilters = {}) {
+ if (!filters || Object.keys(filters).length === 0) {
+ return '';
+ }
+
+ const cohortMatch = (filters as any).cohort_match;
+ const cohortActionName = (filters as any).cohort_actionName;
+
+ const filterQuery = getFilterQuery(filters, { isCohort: true, cohortMatch, cohortActionName });
+
+ return `join
(select distinct website_event.session_id
from website_event
join session on session.session_id = website_event.session_id
- ${query.join('\n')}) cohort
+ and session.website_id = website_event.website_id
+ where website_event.website_id = {{websiteId}}
+ and website_event.created_at between {{cohort_startDate}} and {{cohort_endDate}}
+ ${filterQuery}
+ ) cohort
on cohort.session_id = website_event.session_id
`;
- }
-
- return '';
}
-function getDateQuery(filters: QueryFilters = {}) {
+function getExcludeBounceQuery(filters: Record) {
+ if (!filters.excludeBounce === true) {
+ return '';
+ }
+
+ return `join
+ (select distinct session_id, visit_id
+ from website_event
+ where website_id = {{websiteId}}
+ and created_at between {{startDate}} and {{endDate}}
+ and event_type = 1
+ group by session_id, visit_id
+ having count(*) > 1
+ ) excludeBounce
+ on excludeBounce.session_id = website_event.session_id
+ and excludeBounce.visit_id = website_event.visit_id
+ `;
+}
+
+function getDateQuery(filters: Record) {
const { startDate, endDate } = filters;
if (startDate) {
@@ -242,53 +205,64 @@ function getDateQuery(filters: QueryFilters = {}) {
return '';
}
-function getFilterParams(filters: QueryFilters = {}) {
- return filtersToArray(filters).reduce((obj, { name, operator, value }) => {
- obj[name] = [OPERATORS.contains, OPERATORS.doesNotContain].includes(operator)
- ? `%${value}%`
- : value;
-
- return obj;
- }, {});
-}
-
-async function parseFilters(
- websiteId: string,
- filters: QueryFilters = {},
- options: QueryOptions = {},
-) {
- const website = await fetchWebsite(websiteId);
- const joinSession = Object.keys(filters).find(key =>
- ['referrer', ...SESSION_COLUMNS].includes(key),
- );
-
+function getQueryParams(filters: Record) {
return {
- joinSession:
- options?.joinSession || joinSession
- ? `inner join session on website_event.session_id = session.session_id`
- : '',
- filterQuery: getFilterQuery(filters, options),
- dateQuery: getDateQuery(filters),
- params: {
- ...getFilterParams(filters),
- websiteId,
- startDate: maxDate(filters.startDate, website?.resetAt),
- },
- cohortQuery: getCohortQuery(websiteId, filters?.cohort),
+ ...filters,
+ ...filtersObjectToArray(filters).reduce((obj, { name, column, operator, value, paramName }) => {
+ const resolvedColumn =
+ column || (name?.startsWith('cohort_') && FILTER_COLUMNS[name.slice('cohort_'.length)]);
+
+ if (!resolvedColumn) return obj;
+
+ const key = paramName ?? name;
+
+ if (([OPERATORS.contains, OPERATORS.doesNotContain] as Operator[]).includes(operator)) {
+ obj[key] = `%${value}%`;
+ } else if (([OPERATORS.equals, OPERATORS.notEquals] as Operator[]).includes(operator)) {
+ obj[key] = Array.isArray(value) ? value : [value];
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }, {}),
};
}
-async function rawQuery(sql: string, data: object): Promise {
+function parseFilters(filters: Record, options?: QueryOptions) {
+ const joinSession = Object.keys(filters).find(key => {
+ const baseName = key.replace(/\d+$/, '');
+ return ['referrer', ...SESSION_COLUMNS].includes(baseName);
+ });
+
+ const cohortFilters = Object.fromEntries(
+ Object.entries(filters).filter(([key]) => key.startsWith('cohort_')),
+ );
+
+ return {
+ joinSessionQuery:
+ options?.joinSession || joinSession
+ ? `inner join session on website_event.session_id = session.session_id and website_event.website_id = session.website_id`
+ : '',
+ dateQuery: getDateQuery(filters),
+ filterQuery: getFilterQuery(filters, options),
+ queryParams: getQueryParams(filters),
+ cohortQuery: getCohortQuery(cohortFilters),
+ excludeBounceQuery: getExcludeBounceQuery(filters),
+ };
+}
+
+async function rawQuery(sql: string, data: Record, name?: string): Promise {
if (process.env.LOG_QUERY) {
log('QUERY:\n', sql);
log('PARAMETERS:\n', data);
+ log('NAME:\n', name);
}
-
- const db = getDatabaseType();
const params = [];
+ const schema = getSchema();
- if (db !== POSTGRESQL && db !== MYSQL) {
- return Promise.reject(new Error('Unknown database.'));
+ if (schema) {
+ await client.$executeRawUnsafe(`SET search_path TO "${schema}";`);
}
const query = sql?.replaceAll(/\{\{\s*(\w+)(::\w+)?\s*}}/g, (...args) => {
@@ -298,16 +272,18 @@ async function rawQuery(sql: string, data: object): Promise {
params.push(value);
- return db === MYSQL ? '?' : `$${params.length}${type ?? ''}`;
+ return `$${params.length}${type ?? ''}`;
});
- return process.env.DATABASE_REPLICA_URL
- ? client.$replica().$queryRawUnsafe(query, ...params)
- : client.$queryRawUnsafe(query, ...params);
+ if (process.env.DATABASE_REPLICA_URL && '$replica' in client) {
+ return client.$replica().$queryRawUnsafe(query, ...params);
+ }
+
+ return client.$queryRawUnsafe(query, ...params);
}
-async function pagedQuery(model: string, criteria: T, pageParams: PageParams) {
- const { page = 1, pageSize, orderBy, sortDescending = false } = pageParams || {};
+async function pagedQuery(model: string, criteria: T, filters?: QueryFilters) {
+ const { page = 1, pageSize, orderBy, sortDescending = false, search } = filters || {};
const size = +pageSize || DEFAULT_PAGE_SIZE;
const data = await client[model].findMany({
@@ -326,15 +302,16 @@ async function pagedQuery(model: string, criteria: T, pageParams: PageParams)
const count = await client[model].count({ where: (criteria as any).where });
- return { data, count, page: +page, pageSize: size, orderBy };
+ return { data, count, page: +page, pageSize: size, orderBy, search };
}
async function pagedRawQuery(
query: string,
- queryParams: { [key: string]: any },
- pageParams: PageParams = {},
+ queryParams: Record,
+ filters: QueryFilters,
+ name?: string,
) {
- const { page = 1, pageSize, orderBy, sortDescending = false } = pageParams;
+ const { page = 1, pageSize, orderBy, sortDescending = false } = filters;
const size = +pageSize || DEFAULT_PAGE_SIZE;
const offset = +size * (+page - 1);
const direction = sortDescending ? 'desc' : 'asc';
@@ -350,26 +327,15 @@ async function pagedRawQuery(
res => res[0].num,
);
- const data = await rawQuery(`${query}${statements}`, queryParams);
+ const data = await rawQuery(`${query}${statements}`, queryParams, name);
return { data, count, page: +page, pageSize: size, orderBy };
}
-function getQueryMode(): { mode?: 'default' | 'insensitive' } {
- const db = getDatabaseType();
-
- if (db === POSTGRESQL) {
- return { mode: 'insensitive' };
- }
-
- return {};
-}
-
-function getSearchParameters(query: string, filters: { [key: string]: any }[]) {
+function getSearchParameters(query: string, filters: Record[]) {
if (!query) return;
- const mode = getQueryMode();
- const parseFilter = (filter: { [key: string]: any }) => {
+ const parseFilter = (filter: Record) => {
const [[key, value]] = Object.entries(filter);
return {
@@ -377,7 +343,7 @@ function getSearchParameters(query: string, filters: { [key: string]: any }[]) {
typeof value === 'string'
? {
[value]: query,
- ...mode,
+ mode: 'insensitive',
}
: parseFilter(value),
};
@@ -396,47 +362,61 @@ function transaction(input: any, options?: any) {
return client.$transaction(input, options);
}
-function getClient(params?: {
- logQuery?: boolean;
- queryLogger?: () => void;
- replicaUrl?: string;
- options?: any;
-}): PrismaClient {
- const {
- logQuery = !!process.env.LOG_QUERY,
- queryLogger,
- replicaUrl = process.env.DATABASE_REPLICA_URL,
- options,
- } = params || {};
+function getSchema() {
+ const connectionUrl = new URL(process.env.DATABASE_URL);
- const prisma = new PrismaClient({
- errorFormat: 'pretty',
- ...(logQuery && PRISMA_LOG_OPTIONS),
- ...options,
- });
-
- if (replicaUrl) {
- prisma.$extends(
- readReplicas({
- url: replicaUrl,
- }),
- );
- }
-
- if (logQuery) {
- prisma.$on('query' as never, queryLogger || log);
- }
-
- if (process.env.NODE_ENV !== 'production') {
- global[PRISMA] = prisma;
- }
-
- log('Prisma initialized');
-
- return prisma;
+ return connectionUrl.searchParams.get('schema');
}
-const client = global[PRISMA] || getClient();
+function getClient() {
+ const url = process.env.DATABASE_URL;
+ const replicaUrl = process.env.DATABASE_REPLICA_URL;
+ const logQuery = process.env.LOG_QUERY;
+ const schema = getSchema();
+
+ const baseAdapter = new PrismaPg({ connectionString: url }, { schema });
+
+ const baseClient = new PrismaClient({
+ adapter: baseAdapter,
+ errorFormat: 'pretty',
+ ...(logQuery ? PRISMA_LOG_OPTIONS : {}),
+ });
+
+ if (logQuery) {
+ baseClient.$on('query', log);
+ }
+
+ if (!replicaUrl) {
+ log('Prisma initialized');
+ globalThis[PRISMA] ??= baseClient;
+ return baseClient;
+ }
+
+ const replicaAdapter = new PrismaPg({ connectionString: replicaUrl }, { schema });
+
+ const replicaClient = new PrismaClient({
+ adapter: replicaAdapter,
+ errorFormat: 'pretty',
+ ...(logQuery ? PRISMA_LOG_OPTIONS : {}),
+ });
+
+ if (logQuery) {
+ replicaClient.$on('query', log);
+ }
+
+ const extended = baseClient.$extends(
+ readReplicas({
+ replicas: [replicaClient],
+ }),
+ );
+
+ log('Prisma initialized (with replica)');
+ globalThis[PRISMA] ??= extended;
+
+ return extended;
+}
+
+const client = (globalThis[PRISMA] || getClient()) as ReturnType;
export default {
client,
@@ -450,7 +430,6 @@ export default {
getSearchParameters,
getTimestampDiffSQL,
getSearchSQL,
- getQueryMode,
pagedQuery,
pagedRawQuery,
parseFilters,
diff --git a/src/lib/react.ts b/src/lib/react.ts
new file mode 100644
index 000000000..668cdf1fb
--- /dev/null
+++ b/src/lib/react.ts
@@ -0,0 +1,77 @@
+import {
+ Children,
+ cloneElement,
+ type FC,
+ Fragment,
+ isValidElement,
+ type ReactElement,
+ type ReactNode,
+} from 'react';
+
+export function getFragmentChildren(children: ReactNode) {
+ return (children as ReactElement)?.type === Fragment
+ ? (children as ReactElement).props.children
+ : children;
+}
+
+export function isValidChild(child: ReactElement, types: FC | FC[]) {
+ if (!isValidElement(child)) {
+ return false;
+ }
+ return (Array.isArray(types) ? types : [types]).find(type => type === child.type);
+}
+
+export function mapChildren(
+ children: ReactNode,
+ handler: (child: ReactElement, index: number) => any,
+) {
+ return Children.map(getFragmentChildren(children) as ReactElement[], (child, index) => {
+ if (!child?.props) {
+ return null;
+ }
+ return handler(child, index);
+ });
+}
+
+export function cloneChildren(
+ children: ReactNode,
+ handler: (child: ReactElement, index: number) => any,
+ options?: { validChildren?: any[]; onlyRenderValid?: boolean },
+): ReactNode {
+ if (!children) {
+ return null;
+ }
+
+ const { validChildren, onlyRenderValid = false } = options || {};
+
+ return mapChildren(children, (child, index) => {
+ const invalid = validChildren && !isValidChild(child as ReactElement, validChildren);
+
+ if (onlyRenderValid && invalid) {
+ return null;
+ }
+
+ if (!invalid && isValidElement(child)) {
+ return cloneElement(child, handler(child, index));
+ }
+
+ return child;
+ });
+}
+
+export function renderChildren(
+ children: ReactNode | ((item: any, index: number, array: any) => ReactNode),
+ items: any[],
+ handler: (child: ReactElement, index: number) => object | undefined,
+ options?: { validChildren?: any[]; onlyRenderValid?: boolean },
+): ReactNode {
+ if (typeof children === 'function' && items?.length > 0) {
+ return cloneChildren(items.map(children), handler, options);
+ }
+
+ return cloneChildren(getFragmentChildren(children as ReactNode), handler, options);
+}
+
+export function countChildren(children: ReactNode): number {
+ return Children.count(getFragmentChildren(children));
+}
diff --git a/src/lib/redis.ts b/src/lib/redis.ts
index 98b083888..e8448eda9 100644
--- a/src/lib/redis.ts
+++ b/src/lib/redis.ts
@@ -1,17 +1,153 @@
-import { REDIS, UmamiRedisClient } from '@umami/redis-client';
+import debug from 'debug';
+import { createClient, type RedisClientType } from 'redis';
+const log = debug('umami:redis-client');
+
+export const DELETED = '__DELETED__';
+export const DEFAULT_TTL = 3600;
+
+const logError = (err: unknown) => log(err);
+
+class UmamiRedisClient {
+ url: string;
+ client: RedisClientType;
+ isConnected: boolean;
+
+ constructor(url: string) {
+ const client = createClient({ url }).on('error', logError);
+
+ this.url = url;
+ this.client = client as RedisClientType;
+ this.isConnected = false;
+ }
+
+ async connect() {
+ if (!this.isConnected) {
+ this.isConnected = true;
+
+ await this.client.connect();
+
+ log('Redis connected');
+ }
+ }
+
+ async get(key: string) {
+ await this.connect();
+
+ const data = await this.client.get(key);
+
+ try {
+ return JSON.parse(data as string);
+ } catch {
+ return null;
+ }
+ }
+
+ async set(key: string, value: any, time?: number) {
+ await this.connect();
+
+ const ttl = time && time > 0 ? time : DEFAULT_TTL;
+
+ return this.client.set(key, JSON.stringify(value), { EX: ttl });
+ }
+
+ async del(key: string) {
+ await this.connect();
+
+ return this.client.del(key);
+ }
+
+ async incr(key: string) {
+ await this.connect();
+
+ return this.client.incr(key);
+ }
+
+ async expire(key: string, seconds: number) {
+ await this.connect();
+
+ return this.client.expire(key, seconds);
+ }
+
+ async rateLimit(key: string, limit: number, seconds: number): Promise {
+ await this.connect();
+
+ const res = await this.client.incr(key);
+
+ if (res === 1) {
+ await this.client.expire(key, seconds);
+ }
+
+ return res >= limit;
+ }
+
+ async fetch(key: string, query: () => Promise, time?: number) {
+ const result = await this.get(key);
+
+ if (result === DELETED) return null;
+
+ if (!result && query) {
+ const data = await query();
+ if (data) {
+ await this.set(key, data, time);
+ }
+ return data;
+ }
+
+ return result;
+ }
+
+ async remove(key: string, soft = false) {
+ return soft ? this.set(key, DELETED) : this.del(key);
+ }
+}
+
+const REDIS = 'redis';
const enabled = !!process.env.REDIS_URL;
function getClient() {
const redis = new UmamiRedisClient(process.env.REDIS_URL);
+ const originalConnect = redis.connect.bind(redis);
+ let connectPromise: Promise | null = null;
+
+ const resetConnectionState = () => {
+ redis.isConnected = false;
+ };
+
+ redis.client.on('end', resetConnectionState);
+ redis.client.on('reconnecting', resetConnectionState);
+
+ redis.connect = async () => {
+ if (redis.client.isReady || redis.client.isOpen) {
+ redis.isConnected = true;
+ return;
+ }
+
+ if (connectPromise) {
+ return connectPromise;
+ }
+
+ connectPromise = (async () => {
+ try {
+ await originalConnect();
+ } catch (error) {
+ redis.isConnected = false;
+ throw error;
+ } finally {
+ connectPromise = null;
+ }
+ })();
+
+ return connectPromise;
+ };
if (process.env.NODE_ENV !== 'production') {
- global[REDIS] = redis;
+ globalThis[REDIS] = redis;
}
return redis;
}
-const client = global[REDIS] || getClient();
+const client: UmamiRedisClient = globalThis[REDIS] || getClient();
export default { client, enabled };
diff --git a/src/lib/request.ts b/src/lib/request.ts
index b75ea1ba1..69f6eb1d7 100644
--- a/src/lib/request.ts
+++ b/src/lib/request.ts
@@ -1,46 +1,41 @@
-import { z, ZodSchema } from 'zod';
-import { FILTER_COLUMNS, FILTER_GROUPS } from '@/lib/constants';
-import { badRequest, unauthorized } from '@/lib/response';
-import { getAllowedUnits, getMinimumUnit } from '@/lib/date';
+import { startOfMonth, subMonths } from 'date-fns';
+import { z } from 'zod';
import { checkAuth } from '@/lib/auth';
-import { getWebsiteSegment, getWebsiteDateRange } from '@/queries';
-
-export async function getJsonBody(request: Request) {
- try {
- return await request.clone().json();
- } catch {
- return undefined;
- }
-}
+import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS, OPERATORS } from '@/lib/constants';
+import { getAllowedUnits, getMinimumUnit, maxDate, parseDateRange } from '@/lib/date';
+import { fetchAccount, fetchWebsite } from '@/lib/load';
+import { filtersArrayToObject } from '@/lib/params';
+import { badRequest, unauthorized } from '@/lib/response';
+import type { QueryFilters } from '@/lib/types';
+import { getWebsiteSegment } from '@/queries/prisma';
export async function parseRequest(
request: Request,
- schema?: ZodSchema,
+ schema?: any,
options?: { skipAuth: boolean },
): Promise {
const url = new URL(request.url);
let query = Object.fromEntries(url.searchParams);
let body = await getJsonBody(request);
- let error: () => void | undefined;
+ let error: () => undefined | undefined | Response;
let auth = null;
- const getErrorMessages = (error: z.ZodError) => {
- return Object.entries(error.format())
- .map(([key, value]) => {
- const messages = (value as any)._errors;
- return messages ? `${key}: ${messages.join(', ')}` : null;
- })
- .filter(Boolean);
- };
-
if (schema) {
const isGet = request.method === 'GET';
+ const rawQuery = query;
const result = schema.safeParse(isGet ? query : body);
if (!result.success) {
- error = () => badRequest(getErrorMessages(result.error));
+ error = () => badRequest(z.treeifyError(result.error));
} else if (isGet) {
query = result.data;
+
+ // Re-add suffixed filter params (e.g., browser1, os2) stripped by Zod schema
+ for (const key of Object.keys(rawQuery)) {
+ if (/\d+$/.test(key) && !(key in query)) {
+ query[key] = rawQuery[key];
+ }
+ }
} else {
body = result.data;
}
@@ -57,56 +52,127 @@ export async function parseRequest(
return { url, query, body, auth, error };
}
-export async function getRequestDateRange(query: Record) {
- const { websiteId, startAt, endAt, unit } = query;
-
- // All-time
- if (+startAt === 0 && +endAt === 1) {
- const result = await getWebsiteDateRange(websiteId as string);
- const { min, max } = result[0];
- const startDate = new Date(min);
- const endDate = new Date(max);
-
- return {
- startDate,
- endDate,
- unit: getMinimumUnit(startDate, endDate),
- };
+export async function getJsonBody(request: Request) {
+ try {
+ return await request.clone().json();
+ } catch {
+ return undefined;
}
+}
+
+export function getRequestDateRange(query: Record) {
+ const { startAt, endAt, unit, timezone } = query;
const startDate = new Date(+startAt);
const endDate = new Date(+endAt);
- const minUnit = getMinimumUnit(startDate, endDate);
return {
startDate,
endDate,
- unit: (getAllowedUnits(startDate, endDate).includes(unit as string) ? unit : minUnit) as string,
+ timezone,
+ unit: getAllowedUnits(startDate, endDate).includes(unit)
+ ? unit
+ : getMinimumUnit(startDate, endDate),
};
}
-export async function getRequestFilters(query: Record, websiteId?: string) {
+export function getRequestFilters(query: Record) {
const result: Record = {};
- for (const key of Object.keys(FILTER_COLUMNS)) {
- const value = query[key];
- if (value !== undefined) {
- result[key] = value;
- }
- }
-
- for (const key of Object.keys(FILTER_GROUPS)) {
- const value = query[key];
- if (value !== undefined) {
- const segment = await getWebsiteSegment(websiteId, key, value);
- if (key === 'segment') {
- // merge filters into result
- Object.assign(result, segment.parameters);
- } else {
- result[key] = segment.parameters;
- }
+ for (const key of Object.keys(query)) {
+ const baseName = key.replace(/\d+$/, '');
+ if (baseName in FILTER_COLUMNS) {
+ result[key] = query[key];
}
}
return result;
}
+
+export async function setWebsiteDate(websiteId: string, data: Record) {
+ const website = await fetchWebsite(websiteId);
+ const cloudMode = !!process.env.CLOUD_MODE;
+
+ if (cloudMode && website && !website.teamId) {
+ const account = await fetchAccount(website.userId);
+
+ if (!account?.hasSubscription) {
+ data.startDate = maxDate(data.startDate, startOfMonth(subMonths(new Date(), 6)));
+ }
+ }
+
+ if (website?.resetAt) {
+ data.startDate = maxDate(data.startDate, new Date(website?.resetAt));
+ }
+
+ return data;
+}
+
+export async function getQueryFilters(
+ params: Record,
+ websiteId?: string,
+): Promise {
+ const dateRange = getRequestDateRange(params);
+ const filters = getRequestFilters(params);
+
+ let match = params?.match;
+
+ if (websiteId) {
+ await setWebsiteDate(websiteId, dateRange);
+
+ if (params.segment) {
+ const segmentParams = (await getWebsiteSegment(websiteId, params.segment))
+ ?.parameters as Record;
+
+ Object.assign(filters, filtersArrayToObject(segmentParams.filters));
+
+ if (segmentParams.match) {
+ match = segmentParams.match;
+ }
+ }
+
+ if (params.cohort) {
+ const cohortParams = (await getWebsiteSegment(websiteId, params.cohort))
+ ?.parameters as Record;
+
+ const { startDate, endDate } = parseDateRange(cohortParams.dateRange);
+
+ const cohortFilters = cohortParams.filters.map(({ name, ...props }) => ({
+ ...props,
+ name: `cohort_${name}`,
+ }));
+
+ cohortFilters.push({
+ name: `cohort_${cohortParams.action.type}`,
+ operator: OPERATORS.equals,
+ value: cohortParams.action.value,
+ });
+
+ Object.assign(filters, {
+ ...filtersArrayToObject(cohortFilters),
+ cohort_startDate: startDate,
+ cohort_endDate: endDate,
+ ...(cohortParams.match && {
+ cohort_match: cohortParams.match,
+ cohort_actionName: `cohort_${cohortParams.action.type}`,
+ }),
+ });
+ }
+
+ if (params.excludeBounce) {
+ Object.assign(filters, { excludeBounce: true });
+ }
+ }
+
+ return {
+ ...dateRange,
+ ...filters,
+ match,
+ page: params?.page,
+ pageSize: params?.pageSize ? params?.pageSize || DEFAULT_PAGE_SIZE : undefined,
+ orderBy: params?.orderBy,
+ sortDescending: params?.sortDescending,
+ search: params?.search,
+ compare: params?.compare,
+ };
+}
diff --git a/src/lib/response.ts b/src/lib/response.ts
index d50b453c9..f1ad5c7bf 100644
--- a/src/lib/response.ts
+++ b/src/lib/response.ts
@@ -1,29 +1,58 @@
-import { serializeError } from 'serialize-error';
-
export function ok() {
return Response.json({ ok: true });
}
-export function json(data: any) {
+export function json(data: Record = {}) {
return Response.json(data);
}
-export function badRequest(error: any = 'Bad request') {
- return Response.json({ error: serializeError(error) }, { status: 400 });
+export function badRequest(error?: Record) {
+ return Response.json(
+ {
+ error: { message: 'Bad request', code: 'bad-request', status: 400, ...error },
+ },
+ { status: 400 },
+ );
}
-export function unauthorized(error: any = 'Unauthorized') {
- return Response.json({ error: serializeError(error) }, { status: 401 });
+export function unauthorized(error?: Record) {
+ return Response.json(
+ {
+ error: {
+ message: 'Unauthorized',
+ code: 'unauthorized',
+ status: 401,
+ ...error,
+ },
+ },
+ { status: 401 },
+ );
}
-export function forbidden(error: any = 'Forbidden') {
- return Response.json({ error: serializeError(error) }, { status: 403 });
+export function forbidden(error?: Record) {
+ return Response.json(
+ { error: { message: 'Forbidden', code: 'forbidden', status: 403, ...error } },
+ { status: 403 },
+ );
}
-export function notFound(error: any = 'Not found') {
- return Response.json({ error: serializeError(error) }, { status: 404 });
+export function notFound(error?: Record) {
+ return Response.json(
+ { error: { message: 'Not found', code: 'not-found', status: 404, ...error } },
+ { status: 404 },
+ );
}
-export function serverError(error: any = 'Server error') {
- return Response.json({ error: serializeError(error) }, { status: 500 });
+export function serverError(error?: Record) {
+ return Response.json(
+ {
+ error: {
+ message: 'Server error',
+ code: 'server-error',
+ status: 500,
+ ...error,
+ },
+ },
+ { status: 500 },
+ );
}
diff --git a/src/lib/schema.ts b/src/lib/schema.ts
index 51a95748c..2567c3de6 100644
--- a/src/lib/schema.ts
+++ b/src/lib/schema.ts
@@ -2,8 +2,48 @@ import { z } from 'zod';
import { isValidTimezone, normalizeTimezone } from '@/lib/date';
import { UNIT_TYPES } from './constants';
+export const timezoneParam = z
+ .string()
+ .refine((value: string) => isValidTimezone(value), {
+ message: 'Invalid timezone',
+ })
+ .transform((value: string) => normalizeTimezone(value));
+
+export const unitParam = z.string().refine(value => UNIT_TYPES.includes(value), {
+ message: 'Invalid unit',
+});
+
+export const dateRangeParams = {
+ startAt: z.coerce.number().optional(),
+ endAt: z.coerce.number().optional(),
+ startDate: z.coerce.date().optional(),
+ endDate: z.coerce.date().optional(),
+ timezone: timezoneParam.optional(),
+ unit: unitParam.optional(),
+ compare: z.enum(['prev', 'yoy']).optional(),
+};
+
+export function withDateRange(shape?: T) {
+ return z
+ .object({
+ ...dateRangeParams,
+ ...shape,
+ })
+ .superRefine((data: Record, ctx) => {
+ const hasTimestamps = data.startAt != null && data.endAt != null;
+ const hasDates = data.startDate != null && data.endDate != null;
+
+ if (!hasTimestamps && !hasDates) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ message: 'Either startAt+endAt or startDate+endDate must be provided',
+ });
+ }
+ });
+}
+
export const filterParams = {
- url: z.string().optional(),
+ path: z.string().optional(),
referrer: z.string().optional(),
title: z.string().optional(),
query: z.string().optional(),
@@ -14,31 +54,40 @@ export const filterParams = {
region: z.string().optional(),
city: z.string().optional(),
tag: z.string().optional(),
- host: z.string().optional(),
+ hostname: z.string().optional(),
+ distinctId: z.string().optional(),
language: z.string().optional(),
event: z.string().optional(),
- segment: z.string().optional(),
- cohort: z.string().optional(),
+ utmSource: z.string().optional(),
+ utmMedium: z.string().optional(),
+ utmCampaign: z.string().optional(),
+ utmContent: z.string().optional(),
+ utmTerm: z.string().optional(),
+ segment: z.uuid().optional(),
+ cohort: z.uuid().optional(),
+ eventType: z.coerce.number().int().positive().optional(),
+ excludeBounce: z.string().optional(),
+ match: z.enum(['all', 'any']).optional(),
+};
+
+export const searchParams = {
+ search: z.string().optional(),
};
export const pagingParams = {
page: z.coerce.number().int().positive().optional(),
pageSize: z.coerce.number().int().positive().optional(),
- orderBy: z.string().optional(),
- search: z.string().optional(),
};
-export const timezoneParam = z.string().refine((value: string) => isValidTimezone(value), {
- message: 'Invalid timezone',
-}).transform((value: string) => normalizeTimezone(value));
+export const sortingParams = {
+ orderBy: z.string().optional(),
+};
-export const unitParam = z.string().refine(value => UNIT_TYPES.includes(value), {
- message: 'Invalid unit',
-});
+export const userRoleParam = z.enum(['admin', 'user', 'view-only']);
-export const roleParam = z.enum(['team-member', 'team-view-only', 'team-manager']);
+export const teamRoleParam = z.enum(['team-member', 'team-view-only', 'team-manager']);
-export const anyObjectParam = z.object({}).passthrough();
+export const anyObjectParam = z.record(z.string(), z.any());
export const urlOrPathParam = z.string().refine(
value => {
@@ -54,27 +103,219 @@ export const urlOrPathParam = z.string().refine(
},
);
-export const reportTypeParam = z.enum([
- 'funnel',
- 'insights',
- 'retention',
- 'utm',
- 'goals',
- 'journey',
- 'revenue',
- 'attribution',
+export const fieldsParam = z.enum([
+ 'path',
+ 'referrer',
+ 'title',
+ 'query',
+ 'os',
+ 'browser',
+ 'device',
+ 'country',
+ 'region',
+ 'city',
+ 'tag',
+ 'hostname',
+ 'distinctId',
+ 'language',
+ 'event',
+ 'utmSource',
+ 'utmMedium',
+ 'utmCampaign',
+ 'utmContent',
+ 'utmTerm',
]);
-export const reportParms = {
- websiteId: z.string().uuid(),
- dateRange: z.object({
+export const reportTypeParam = z.enum([
+ 'attribution',
+ 'breakdown',
+ 'funnel',
+ 'goal',
+ 'journey',
+ 'performance',
+ 'retention',
+ 'revenue',
+ 'utm',
+]);
+
+export const operatorParam = z.enum([
+ 'eq',
+ 'neq',
+ 's',
+ 'ns',
+ 'c',
+ 'dnc',
+ 're',
+ 'nre',
+ 't',
+ 'f',
+ 'gt',
+ 'lt',
+ 'gte',
+ 'lte',
+ 'bf',
+ 'af',
+]);
+
+export const goalReportSchema = z.object({
+ type: z.literal('goal'),
+ parameters: z
+ .object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ type: z.string(),
+ value: z.string(),
+ }),
+});
+
+export const funnelReportSchema = z.object({
+ type: z.literal('funnel'),
+ parameters: z.object({
startDate: z.coerce.date(),
endDate: z.coerce.date(),
- num: z.coerce.number().optional(),
- offset: z.coerce.number().optional(),
- unit: z.string().optional(),
- value: z.string().optional(),
+ window: z.coerce.number().positive(),
+ steps: z
+ .array(
+ z.object({
+ type: z.enum(['path', 'event']),
+ value: z.string(),
+ filters: z
+ .array(
+ z.object({
+ property: z.string().min(1),
+ operator: z.enum(['eq', 'neq', 'c', 'dnc']),
+ value: z.string(),
+ }),
+ )
+ .optional(),
+ }),
+ )
+ .min(2)
+ .max(8),
}),
-};
+});
+
+export const journeyReportSchema = z.object({
+ type: z.literal('journey'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ steps: z.coerce.number().min(2).max(7),
+ startStep: z.string().optional(),
+ endStep: z.string().optional(),
+ eventType: z.coerce.number().int().positive().optional(),
+ }),
+});
+
+export const retentionReportSchema = z.object({
+ type: z.literal('retention'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ timezone: timezoneParam.optional(),
+ }),
+});
+
+export const utmReportSchema = z.object({
+ type: z.literal('utm'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ }),
+});
+
+export const performanceReportSchema = z.object({
+ type: z.literal('performance'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ unit: unitParam.optional(),
+ timezone: timezoneParam.optional(),
+ metric: z.enum(['lcp', 'inp', 'cls', 'fcp', 'ttfb']).optional(),
+ }),
+});
+
+export const revenueReportSchema = z.object({
+ type: z.literal('revenue'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ unit: unitParam.optional(),
+ timezone: timezoneParam.optional(),
+ currency: z.string(),
+ compare: z.enum(['prev', 'yoy']).optional(),
+ }),
+});
+
+export const attributionReportSchema = z.object({
+ type: z.literal('attribution'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ model: z.enum(['first-click', 'last-click']),
+ type: z.enum(['path', 'event']),
+ step: z.string(),
+ currency: z.string().optional(),
+ }),
+});
+
+export const breakdownReportSchema = z.object({
+ type: z.literal('breakdown'),
+ parameters: z.object({
+ startDate: z.coerce.date(),
+ endDate: z.coerce.date(),
+ fields: z.array(fieldsParam),
+ }),
+});
+
+export const reportBaseSchema = z.object({
+ websiteId: z.uuid(),
+ type: reportTypeParam,
+ name: z.string().max(200),
+ description: z.string().max(500).optional(),
+ parameters: anyObjectParam,
+});
+
+export const reportTypeSchema = z.discriminatedUnion('type', [
+ goalReportSchema,
+ funnelReportSchema,
+ journeyReportSchema,
+ performanceReportSchema,
+ retentionReportSchema,
+ utmReportSchema,
+ revenueReportSchema,
+ attributionReportSchema,
+ breakdownReportSchema,
+]);
+
+export const reportSchema = reportBaseSchema;
+
+export const reportResultSchema = z.intersection(
+ z.object({
+ websiteId: z.uuid(),
+ filters: z.object({ ...filterParams }),
+ }),
+ reportTypeSchema,
+);
export const segmentTypeParam = z.enum(['segment', 'cohort']);
+
+export const segmentParamSchema = z.object({
+ filters: z
+ .array(
+ z.object({
+ name: z.string(),
+ operator: operatorParam,
+ value: z.string(),
+ }),
+ )
+ .optional(),
+ match: z.enum(['all', 'any']).optional(),
+ dateRange: z.string().optional(),
+ action: z
+ .object({
+ type: z.string(),
+ value: z.string(),
+ })
+ .optional(),
+});
diff --git a/src/lib/storage.ts b/src/lib/storage.ts
index f08a7f7a3..19681a2db 100644
--- a/src/lib/storage.ts
+++ b/src/lib/storage.ts
@@ -1,4 +1,4 @@
-export function setItem(key: string, data: any, session?: boolean): void {
+export function setItem(key: string, data: any, session?: boolean) {
if (typeof window !== 'undefined' && data) {
return (session ? sessionStorage : localStorage).setItem(key, JSON.stringify(data));
}
@@ -9,12 +9,16 @@ export function getItem(key: string, session?: boolean): any {
const value = (session ? sessionStorage : localStorage).getItem(key);
if (value !== 'undefined' && value !== null) {
- return JSON.parse(value);
+ try {
+ return JSON.parse(value);
+ } catch {
+ return null;
+ }
}
}
}
-export function removeItem(key: string, session?: boolean): void {
+export function removeItem(key: string, session?: boolean) {
if (typeof window !== 'undefined') {
return (session ? sessionStorage : localStorage).removeItem(key);
}
diff --git a/src/lib/types.ts b/src/lib/types.ts
index daeac2e22..f2e49dab6 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -1,54 +1,16 @@
-import {
- COLLECTION_TYPE,
- DATA_TYPE,
- EVENT_TYPE,
- KAFKA_TOPIC,
- PERMISSIONS,
- REPORT_TYPES,
- ROLES,
-} from './constants';
-import { TIME_UNIT } from './date';
-import { Dispatch, SetStateAction } from 'react';
+import type { UseQueryOptions } from '@tanstack/react-query';
+import type { Board as PrismaBoard } from '@/generated/prisma/client';
+import type { DATA_TYPE, OPERATORS, ROLES } from './constants';
+import type { TIME_UNIT } from './date';
-type ObjectValues = T[keyof T];
+export type ObjectValues = T[keyof T];
+
+export type ReactQueryOptions = Omit, 'queryKey' | 'queryFn'>;
export type TimeUnit = ObjectValues;
-export type Permission = ObjectValues;
-
-export type CollectionType = ObjectValues;
export type Role = ObjectValues;
-export type EventType = ObjectValues;
export type DynamicDataType = ObjectValues;
-export type KafkaTopic = ObjectValues;
-export type ReportType = ObjectValues;
-
-export interface PageParams {
- search?: string;
- page?: string | number;
- pageSize?: string;
- orderBy?: string;
- sortDescending?: boolean;
-}
-
-export interface PageResult {
- data: T;
- count: number;
- page: number;
- pageSize: number;
- orderBy?: string;
- sortDescending?: boolean;
-}
-
-export interface PagedQueryResult {
- result: PageResult;
- query: any;
- params: PageParams;
- setParams: Dispatch>;
-}
-
-export interface DynamicData {
- [key: string]: number | string | number[] | string[];
-}
+export type Operator = (typeof OPERATORS)[keyof typeof OPERATORS];
export interface Auth {
user?: {
@@ -57,93 +19,67 @@ export interface Auth {
role: string;
isAdmin: boolean;
};
- grant?: Permission[];
shareToken?: {
- websiteId: string;
+ websiteId?: string;
+ websiteIds?: string[];
+ boardId?: string;
+ pixelId?: string;
+ linkId?: string;
};
}
-export interface User {
- id: string;
- username: string;
- password?: string;
- role: string;
- createdAt?: Date;
-}
-
-export interface Website {
- id: string;
- userId: string;
- resetAt: Date;
+export interface Filter {
name: string;
- domain: string;
- shareId: string;
- createdAt: Date;
-}
-
-export interface Share {
- id: string;
- token: string;
-}
-
-export interface WebsiteActive {
- x: number;
-}
-
-export interface WebsiteMetric {
- x: string;
- y: number;
-}
-
-export interface WebsiteEventMetric {
- x: string;
- t: string;
- y: number;
-}
-
-export interface WebsiteEventData {
- eventName?: string;
- propertyName: string;
- dataType: number;
- propertyValue?: string;
- total: number;
-}
-
-export interface WebsitePageviews {
- pageviews: {
- t: string;
- y: number;
- };
- sessions: {
- t: string;
- y: number;
- };
-}
-
-export interface WebsiteStats {
- pageviews: { value: number; prev: number };
- visitors: { value: number; prev: number };
- visits: { value: number; prev: number };
- bounces: { value: number; prev: number };
- totaltime: { value: number; prev: number };
+ operator: Operator;
+ value: string | string[];
+ type?: string;
+ column?: string;
+ prefix?: string;
+ paramName?: string;
}
export interface DateRange {
- value: string;
startDate: Date;
endDate: Date;
+ value?: string;
unit?: TimeUnit;
num?: number;
offset?: number;
}
-export interface QueryFilters {
+export interface DynamicData {
+ [key: string]: number | string | number[] | string[];
+}
+
+export interface QueryOptions {
+ joinSession?: boolean;
+ columns?: Record;
+ limit?: number;
+ prefix?: string;
+ isCohort?: boolean;
+ cohortMatch?: string;
+ cohortActionName?: string;
+}
+
+export interface QueryFilters
+ extends DateParams,
+ FilterParams,
+ SortParams,
+ PageParams,
+ SegmentParams {
+ cohortFilters?: QueryFilters;
+}
+
+export interface DateParams {
startDate?: Date;
endDate?: Date;
- timezone?: string;
unit?: string;
- eventType?: number;
- url?: string;
+ timezone?: string;
+ compareDate?: Date;
+}
+
+export interface FilterParams {
+ path?: string;
referrer?: string;
title?: string;
query?: string;
@@ -158,20 +94,44 @@ export interface QueryFilters {
event?: string;
search?: string;
tag?: string;
- cohort?: { [key: string]: string };
+ eventType?: number;
+ segment?: string;
+ cohort?: string;
+ compare?: string;
+ excludeBounce?: boolean;
+ match?: 'all' | 'any';
}
-export interface QueryOptions {
- joinSession?: boolean;
- columns?: { [key: string]: string };
- limit?: number;
+export interface SortParams {
+ orderBy?: string;
+ sortDescending?: boolean;
+}
+
+export interface PageParams {
+ page?: number;
+ pageSize?: number;
+}
+
+export interface SegmentParams {
+ segment?: string;
+ cohort?: string;
+}
+
+export interface PageResult {
+ data: T;
+ count: number;
+ page: number;
+ pageSize: number;
+ orderBy?: string;
+ sortDescending?: boolean;
+ search?: string;
}
export interface RealtimeData {
- countries: { [key: string]: number };
+ countries: Record;
events: any[];
pageviews: any[];
- referrers: { [key: string]: number };
+ referrers: Record;
timestamp: number;
series: {
views: any[];
@@ -183,23 +143,50 @@ export interface RealtimeData {
events: number;
countries: number;
};
- urls: { [key: string]: number };
+ urls: Record;
visitors: any[];
}
-export interface SessionData {
- id: string;
- websiteId: string;
- visitId: string;
- hostname: string;
- browser: string;
- os: string;
- device: string;
- screen: string;
- language: string;
- country: string;
- region: string;
- city: string;
- ip?: string;
- userAgent?: string;
+export interface ApiError extends Error {
+ code?: string;
+ message: string;
+}
+
+export interface BoardComponentConfig {
+ type: string;
+ entityType?: 'website' | 'pixel' | 'link';
+ entityId?: string;
+ websiteId?: string;
+ title?: string;
+ description?: string;
+ props?: Record;
+}
+
+export interface BoardColumn {
+ id: string;
+ component?: BoardComponentConfig;
+ size?: number;
+}
+
+export interface BoardRow {
+ id: string;
+ columns: BoardColumn[];
+ size?: number;
+}
+
+export interface BoardParameters {
+ websiteId?: string;
+ pixelId?: string;
+ linkId?: string;
+ rows?: BoardRow[];
+}
+
+export interface Board extends Omit {
+ parameters: BoardParameters;
+}
+
+export interface WhiteLabel {
+ displayName: string;
+ domainName: string;
+ logoUrl: string;
}
diff --git a/src/lib/url.ts b/src/lib/url.ts
index a039d7d88..f6772feec 100644
--- a/src/lib/url.ts
+++ b/src/lib/url.ts
@@ -10,9 +10,9 @@ export function getQueryString(params: object = {}): string {
return searchParams.toString();
}
-export function buildUrl(url: string, params: object = {}): string {
+export function buildPath(path: string, params: object = {}): string {
const queryString = getQueryString(params);
- return `${url}${queryString && '?' + queryString}`;
+ return queryString ? `${path}?${queryString}` : path;
}
export function safeDecodeURI(s: string | undefined | null): string | undefined | null {
@@ -22,7 +22,7 @@ export function safeDecodeURI(s: string | undefined | null): string | undefined
try {
return decodeURI(s);
- } catch (e) {
+ } catch {
return s;
}
}
@@ -34,7 +34,16 @@ export function safeDecodeURIComponent(s: string | undefined | null): string | u
try {
return decodeURIComponent(s);
- } catch (e) {
+ } catch {
return s;
}
}
+
+export function isValidUrl(url: string) {
+ try {
+ new URL(url);
+ return true;
+ } catch {
+ return false;
+ }
+}
diff --git a/src/permissions/board.ts b/src/permissions/board.ts
new file mode 100644
index 000000000..67c25d03a
--- /dev/null
+++ b/src/permissions/board.ts
@@ -0,0 +1,92 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import type { Auth } from '@/lib/types';
+import { getBoard, getTeamUser } from '@/queries/prisma';
+
+export async function canViewBoard({ user, shareToken }: Auth, boardId: string) {
+ if (user?.isAdmin) {
+ return true;
+ }
+
+ if (shareToken?.boardId === boardId) {
+ return true;
+ }
+
+ if (!user) {
+ return false;
+ }
+
+ const board = await getBoard(boardId);
+
+ if (!board) {
+ return false;
+ }
+
+ if (board.userId) {
+ return user.id === board.userId;
+ }
+
+ if (board.teamId) {
+ const teamUser = await getTeamUser(board.teamId, user.id);
+
+ return !!teamUser;
+ }
+
+ return false;
+}
+
+export async function canUpdateBoard({ user }: Auth, boardId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const board = await getBoard(boardId);
+
+ if (!board) {
+ return false;
+ }
+
+ if (board.userId) {
+ return user.id === board.userId;
+ }
+
+ if (board.teamId) {
+ const teamUser = await getTeamUser(board.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
+ }
+
+ return false;
+}
+
+export async function canDeleteBoard({ user }: Auth, boardId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const board = await getBoard(boardId);
+
+ if (!board) {
+ return false;
+ }
+
+ if (board.userId) {
+ return user.id === board.userId;
+ }
+
+ if (board.teamId) {
+ const teamUser = await getTeamUser(board.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
+ }
+
+ return false;
+}
diff --git a/src/permissions/entity.ts b/src/permissions/entity.ts
new file mode 100644
index 000000000..5a7fb3b00
--- /dev/null
+++ b/src/permissions/entity.ts
@@ -0,0 +1,89 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import { getEntity } from '@/lib/entity';
+import type { Auth } from '@/lib/types';
+import { getTeamUser } from '@/queries/prisma';
+
+export async function canViewEntity({ user }: Auth, entityId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const entity = await getEntity(entityId);
+
+ if (!entity) {
+ return false;
+ }
+
+ if (entity.userId) {
+ return user.id === entity.userId;
+ }
+
+ if (entity.teamId) {
+ const teamUser = await getTeamUser(entity.teamId, user.id);
+
+ return !!teamUser;
+ }
+
+ return false;
+}
+
+export async function canUpdateEntity({ user }: Auth, entityId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const entity = await getEntity(entityId);
+
+ if (!entity) {
+ return false;
+ }
+
+ if (entity.userId) {
+ return user.id === entity.userId;
+ }
+
+ if (entity.teamId) {
+ const teamUser = await getTeamUser(entity.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
+ }
+
+ return false;
+}
+
+export async function canDeleteEntity({ user }: Auth, entityId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const entity = await getEntity(entityId);
+
+ if (!entity) {
+ return false;
+ }
+
+ if (entity.userId) {
+ return user.id === entity.userId;
+ }
+
+ if (entity.teamId) {
+ const teamUser = await getTeamUser(entity.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
+ }
+
+ return false;
+}
diff --git a/src/permissions/index.ts b/src/permissions/index.ts
new file mode 100644
index 000000000..c566d77c6
--- /dev/null
+++ b/src/permissions/index.ts
@@ -0,0 +1,8 @@
+export * from './board';
+export * from './entity';
+export * from './link';
+export * from './pixel';
+export * from './report';
+export * from './team';
+export * from './user';
+export * from './website';
diff --git a/src/permissions/link.ts b/src/permissions/link.ts
new file mode 100644
index 000000000..e77676998
--- /dev/null
+++ b/src/permissions/link.ts
@@ -0,0 +1,80 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import type { Auth } from '@/lib/types';
+import { getLink, getTeamUser } from '@/queries/prisma';
+
+export async function canViewLink({ user, shareToken }: Auth, linkId: string) {
+ if (user?.isAdmin) {
+ return true;
+ }
+
+ if (shareToken?.linkId === linkId || shareToken?.websiteId === linkId) {
+ return true;
+ }
+
+ if (!user) {
+ return false;
+ }
+
+ const link = await getLink(linkId);
+
+ if (link.userId) {
+ return user.id === link.userId;
+ }
+
+ if (link.teamId) {
+ const teamUser = await getTeamUser(link.teamId, user.id);
+
+ return !!teamUser;
+ }
+
+ return false;
+}
+
+export async function canUpdateLink({ user }: Auth, linkId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const link = await getLink(linkId);
+
+ if (link.userId) {
+ return user.id === link.userId;
+ }
+
+ if (link.teamId) {
+ const teamUser = await getTeamUser(link.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
+ }
+
+ return false;
+}
+
+export async function canDeleteLink({ user }: Auth, linkId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const link = await getLink(linkId);
+
+ if (link.userId) {
+ return user.id === link.userId;
+ }
+
+ if (link.teamId) {
+ const teamUser = await getTeamUser(link.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
+ }
+
+ return false;
+}
diff --git a/src/permissions/pixel.ts b/src/permissions/pixel.ts
new file mode 100644
index 000000000..bf7c7aed0
--- /dev/null
+++ b/src/permissions/pixel.ts
@@ -0,0 +1,80 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import type { Auth } from '@/lib/types';
+import { getPixel, getTeamUser } from '@/queries/prisma';
+
+export async function canViewPixel({ user, shareToken }: Auth, pixelId: string) {
+ if (user?.isAdmin) {
+ return true;
+ }
+
+ if (shareToken?.pixelId === pixelId || shareToken?.websiteId === pixelId) {
+ return true;
+ }
+
+ if (!user) {
+ return false;
+ }
+
+ const pixel = await getPixel(pixelId);
+
+ if (pixel.userId) {
+ return user.id === pixel.userId;
+ }
+
+ if (pixel.teamId) {
+ const teamUser = await getTeamUser(pixel.teamId, user.id);
+
+ return !!teamUser;
+ }
+
+ return false;
+}
+
+export async function canUpdatePixel({ user }: Auth, pixelId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const pixel = await getPixel(pixelId);
+
+ if (pixel.userId) {
+ return user.id === pixel.userId;
+ }
+
+ if (pixel.teamId) {
+ const teamUser = await getTeamUser(pixel.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
+ }
+
+ return false;
+}
+
+export async function canDeletePixel({ user }: Auth, pixelId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const pixel = await getPixel(pixelId);
+
+ if (pixel.userId) {
+ return user.id === pixel.userId;
+ }
+
+ if (pixel.teamId) {
+ const teamUser = await getTeamUser(pixel.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
+ }
+
+ return false;
+}
diff --git a/src/permissions/report.ts b/src/permissions/report.ts
new file mode 100644
index 000000000..fec37d8ca
--- /dev/null
+++ b/src/permissions/report.ts
@@ -0,0 +1,47 @@
+import type { Report } from '@/generated/prisma/client';
+import type { Auth } from '@/lib/types';
+import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from './website';
+
+export async function canViewReport(auth: Auth, report: Report) {
+ if (auth.user?.isAdmin) {
+ return true;
+ }
+
+ if (auth.user?.id === report.userId) {
+ return true;
+ }
+
+ return !!(await canViewWebsite(auth, report.websiteId));
+}
+
+export async function canUpdateReport(auth: Auth, report: Report) {
+ if (!auth.user) {
+ return false;
+ }
+
+ if (auth.user.isAdmin) {
+ return true;
+ }
+
+ if (auth.user.id === report.userId) {
+ return true;
+ }
+
+ return !!(await canUpdateWebsite(auth, report.websiteId));
+}
+
+export async function canDeleteReport(auth: Auth, report: Report) {
+ if (!auth.user) {
+ return false;
+ }
+
+ if (auth.user.isAdmin) {
+ return true;
+ }
+
+ if (auth.user.id === report.userId) {
+ return true;
+ }
+
+ return !!(await canDeleteWebsite(auth, report.websiteId));
+}
diff --git a/src/permissions/team.ts b/src/permissions/team.ts
new file mode 100644
index 000000000..130290af2
--- /dev/null
+++ b/src/permissions/team.ts
@@ -0,0 +1,92 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import type { Auth } from '@/lib/types';
+import { getTeamUser } from '@/queries/prisma';
+
+export async function canViewTeam({ user }: Auth, teamId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ return getTeamUser(teamId, user.id);
+}
+
+export async function canCreateTeam({ user }: Auth) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ return hasPermission(user.role, PERMISSIONS.teamCreate);
+}
+
+export async function canUpdateTeam({ user }: Auth, teamId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const teamUser = await getTeamUser(teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamUpdate);
+}
+
+export async function canDeleteTeam({ user }: Auth, teamId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const teamUser = await getTeamUser(teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamDelete);
+}
+
+export async function canDeleteTeamUser({ user }: Auth, teamId: string, removeUserId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ if (removeUserId === user.id) {
+ return true;
+ }
+
+ const teamUser = await getTeamUser(teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.teamUpdate);
+}
+
+export async function canCreateTeamWebsite({ user }: Auth, teamId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const teamUser = await getTeamUser(teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteCreate);
+}
+
+export async function canViewAllTeams({ user }: Auth) {
+ return user?.isAdmin ?? false;
+}
diff --git a/src/permissions/user.ts b/src/permissions/user.ts
new file mode 100644
index 000000000..8aa453aec
--- /dev/null
+++ b/src/permissions/user.ts
@@ -0,0 +1,37 @@
+import type { Auth } from '@/lib/types';
+
+export async function canCreateUser({ user }: Auth) {
+ return user?.isAdmin ?? false;
+}
+
+export async function canViewUser({ user }: Auth, viewedUserId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ return user.id === viewedUserId;
+}
+
+export async function canViewUsers({ user }: Auth) {
+ return user?.isAdmin ?? false;
+}
+
+export async function canUpdateUser({ user }: Auth, viewedUserId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ return user.id === viewedUserId;
+}
+
+export async function canDeleteUser({ user }: Auth) {
+ return user?.isAdmin ?? false;
+}
diff --git a/src/permissions/website.ts b/src/permissions/website.ts
new file mode 100644
index 000000000..7d4efe1d3
--- /dev/null
+++ b/src/permissions/website.ts
@@ -0,0 +1,150 @@
+import { hasPermission } from '@/lib/auth';
+import { PERMISSIONS } from '@/lib/constants';
+import { getEntity } from '@/lib/entity';
+import type { Auth } from '@/lib/types';
+import { getTeamUser, getWebsite } from '@/queries/prisma';
+
+export async function canViewWebsite({ user, shareToken }: Auth, websiteId: string) {
+ if (user?.isAdmin) {
+ return true;
+ }
+
+ if (
+ shareToken?.websiteId === websiteId ||
+ shareToken?.pixelId === websiteId ||
+ shareToken?.linkId === websiteId ||
+ shareToken?.websiteIds?.includes(websiteId)
+ ) {
+ return true;
+ }
+
+ const entity = await getEntity(websiteId);
+
+ if (!entity || !user) {
+ return false;
+ }
+
+ if (entity.userId) {
+ return user.id === entity.userId;
+ }
+
+ if (entity.teamId) {
+ const teamUser = await getTeamUser(entity.teamId, user.id);
+
+ return !!teamUser;
+ }
+
+ return false;
+}
+
+export async function canViewAllWebsites({ user }: Auth) {
+ return user?.isAdmin ?? false;
+}
+
+export async function canCreateWebsite({ user }: Auth) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ return hasPermission(user.role, PERMISSIONS.websiteCreate);
+}
+
+export async function canUpdateWebsite({ user }: Auth, websiteId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const website = await getWebsite(websiteId);
+
+ if (!website) {
+ return false;
+ }
+
+ if (website.userId) {
+ return user.id === website.userId;
+ }
+
+ if (website.teamId) {
+ const teamUser = await getTeamUser(website.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteUpdate);
+ }
+
+ return false;
+}
+
+export async function canDeleteWebsite({ user }: Auth, websiteId: string) {
+ if (!user) {
+ return false;
+ }
+
+ if (user.isAdmin) {
+ return true;
+ }
+
+ const website = await getWebsite(websiteId);
+
+ if (!website) {
+ return false;
+ }
+
+ if (website.userId) {
+ return user.id === website.userId;
+ }
+
+ if (website.teamId) {
+ const teamUser = await getTeamUser(website.teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteDelete);
+ }
+
+ return false;
+}
+
+export async function canTransferWebsiteToUser({ user }: Auth, websiteId: string, userId: string) {
+ if (!user) {
+ return false;
+ }
+
+ const website = await getWebsite(websiteId);
+
+ if (!website) {
+ return false;
+ }
+
+ if (website.teamId && user.id === userId) {
+ const teamUser = await getTeamUser(website.teamId, userId);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteTransferToUser);
+ }
+
+ return false;
+}
+
+export async function canTransferWebsiteToTeam({ user }: Auth, websiteId: string, teamId: string) {
+ if (!user) {
+ return false;
+ }
+
+ const website = await getWebsite(websiteId);
+
+ if (!website) {
+ return false;
+ }
+
+ if (website.userId && website.userId === user.id) {
+ const teamUser = await getTeamUser(teamId, user.id);
+
+ return teamUser && hasPermission(teamUser.role, PERMISSIONS.websiteTransferToTeam);
+ }
+
+ return false;
+}
diff --git a/src/queries/index.ts b/src/queries/index.ts
deleted file mode 100644
index 0d57b2944..000000000
--- a/src/queries/index.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-export * from '@/queries/prisma/report';
-export * from '@/queries/prisma/segment';
-export * from '@/queries/prisma/team';
-export * from '@/queries/prisma/teamUser';
-export * from '@/queries/prisma/user';
-export * from '@/queries/prisma/website';
-export * from '@/queries/sql/events/getEventDataEvents';
-export * from '@/queries/sql/events/getEventDataFields';
-export * from '@/queries/sql/events/getEventDataProperties';
-export * from '@/queries/sql/events/getEventDataValues';
-export * from '@/queries/sql/events/getEventDataStats';
-export * from '@/queries/sql/events/getEventDataUsage';
-export * from '@/queries/sql/events/getEventMetrics';
-export * from '@/queries/sql/events/getEventStats';
-export * from '@/queries/sql/events/getWebsiteEvents';
-export * from '@/queries/sql/events/getEventUsage';
-export * from '@/queries/sql/events/saveEvent';
-export * from '@/queries/sql/reports/getFunnel';
-export * from '@/queries/sql/reports/getJourney';
-export * from '@/queries/sql/reports/getRetention';
-export * from '@/queries/sql/reports/getInsights';
-export * from '@/queries/sql/reports/getUTM';
-export * from '@/queries/sql/pageviews/getPageviewMetrics';
-export * from '@/queries/sql/pageviews/getPageviewStats';
-export * from '@/queries/sql/sessions/createSession';
-export * from '@/queries/sql/sessions/getWebsiteSession';
-export * from '@/queries/sql/sessions/getSessionData';
-export * from '@/queries/sql/sessions/getSessionDataProperties';
-export * from '@/queries/sql/sessions/getSessionDataValues';
-export * from '@/queries/sql/sessions/getSessionMetrics';
-export * from '@/queries/sql/sessions/getWebsiteSessions';
-export * from '@/queries/sql/sessions/getWebsiteSessionStats';
-export * from '@/queries/sql/sessions/getWebsiteSessionsWeekly';
-export * from '@/queries/sql/sessions/getSessionActivity';
-export * from '@/queries/sql/sessions/getSessionStats';
-export * from '@/queries/sql/sessions/saveSessionData';
-export * from '@/queries/sql/getActiveVisitors';
-export * from '@/queries/sql/getChannelMetrics';
-export * from '@/queries/sql/getRealtimeActivity';
-export * from '@/queries/sql/getRealtimeData';
-export * from '@/queries/sql/getValues';
-export * from '@/queries/sql/getWebsiteDateRange';
-export * from '@/queries/sql/getWebsiteStats';
diff --git a/src/queries/prisma/board.ts b/src/queries/prisma/board.ts
new file mode 100644
index 000000000..862ec36dd
--- /dev/null
+++ b/src/queries/prisma/board.ts
@@ -0,0 +1,68 @@
+import type { Prisma } from '@/generated/prisma/client';
+import { BOARD_TYPES } from '@/lib/boards';
+import prisma from '@/lib/prisma';
+import type { QueryFilters } from '@/lib/types';
+
+export async function findBoard(criteria: Prisma.BoardFindUniqueArgs) {
+ return prisma.client.board.findUnique(criteria);
+}
+
+export async function getBoard(boardId: string) {
+ return findBoard({
+ where: {
+ id: boardId,
+ },
+ });
+}
+
+export async function getBoards(criteria: Prisma.BoardFindManyArgs, filters: QueryFilters = {}) {
+ const { search } = filters;
+ const { getSearchParameters, pagedQuery } = prisma;
+
+ const where: Prisma.BoardWhereInput = {
+ ...criteria.where,
+ ...getSearchParameters(search, [{ name: 'contains' }, { description: 'contains' }]),
+ };
+
+ return pagedQuery('board', { ...criteria, where }, filters);
+}
+
+export async function getUserBoards(userId: string, filters?: QueryFilters) {
+ return getBoards(
+ {
+ where: {
+ userId,
+ type: {
+ not: BOARD_TYPES.dashboard,
+ },
+ },
+ },
+ filters,
+ );
+}
+
+export async function getTeamBoards(teamId: string, filters?: QueryFilters) {
+ return getBoards(
+ {
+ where: {
+ teamId,
+ type: {
+ not: BOARD_TYPES.dashboard,
+ },
+ },
+ },
+ filters,
+ );
+}
+
+export async function createBoard(data: Prisma.BoardUncheckedCreateInput) {
+ return prisma.client.board.create({ data });
+}
+
+export async function updateBoard(boardId: string, data: any) {
+ return prisma.client.board.update({ where: { id: boardId }, data });
+}
+
+export async function deleteBoard(boardId: string) {
+ return prisma.client.board.delete({ where: { id: boardId } });
+}
diff --git a/src/queries/prisma/index.ts b/src/queries/prisma/index.ts
new file mode 100644
index 000000000..27288c31c
--- /dev/null
+++ b/src/queries/prisma/index.ts
@@ -0,0 +1,11 @@
+export * from './board';
+export * from './link';
+export * from './pixel';
+export * from './report';
+export * from './segment';
+export * from './sessionReplay';
+export * from './share';
+export * from './team';
+export * from './teamUser';
+export * from './user';
+export * from './website';
diff --git a/src/queries/prisma/link.ts b/src/queries/prisma/link.ts
new file mode 100644
index 000000000..9b971dec4
--- /dev/null
+++ b/src/queries/prisma/link.ts
@@ -0,0 +1,66 @@
+import type { Prisma } from '@/generated/prisma/client';
+import prisma from '@/lib/prisma';
+import type { QueryFilters } from '@/lib/types';
+
+export async function findLink(criteria: Prisma.LinkFindUniqueArgs) {
+ return prisma.client.link.findUnique(criteria);
+}
+
+export async function getLink(linkId: string) {
+ return findLink({
+ where: {
+ id: linkId,
+ },
+ });
+}
+
+export async function getLinks(criteria: Prisma.LinkFindManyArgs, filters: QueryFilters = {}) {
+ const { search } = filters;
+ const { getSearchParameters, pagedQuery } = prisma;
+
+ const where: Prisma.LinkWhereInput = {
+ ...criteria.where,
+ ...getSearchParameters(search, [
+ { name: 'contains' },
+ { url: 'contains' },
+ { slug: 'contains' },
+ ]),
+ };
+
+ return pagedQuery('link', { ...criteria, where }, filters);
+}
+
+export async function getUserLinks(userId: string, filters?: QueryFilters) {
+ return getLinks(
+ {
+ where: {
+ userId,
+ deletedAt: null,
+ },
+ },
+ filters,
+ );
+}
+
+export async function getTeamLinks(teamId: string, filters?: QueryFilters) {
+ return getLinks(
+ {
+ where: {
+ teamId,
+ },
+ },
+ filters,
+ );
+}
+
+export async function createLink(data: Prisma.LinkUncheckedCreateInput) {
+ return prisma.client.link.create({ data });
+}
+
+export async function updateLink(linkId: string, data: any) {
+ return prisma.client.link.update({ where: { id: linkId }, data });
+}
+
+export async function deleteLink(linkId: string) {
+ return prisma.client.link.delete({ where: { id: linkId } });
+}
diff --git a/src/queries/prisma/pixel.ts b/src/queries/prisma/pixel.ts
new file mode 100644
index 000000000..4c9e132d5
--- /dev/null
+++ b/src/queries/prisma/pixel.ts
@@ -0,0 +1,60 @@
+import type { Prisma } from '@/generated/prisma/client';
+import prisma from '@/lib/prisma';
+import type { QueryFilters } from '@/lib/types';
+
+export async function findPixel(criteria: Prisma.PixelFindUniqueArgs) {
+ return prisma.client.pixel.findUnique(criteria);
+}
+
+export async function getPixel(pixelId: string) {
+ return findPixel({
+ where: {
+ id: pixelId,
+ },
+ });
+}
+
+export async function getPixels(criteria: Prisma.PixelFindManyArgs, filters: QueryFilters = {}) {
+ const { search } = filters;
+
+ const where: Prisma.PixelWhereInput = {
+ ...criteria.where,
+ ...prisma.getSearchParameters(search, [{ name: 'contains' }, { slug: 'contains' }]),
+ };
+
+ return prisma.pagedQuery('pixel', { ...criteria, where }, filters);
+}
+
+export async function getUserPixels(userId: string, filters?: QueryFilters) {
+ return getPixels(
+ {
+ where: {
+ userId,
+ },
+ },
+ filters,
+ );
+}
+
+export async function getTeamPixels(teamId: string, filters?: QueryFilters) {
+ return getPixels(
+ {
+ where: {
+ teamId,
+ },
+ },
+ filters,
+ );
+}
+
+export async function createPixel(data: Prisma.PixelUncheckedCreateInput) {
+ return prisma.client.pixel.create({ data });
+}
+
+export async function updatePixel(pixelId: string, data: any) {
+ return prisma.client.pixel.update({ where: { id: pixelId }, data });
+}
+
+export async function deletePixel(pixelId: string) {
+ return prisma.client.pixel.delete({ where: { id: pixelId } });
+}
diff --git a/src/queries/prisma/report.ts b/src/queries/prisma/report.ts
index 4feb9fb80..4a5b755c8 100644
--- a/src/queries/prisma/report.ts
+++ b/src/queries/prisma/report.ts
@@ -1,13 +1,14 @@
-import { Prisma, Report } from '@prisma/client';
+import { Prisma } from '@/generated/prisma/client';
import prisma from '@/lib/prisma';
-import { PageResult, PageParams } from '@/lib/types';
+import type { QueryFilters } from '@/lib/types';
+
import ReportFindManyArgs = Prisma.ReportFindManyArgs;
-async function findReport(criteria: Prisma.ReportFindUniqueArgs): Promise {
+async function findReport(criteria: Prisma.ReportFindUniqueArgs) {
return prisma.client.report.findUnique(criteria);
}
-export async function getReport(reportId: string): Promise {
+export async function getReport(reportId: string) {
return findReport({
where: {
id: reportId,
@@ -15,11 +16,8 @@ export async function getReport(reportId: string): Promise {
});
}
-export async function getReports(
- criteria: ReportFindManyArgs,
- pageParams: PageParams = {},
-): Promise