mirror of
https://github.com/umami-software/umami.git
synced 2025-12-08 05:12:36 +01:00
Merge branch 'analytics' of https://github.com/umami-software/umami into analytics
This commit is contained in:
commit
92c2d8b45d
111 changed files with 3184 additions and 2762 deletions
19
.github/workflows/cd-manual.yml
vendored
19
.github/workflows/cd-manual.yml
vendored
|
|
@ -20,11 +20,26 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Extract version parts from input
|
||||
id: extract_version
|
||||
run: |
|
||||
echo "version=$(echo ${{ github.event.inputs.version }})" >> $GITHUB_ENV
|
||||
echo "major=$(echo ${{ github.event.inputs.version }} | cut -d. -f1)" >> $GITHUB_ENV
|
||||
echo "minor=$(echo ${{ github.event.inputs.version }} | cut -d. -f2)" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate tags
|
||||
id: generate_tags
|
||||
run: |
|
||||
echo "tag_major=$(echo ${{ matrix.db-type }}-${{ env.major }})" >> $GITHUB_ENV
|
||||
echo "tag_minor=$(echo ${{ matrix.db-type }}-${{ env.major }}.${{ env.minor }})" >> $GITHUB_ENV
|
||||
echo "tag_patch=$(echo ${{ matrix.db-type }}-${{ env.version }})" >> $GITHUB_ENV
|
||||
echo "tag_latest=$(echo ${{ matrix.db-type }}-latest)" >> $GITHUB_ENV
|
||||
|
||||
- uses: mr-smithers-excellent/docker-build-push@v6
|
||||
name: Build & push Docker image to ghcr.io for ${{ matrix.db-type }}
|
||||
with:
|
||||
image: umami
|
||||
tags: ${{ matrix.db-type }}-${{ inputs.version }}, ${{ matrix.db-type }}-latest
|
||||
tags: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }}
|
||||
buildArgs: DATABASE_TYPE=${{ matrix.db-type }}
|
||||
registry: ghcr.io
|
||||
multiPlatform: true
|
||||
|
|
@ -36,7 +51,7 @@ jobs:
|
|||
name: Build & push Docker image to docker.io for ${{ matrix.db-type }}
|
||||
with:
|
||||
image: umamisoftware/umami
|
||||
tags: ${{ matrix.db-type }}-${{ inputs.version }}, ${{ matrix.db-type }}-latest
|
||||
tags: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }}
|
||||
buildArgs: DATABASE_TYPE=${{ matrix.db-type }}
|
||||
registry: docker.io
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
|
|
|
|||
14
.github/workflows/cd.yml
vendored
14
.github/workflows/cd.yml
vendored
|
|
@ -17,14 +17,21 @@ jobs:
|
|||
|
||||
- name: Set env
|
||||
run: |
|
||||
echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||
echo "NOW=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate tags
|
||||
id: generate_tags
|
||||
run: |
|
||||
echo "tag_patch=$(echo ${{ matrix.db-type }})-${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||
echo "tag_minor=$(echo ${{ matrix.db-type }})-$(echo ${GITHUB_REF#refs/tags/} | cut -d. -f1,2)" >> $GITHUB_ENV
|
||||
echo "tag_major=$(echo ${{ matrix.db-type }})-$(echo ${GITHUB_REF#refs/tags/} | cut -d. -f1)" >> $GITHUB_ENV
|
||||
echo "tag_latest=$(echo ${{ matrix.db-type }})-latest" >> $GITHUB_ENV
|
||||
|
||||
- uses: mr-smithers-excellent/docker-build-push@v6
|
||||
name: Build & push Docker image to ghcr.io for ${{ matrix.db-type }}
|
||||
with:
|
||||
image: umami
|
||||
tags: ${{ matrix.db-type }}-${{ env.RELEASE_VERSION }}, ${{ matrix.db-type }}-latest
|
||||
tags: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }}
|
||||
buildArgs: DATABASE_TYPE=${{ matrix.db-type }}
|
||||
registry: ghcr.io
|
||||
multiPlatform: true
|
||||
|
|
@ -32,12 +39,11 @@ jobs:
|
|||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
- uses: mr-smithers-excellent/docker-build-push@v6
|
||||
name: Build & push Docker image to docker.io for ${{ matrix.db-type }}
|
||||
with:
|
||||
image: umamisoftware/umami
|
||||
tags: ${{ matrix.db-type }}-${{ env.RELEASE_VERSION }}, ${{ matrix.db-type }}-latest
|
||||
tags: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }}
|
||||
buildArgs: DATABASE_TYPE=${{ matrix.db-type }}
|
||||
registry: docker.io
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
|
|
|
|||
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
|
@ -16,9 +16,9 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- node-version: 18.17
|
||||
- node-version: 18.18
|
||||
db-type: postgresql
|
||||
- node-version: 18.17
|
||||
- node-version: 18.18
|
||||
db-type: mysql
|
||||
|
||||
steps:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ RUN addgroup --system --gid 1001 nodejs
|
|||
RUN adduser --system --uid 1001 nextjs
|
||||
|
||||
RUN set -x \
|
||||
&& apk add --no-cache curl \
|
||||
&& apk add --no-cache curl openssl \
|
||||
&& yarn add npm-run-all dotenv semver prisma@5.17.0
|
||||
|
||||
# You only need to copy next.config.js if you are NOT using the default configuration
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<p align="center">
|
||||
<img src="https://umami.is/images/umami-logo.png" alt="Umami Logo" width="100">
|
||||
<img src="https://content.umami.is/website/images/umami-logo.png" alt="Umami Logo" width="100">
|
||||
</p>
|
||||
|
||||
<h1 align="center">Umami</h1>
|
||||
|
|
@ -35,8 +35,8 @@ A detailed getting started guide can be found at [umami.is/docs](https://umami.i
|
|||
|
||||
### Requirements
|
||||
|
||||
- A server with Node.js version 16.13 or newer
|
||||
- A database. Umami supports [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 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.
|
||||
|
||||
### Install Yarn
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ CREATE TABLE `user` (
|
|||
UNIQUE INDEX `user_user_id_key`(`user_id`),
|
||||
UNIQUE INDEX `user_username_key`(`username`),
|
||||
PRIMARY KEY (`user_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `session` (
|
||||
|
|
@ -33,7 +33,7 @@ CREATE TABLE `session` (
|
|||
INDEX `session_created_at_idx`(`created_at`),
|
||||
INDEX `session_website_id_idx`(`website_id`),
|
||||
PRIMARY KEY (`session_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `website` (
|
||||
|
|
@ -53,7 +53,7 @@ CREATE TABLE `website` (
|
|||
INDEX `website_created_at_idx`(`created_at`),
|
||||
INDEX `website_share_id_idx`(`share_id`),
|
||||
PRIMARY KEY (`website_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `website_event` (
|
||||
|
|
@ -76,7 +76,7 @@ CREATE TABLE `website_event` (
|
|||
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`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `event_data` (
|
||||
|
|
@ -95,7 +95,7 @@ CREATE TABLE `event_data` (
|
|||
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`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `team` (
|
||||
|
|
@ -109,7 +109,7 @@ CREATE TABLE `team` (
|
|||
UNIQUE INDEX `team_access_code_key`(`access_code`),
|
||||
INDEX `team_access_code_idx`(`access_code`),
|
||||
PRIMARY KEY (`team_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `team_user` (
|
||||
|
|
@ -124,7 +124,7 @@ CREATE TABLE `team_user` (
|
|||
INDEX `team_user_team_id_idx`(`team_id`),
|
||||
INDEX `team_user_user_id_idx`(`user_id`),
|
||||
PRIMARY KEY (`team_user_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `team_website` (
|
||||
|
|
@ -137,7 +137,7 @@ CREATE TABLE `team_website` (
|
|||
INDEX `team_website_team_id_idx`(`team_id`),
|
||||
INDEX `team_website_website_id_idx`(`website_id`),
|
||||
PRIMARY KEY (`team_website_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) 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');
|
||||
|
|
@ -21,7 +21,7 @@ CREATE TABLE `session_data` (
|
|||
INDEX `session_data_website_id_idx`(`website_id`),
|
||||
INDEX `session_data_session_id_idx`(`session_id`),
|
||||
PRIMARY KEY (`session_data_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `report` (
|
||||
|
|
@ -41,7 +41,7 @@ CREATE TABLE `report` (
|
|||
INDEX `report_type_idx`(`type`),
|
||||
INDEX `report_name_idx`(`name`),
|
||||
PRIMARY KEY (`report_id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- EventData migration
|
||||
UPDATE event_data
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
|
||||
}
|
||||
|
||||
datasource db {
|
||||
|
|
@ -112,7 +113,6 @@ model WebsiteEvent {
|
|||
@@index([visitId])
|
||||
@@index([websiteId])
|
||||
@@index([websiteId, createdAt])
|
||||
|
||||
@@index([websiteId, createdAt, urlPath])
|
||||
@@index([websiteId, createdAt, urlQuery])
|
||||
@@index([websiteId, createdAt, referrerDomain])
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ services:
|
|||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
init: true
|
||||
restart: always
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ require('dotenv').config();
|
|||
const path = require('path');
|
||||
const pkg = require('./package.json');
|
||||
|
||||
const TRACKER_SCRIPT = '/script.js';
|
||||
|
||||
const basePath = process.env.BASE_PATH;
|
||||
const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT;
|
||||
const cloudMode = process.env.CLOUD_MODE;
|
||||
|
|
@ -14,6 +16,7 @@ const forceSSL = process.env.FORCE_SSL;
|
|||
const frameAncestors = process.env.ALLOWED_FRAME_URLS;
|
||||
const privateMode = process.env.PRIVATE_MODE;
|
||||
const trackerScriptName = process.env.TRACKER_SCRIPT_NAME;
|
||||
const trackerScriptURL = process.env.TRACKER_SCRIPT_URL;
|
||||
|
||||
const contentSecurityPolicy = [
|
||||
`default-src 'self'`,
|
||||
|
|
@ -24,7 +27,7 @@ const contentSecurityPolicy = [
|
|||
`frame-ancestors 'self' ${frameAncestors}`,
|
||||
];
|
||||
|
||||
const headers = [
|
||||
const defaultHeaders = [
|
||||
{
|
||||
key: 'X-DNS-Prefetch-Control',
|
||||
value: 'on',
|
||||
|
|
@ -39,14 +42,43 @@ const headers = [
|
|||
];
|
||||
|
||||
if (forceSSL) {
|
||||
headers.push({
|
||||
defaultHeaders.push({
|
||||
key: 'Strict-Transport-Security',
|
||||
value: 'max-age=63072000; includeSubDomains; preload',
|
||||
});
|
||||
}
|
||||
|
||||
const trackerHeaders = [
|
||||
{
|
||||
key: 'Access-Control-Allow-Origin',
|
||||
value: '*',
|
||||
},
|
||||
{
|
||||
key: 'Cache-Control',
|
||||
value: 'public, max-age=86400, must-revalidate',
|
||||
},
|
||||
];
|
||||
|
||||
const headers = [
|
||||
{
|
||||
source: '/:path*',
|
||||
headers: defaultHeaders,
|
||||
},
|
||||
{
|
||||
source: TRACKER_SCRIPT,
|
||||
headers: trackerHeaders,
|
||||
},
|
||||
];
|
||||
|
||||
const rewrites = [];
|
||||
|
||||
if (trackerScriptURL) {
|
||||
rewrites.push({
|
||||
source: TRACKER_SCRIPT,
|
||||
destination: trackerScriptURL,
|
||||
});
|
||||
}
|
||||
|
||||
if (collectApiEndpoint) {
|
||||
rewrites.push({
|
||||
source: collectApiEndpoint,
|
||||
|
|
@ -54,19 +86,6 @@ if (collectApiEndpoint) {
|
|||
});
|
||||
}
|
||||
|
||||
if (trackerScriptName) {
|
||||
const names = trackerScriptName?.split(',').map(name => name.trim());
|
||||
|
||||
if (names) {
|
||||
names.forEach(name => {
|
||||
rewrites.push({
|
||||
source: `/${name.replace(/^\/+/, '')}`,
|
||||
destination: '/tracker.js',
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const redirects = [
|
||||
{
|
||||
source: '/settings',
|
||||
|
|
@ -85,6 +104,27 @@ const redirects = [
|
|||
},
|
||||
];
|
||||
|
||||
// Adding rewrites + headers for all alternative tracker script names.
|
||||
if (trackerScriptName) {
|
||||
const names = trackerScriptName?.split(',').map(name => name.trim());
|
||||
|
||||
if (names) {
|
||||
names.forEach(name => {
|
||||
const normalizedSource = `/${name.replace(/^\/+/, '')}`;
|
||||
|
||||
rewrites.push({
|
||||
source: normalizedSource,
|
||||
destination: TRACKER_SCRIPT,
|
||||
});
|
||||
|
||||
headers.push({
|
||||
source: normalizedSource,
|
||||
headers: trackerHeaders,
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (cloudMode && cloudUrl) {
|
||||
redirects.push({
|
||||
source: '/settings/:path*',
|
||||
|
|
@ -153,20 +193,11 @@ const config = {
|
|||
return config;
|
||||
},
|
||||
async headers() {
|
||||
return [
|
||||
{
|
||||
source: '/:path*',
|
||||
headers,
|
||||
},
|
||||
];
|
||||
return headers;
|
||||
},
|
||||
async rewrites() {
|
||||
return [
|
||||
...rewrites,
|
||||
{
|
||||
source: '/script.js',
|
||||
destination: 'https://tracker-script.umami.dev/',
|
||||
},
|
||||
{
|
||||
source: '/telemetry.js',
|
||||
destination: '/api/scripts/telemetry',
|
||||
|
|
|
|||
22
package.json
22
package.json
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "umami",
|
||||
"version": "2.13.2",
|
||||
"version": "2.15.0",
|
||||
"description": "A simple, fast, privacy-focused alternative to Google Analytics.",
|
||||
"author": "Umami Software, Inc. <hello@umami.is>",
|
||||
"license": "MIT",
|
||||
|
|
@ -63,18 +63,21 @@
|
|||
"cacheDirectories": [
|
||||
".next/cache"
|
||||
],
|
||||
"resolutions": {
|
||||
"jackspeak": "2.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@clickhouse/client": "^1.4.1",
|
||||
"@date-fns/utc": "^1.2.0",
|
||||
"@dicebear/collection": "^9.2.1",
|
||||
"@dicebear/core": "^9.2.1",
|
||||
"@fontsource/inter": "^4.5.15",
|
||||
"@prisma/client": "5.17",
|
||||
"@prisma/client": "5.22.0",
|
||||
"@prisma/extension-read-replicas": "^0.3.0",
|
||||
"@react-spring/web": "^9.7.3",
|
||||
"@tanstack/react-query": "^5.28.6",
|
||||
"@umami/prisma-client": "^0.14.0",
|
||||
"@umami/redis-client": "^0.21.0",
|
||||
"@umami/redis-client": "^0.24.0",
|
||||
"chalk": "^4.1.1",
|
||||
"chart.js": "^4.4.2",
|
||||
"chartjs-adapter-date-fns": "^3.0.0",
|
||||
|
|
@ -99,16 +102,15 @@
|
|||
"kafkajs": "^2.1.0",
|
||||
"maxmind": "^4.3.6",
|
||||
"md5": "^2.3.0",
|
||||
"moment-timezone": "^0.5.35",
|
||||
"next": "14.2.10",
|
||||
"next": "15.0.4",
|
||||
"next-basics": "^0.39.0",
|
||||
"node-fetch": "^3.2.8",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prisma": "5.17",
|
||||
"react": "^18.2.0",
|
||||
"prisma": "5.22.0",
|
||||
"react": "^19.0.0",
|
||||
"react-basics": "^0.125.0",
|
||||
"react-beautiful-dnd": "^13.1.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react-error-boundary": "^4.0.4",
|
||||
"react-intl": "^6.5.5",
|
||||
"react-simple-maps": "^2.3.0",
|
||||
|
|
@ -123,7 +125,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"@formatjs/cli": "^4.2.29",
|
||||
"@netlify/plugin-nextjs": "^5.1.0",
|
||||
"@netlify/plugin-nextjs": "^5.8.1",
|
||||
"@rollup/plugin-alias": "^5.0.0",
|
||||
"@rollup/plugin-commonjs": "^25.0.4",
|
||||
"@rollup/plugin-json": "^6.0.0",
|
||||
|
|
@ -132,7 +134,7 @@
|
|||
"@svgr/rollup": "^8.1.0",
|
||||
"@svgr/webpack": "^8.1.0",
|
||||
"@types/cypress": "^1.1.3",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/node": "^20.9.0",
|
||||
"@types/react": "^18.2.41",
|
||||
"@types/react-dom": "^18.2.17",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"label.access-code": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Access code"
|
||||
"value": "Přístupový kód"
|
||||
}
|
||||
],
|
||||
"label.actions": [
|
||||
|
|
@ -14,31 +14,31 @@
|
|||
"label.activity": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Activity log"
|
||||
"value": "Log aktivity"
|
||||
}
|
||||
],
|
||||
"label.add": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add"
|
||||
"value": "Přidat"
|
||||
}
|
||||
],
|
||||
"label.add-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add description"
|
||||
"value": "Přidat popis"
|
||||
}
|
||||
],
|
||||
"label.add-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add member"
|
||||
"value": "Přidat člena"
|
||||
}
|
||||
],
|
||||
"label.add-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add step"
|
||||
"value": "Přidat krok"
|
||||
}
|
||||
],
|
||||
"label.add-website": [
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
"label.after": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "After"
|
||||
"value": "Po"
|
||||
}
|
||||
],
|
||||
"label.all": [
|
||||
|
|
@ -68,7 +68,7 @@
|
|||
"label.all-time": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "All time"
|
||||
"value": "Celá doba"
|
||||
}
|
||||
],
|
||||
"label.analytics": [
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
"label.average": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Average"
|
||||
"value": "Průměr"
|
||||
}
|
||||
],
|
||||
"label.back": [
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
"label.before": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Before"
|
||||
"value": "Před"
|
||||
}
|
||||
],
|
||||
"label.bounce-rate": [
|
||||
|
|
@ -110,13 +110,13 @@
|
|||
"label.browser": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Browser"
|
||||
"value": "Prohlížeč"
|
||||
}
|
||||
],
|
||||
"label.browsers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Prohlížeč"
|
||||
"value": "Prohlížeče"
|
||||
}
|
||||
],
|
||||
"label.cancel": [
|
||||
|
|
@ -134,31 +134,31 @@
|
|||
"label.cities": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Cities"
|
||||
"value": "Města"
|
||||
}
|
||||
],
|
||||
"label.city": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "City"
|
||||
"value": "Město"
|
||||
}
|
||||
],
|
||||
"label.clear-all": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Clear all"
|
||||
"value": "Vyčistit vše"
|
||||
}
|
||||
],
|
||||
"label.compare": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Compare"
|
||||
"value": "Porovnat"
|
||||
}
|
||||
],
|
||||
"label.confirm": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Confirm"
|
||||
"value": "Potvrdit"
|
||||
}
|
||||
],
|
||||
"label.confirm-password": [
|
||||
|
|
@ -170,61 +170,61 @@
|
|||
"label.contains": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Contains"
|
||||
"value": "Obsahuje"
|
||||
}
|
||||
],
|
||||
"label.continue": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Continue"
|
||||
"value": "Pokračovat"
|
||||
}
|
||||
],
|
||||
"label.count": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Count"
|
||||
"value": "Počet"
|
||||
}
|
||||
],
|
||||
"label.countries": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Země"
|
||||
"value": "Státy"
|
||||
}
|
||||
],
|
||||
"label.country": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Country"
|
||||
"value": "Stát"
|
||||
}
|
||||
],
|
||||
"label.create": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Create"
|
||||
"value": "Vytvořit"
|
||||
}
|
||||
],
|
||||
"label.create-report": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Create report"
|
||||
"value": "Vytvořit hlášení"
|
||||
}
|
||||
],
|
||||
"label.create-team": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Create team"
|
||||
"value": "Vytvořit tým"
|
||||
}
|
||||
],
|
||||
"label.create-user": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Create user"
|
||||
"value": "Vytvořit uživatele"
|
||||
}
|
||||
],
|
||||
"label.created": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Created"
|
||||
"value": "Vytvořeno"
|
||||
}
|
||||
],
|
||||
"label.created-by": [
|
||||
|
|
@ -236,7 +236,7 @@
|
|||
"label.current": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Current"
|
||||
"value": "Aktuální"
|
||||
}
|
||||
],
|
||||
"label.current-password": [
|
||||
|
|
@ -266,7 +266,7 @@
|
|||
"label.date": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Date"
|
||||
"value": "Datum"
|
||||
}
|
||||
],
|
||||
"label.date-range": [
|
||||
|
|
@ -278,7 +278,7 @@
|
|||
"label.day": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Day"
|
||||
"value": "Den"
|
||||
}
|
||||
],
|
||||
"label.default-date-range": [
|
||||
|
|
@ -296,19 +296,19 @@
|
|||
"label.delete-report": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Delete report"
|
||||
"value": "Smazat hlášení"
|
||||
}
|
||||
],
|
||||
"label.delete-team": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Delete team"
|
||||
"value": "Smazat tým"
|
||||
}
|
||||
],
|
||||
"label.delete-user": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Delete user"
|
||||
"value": "Smazat uživatele"
|
||||
}
|
||||
],
|
||||
"label.delete-website": [
|
||||
|
|
@ -320,7 +320,7 @@
|
|||
"label.description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Description"
|
||||
"value": "Popis"
|
||||
}
|
||||
],
|
||||
"label.desktop": [
|
||||
|
|
@ -332,13 +332,13 @@
|
|||
"label.details": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Details"
|
||||
"value": "Detaily"
|
||||
}
|
||||
],
|
||||
"label.device": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Device"
|
||||
"value": "Zařízení"
|
||||
}
|
||||
],
|
||||
"label.devices": [
|
||||
|
|
@ -356,7 +356,7 @@
|
|||
"label.does-not-contain": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Does not contain"
|
||||
"value": "Neobsahuje"
|
||||
}
|
||||
],
|
||||
"label.domain": [
|
||||
|
|
@ -380,13 +380,13 @@
|
|||
"label.edit-dashboard": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Edit dashboard"
|
||||
"value": "Upravit dashboard"
|
||||
}
|
||||
],
|
||||
"label.edit-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Edit member"
|
||||
"value": "Upravit člena"
|
||||
}
|
||||
],
|
||||
"label.enable-share-url": [
|
||||
|
|
@ -404,13 +404,13 @@
|
|||
"label.entry": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Entry URL"
|
||||
"value": "Vstupní URL"
|
||||
}
|
||||
],
|
||||
"label.event": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Event"
|
||||
"value": "Událost"
|
||||
}
|
||||
],
|
||||
"label.event-data": [
|
||||
|
|
@ -440,7 +440,7 @@
|
|||
"label.field": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Field"
|
||||
"value": "Pole"
|
||||
}
|
||||
],
|
||||
"label.fields": [
|
||||
|
|
@ -452,7 +452,7 @@
|
|||
"label.filter": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Filter"
|
||||
"value": "Filtr"
|
||||
}
|
||||
],
|
||||
"label.filter-combined": [
|
||||
|
|
@ -470,7 +470,7 @@
|
|||
"label.filters": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Filters"
|
||||
"value": "Filtry"
|
||||
}
|
||||
],
|
||||
"label.first-seen": [
|
||||
|
|
@ -494,13 +494,13 @@
|
|||
"label.goal": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goal"
|
||||
"value": "Cíl"
|
||||
}
|
||||
],
|
||||
"label.goals": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goals"
|
||||
"value": "Cíle"
|
||||
}
|
||||
],
|
||||
"label.goals-description": [
|
||||
|
|
@ -596,13 +596,13 @@
|
|||
"label.language": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Language"
|
||||
"value": "Jazyk"
|
||||
}
|
||||
],
|
||||
"label.languages": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Languages"
|
||||
"value": "Jazyky"
|
||||
}
|
||||
],
|
||||
"label.laptop": [
|
||||
|
|
@ -642,7 +642,7 @@
|
|||
"label.last-months": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last "
|
||||
"value": "Posledních "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -650,7 +650,7 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " months"
|
||||
"value": " měsíců"
|
||||
}
|
||||
],
|
||||
"label.last-seen": [
|
||||
|
|
@ -662,13 +662,13 @@
|
|||
"label.leave": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Leave"
|
||||
"value": "Opustit"
|
||||
}
|
||||
],
|
||||
"label.leave-team": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Leave team"
|
||||
"value": "Opustit tým"
|
||||
}
|
||||
],
|
||||
"label.less-than": [
|
||||
|
|
@ -698,13 +698,13 @@
|
|||
"label.manage": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Manage"
|
||||
"value": "Spravovat"
|
||||
}
|
||||
],
|
||||
"label.manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Manager"
|
||||
"value": "Správce"
|
||||
}
|
||||
],
|
||||
"label.max": [
|
||||
|
|
@ -716,13 +716,13 @@
|
|||
"label.member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Member"
|
||||
"value": "Člen"
|
||||
}
|
||||
],
|
||||
"label.members": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Members"
|
||||
"value": "Členové"
|
||||
}
|
||||
],
|
||||
"label.min": [
|
||||
|
|
@ -746,13 +746,13 @@
|
|||
"label.my-account": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "My account"
|
||||
"value": "Můj účet"
|
||||
}
|
||||
],
|
||||
"label.my-websites": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "My websites"
|
||||
"value": "Mé weby"
|
||||
}
|
||||
],
|
||||
"label.name": [
|
||||
|
|
@ -822,13 +822,13 @@
|
|||
"label.overview": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Overview"
|
||||
"value": "Přehled"
|
||||
}
|
||||
],
|
||||
"label.owner": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Owner"
|
||||
"value": "Vlastník"
|
||||
}
|
||||
],
|
||||
"label.page-of": [
|
||||
|
|
@ -858,7 +858,7 @@
|
|||
"label.pageTitle": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Page title"
|
||||
"value": "Název stránky"
|
||||
}
|
||||
],
|
||||
"label.pages": [
|
||||
|
|
@ -876,13 +876,13 @@
|
|||
"label.path": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Path"
|
||||
"value": "Cesta"
|
||||
}
|
||||
],
|
||||
"label.paths": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Paths"
|
||||
"value": "Cesty"
|
||||
}
|
||||
],
|
||||
"label.powered-by": [
|
||||
|
|
@ -1444,13 +1444,13 @@
|
|||
"label.visitors": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Návštěvy"
|
||||
"value": "Návštěvníci"
|
||||
}
|
||||
],
|
||||
"label.visits": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Visits"
|
||||
"value": "Návštěvy"
|
||||
}
|
||||
],
|
||||
"label.website": [
|
||||
|
|
@ -1474,13 +1474,13 @@
|
|||
"label.window": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Window"
|
||||
"value": "Okno"
|
||||
}
|
||||
],
|
||||
"label.yesterday": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Yesterday"
|
||||
"value": "Včera"
|
||||
}
|
||||
],
|
||||
"message.action-confirmation": [
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -410,13 +410,13 @@
|
|||
"label.event": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Ereigniss"
|
||||
"value": "Ereignis"
|
||||
}
|
||||
],
|
||||
"label.event-data": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Ereignissdaten"
|
||||
"value": "Ereignisdaten"
|
||||
}
|
||||
],
|
||||
"label.events": [
|
||||
|
|
@ -1798,7 +1798,7 @@
|
|||
"message.triggered-event": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Ausgelöstes Ereigniss"
|
||||
"value": "Ereignis ausgelöst"
|
||||
}
|
||||
],
|
||||
"message.user-deleted": [
|
||||
|
|
|
|||
|
|
@ -404,7 +404,7 @@
|
|||
"label.entry": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Entry URL"
|
||||
"value": "URL d'entrée"
|
||||
}
|
||||
],
|
||||
"label.event": [
|
||||
|
|
@ -476,7 +476,7 @@
|
|||
"label.first-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "First seen"
|
||||
"value": "Vu pour la première fois"
|
||||
}
|
||||
],
|
||||
"label.funnel": [
|
||||
|
|
@ -506,7 +506,7 @@
|
|||
"label.goals-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your goals for pageviews and events."
|
||||
"value": "Suivez vos objectifs en matière de pages vues et d'événements."
|
||||
}
|
||||
],
|
||||
"label.greater-than": [
|
||||
|
|
@ -590,7 +590,7 @@
|
|||
"label.journey-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Understand how users navigate through your website."
|
||||
"value": "Comprendre comment les utilisateurs naviguent sur votre site web."
|
||||
}
|
||||
],
|
||||
"label.language": [
|
||||
|
|
@ -886,19 +886,19 @@
|
|||
"label.previous": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous"
|
||||
"value": "Précédent"
|
||||
}
|
||||
],
|
||||
"label.previous-period": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous period"
|
||||
"value": "Période précédente"
|
||||
}
|
||||
],
|
||||
"label.previous-year": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous year"
|
||||
"value": "Année précédente"
|
||||
}
|
||||
],
|
||||
"label.profile": [
|
||||
|
|
@ -910,13 +910,13 @@
|
|||
"label.properties": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Properties"
|
||||
"value": "Propriétés"
|
||||
}
|
||||
],
|
||||
"label.property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Property"
|
||||
"value": "Propriété"
|
||||
}
|
||||
],
|
||||
"label.queries": [
|
||||
|
|
@ -1036,13 +1036,13 @@
|
|||
"label.revenue-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Look into your revenue across time."
|
||||
"value": "Examinez vos revenus au fil du temps."
|
||||
}
|
||||
],
|
||||
"label.revenue-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue Property"
|
||||
"value": "Propriétés des revenues"
|
||||
}
|
||||
],
|
||||
"label.role": [
|
||||
|
|
@ -1078,7 +1078,7 @@
|
|||
"label.select": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Select"
|
||||
"value": "Selectionner"
|
||||
}
|
||||
],
|
||||
"label.select-date": [
|
||||
|
|
@ -1132,7 +1132,7 @@
|
|||
"label.start-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Start Step"
|
||||
"value": "Etape de démarrage"
|
||||
}
|
||||
],
|
||||
"label.steps": [
|
||||
|
|
@ -1168,7 +1168,7 @@
|
|||
"label.team-manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team manager"
|
||||
"value": "Manager de l'équipe"
|
||||
}
|
||||
],
|
||||
"label.team-member": [
|
||||
|
|
@ -1192,7 +1192,7 @@
|
|||
"label.team-view-only": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team view only"
|
||||
"value": "Vue d'équipe uniquement"
|
||||
}
|
||||
],
|
||||
"label.team-websites": [
|
||||
|
|
@ -1318,7 +1318,7 @@
|
|||
"label.uniqueCustomers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Unique Customers"
|
||||
"value": "Clients uniques"
|
||||
}
|
||||
],
|
||||
"label.unknown": [
|
||||
|
|
@ -1360,7 +1360,7 @@
|
|||
"label.user-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "User Property"
|
||||
"value": "Propriétés d'utilisateurs"
|
||||
}
|
||||
],
|
||||
"label.username": [
|
||||
|
|
|
|||
|
|
@ -1450,7 +1450,7 @@
|
|||
"label.visits": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "訪問者数"
|
||||
"value": "訪問数"
|
||||
}
|
||||
],
|
||||
"label.website": [
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -38,13 +38,13 @@
|
|||
"label.add-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add step"
|
||||
"value": "Adaugă pas"
|
||||
}
|
||||
],
|
||||
"label.add-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Adăugare site web"
|
||||
"value": "Adaugă site web"
|
||||
}
|
||||
],
|
||||
"label.admin": [
|
||||
|
|
@ -152,7 +152,7 @@
|
|||
"label.compare": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Compare"
|
||||
"value": "Compară"
|
||||
}
|
||||
],
|
||||
"label.confirm": [
|
||||
|
|
@ -182,7 +182,7 @@
|
|||
"label.count": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Count"
|
||||
"value": "Număr"
|
||||
}
|
||||
],
|
||||
"label.countries": [
|
||||
|
|
@ -230,13 +230,13 @@
|
|||
"label.created-by": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Created By"
|
||||
"value": "Creat de"
|
||||
}
|
||||
],
|
||||
"label.current": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Current"
|
||||
"value": "Curent"
|
||||
}
|
||||
],
|
||||
"label.current-password": [
|
||||
|
|
@ -266,13 +266,13 @@
|
|||
"label.date": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Data"
|
||||
"value": "Dată"
|
||||
}
|
||||
],
|
||||
"label.date-range": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Interval de date"
|
||||
"value": "Interval"
|
||||
}
|
||||
],
|
||||
"label.day": [
|
||||
|
|
@ -284,7 +284,7 @@
|
|||
"label.default-date-range": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Interval de date implicit"
|
||||
"value": "Interval implicit"
|
||||
}
|
||||
],
|
||||
"label.delete": [
|
||||
|
|
@ -314,7 +314,7 @@
|
|||
"label.delete-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Ștergere site web"
|
||||
"value": "Șterge site web"
|
||||
}
|
||||
],
|
||||
"label.description": [
|
||||
|
|
@ -398,13 +398,13 @@
|
|||
"label.end-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "End Step"
|
||||
"value": "Pas final"
|
||||
}
|
||||
],
|
||||
"label.entry": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Entry URL"
|
||||
"value": "URL de intrare"
|
||||
}
|
||||
],
|
||||
"label.event": [
|
||||
|
|
@ -428,7 +428,7 @@
|
|||
"label.exit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Exit URL"
|
||||
"value": "URL de ieșire"
|
||||
}
|
||||
],
|
||||
"label.false": [
|
||||
|
|
@ -476,7 +476,7 @@
|
|||
"label.first-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "First seen"
|
||||
"value": "Văzut pentru prima dată"
|
||||
}
|
||||
],
|
||||
"label.funnel": [
|
||||
|
|
@ -494,19 +494,19 @@
|
|||
"label.goal": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goal"
|
||||
"value": "Obiectiv"
|
||||
}
|
||||
],
|
||||
"label.goals": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goals"
|
||||
"value": "Obiective"
|
||||
}
|
||||
],
|
||||
"label.goals-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your goals for pageviews and events."
|
||||
"value": "Urmărește obiectivele de vizualizări și evenimente."
|
||||
}
|
||||
],
|
||||
"label.greater-than": [
|
||||
|
|
@ -584,13 +584,13 @@
|
|||
"label.journey": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Journey"
|
||||
"value": "Traseu"
|
||||
}
|
||||
],
|
||||
"label.journey-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Understand how users navigate through your website."
|
||||
"value": "Înțelege cum navighează vizitatorii prin website."
|
||||
}
|
||||
],
|
||||
"label.language": [
|
||||
|
|
@ -642,7 +642,7 @@
|
|||
"label.last-months": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last "
|
||||
"value": "Ultimele "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -650,13 +650,13 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " months"
|
||||
"value": " luni"
|
||||
}
|
||||
],
|
||||
"label.last-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last seen"
|
||||
"value": "Văzut ultima dată"
|
||||
}
|
||||
],
|
||||
"label.leave": [
|
||||
|
|
@ -876,13 +876,13 @@
|
|||
"label.path": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Path"
|
||||
"value": "Rută"
|
||||
}
|
||||
],
|
||||
"label.paths": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Paths"
|
||||
"value": "Rute"
|
||||
}
|
||||
],
|
||||
"label.powered-by": [
|
||||
|
|
@ -898,19 +898,19 @@
|
|||
"label.previous": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous"
|
||||
"value": "Anterior"
|
||||
}
|
||||
],
|
||||
"label.previous-period": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous period"
|
||||
"value": "Perioda anterioară"
|
||||
}
|
||||
],
|
||||
"label.previous-year": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous year"
|
||||
"value": "Anul anterior"
|
||||
}
|
||||
],
|
||||
"label.profile": [
|
||||
|
|
@ -922,13 +922,13 @@
|
|||
"label.properties": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Properties"
|
||||
"value": "Proprietăți"
|
||||
}
|
||||
],
|
||||
"label.property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Property"
|
||||
"value": "Proprietate"
|
||||
}
|
||||
],
|
||||
"label.queries": [
|
||||
|
|
@ -1042,13 +1042,13 @@
|
|||
"label.revenue": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue"
|
||||
"value": "Venit"
|
||||
}
|
||||
],
|
||||
"label.revenue-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Look into your revenue across time."
|
||||
"value": "Urmărește venitul în timp."
|
||||
}
|
||||
],
|
||||
"label.revenue-property": [
|
||||
|
|
@ -1114,7 +1114,7 @@
|
|||
"label.session": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Session"
|
||||
"value": "Sesiune"
|
||||
}
|
||||
],
|
||||
"label.sessions": [
|
||||
|
|
@ -1144,13 +1144,13 @@
|
|||
"label.start-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Start Step"
|
||||
"value": "Pas de început"
|
||||
}
|
||||
],
|
||||
"label.steps": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Steps"
|
||||
"value": "Pași"
|
||||
}
|
||||
],
|
||||
"label.sum": [
|
||||
|
|
@ -1174,13 +1174,13 @@
|
|||
"label.team-id": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "ID Echipa"
|
||||
"value": "ID Echipă"
|
||||
}
|
||||
],
|
||||
"label.team-manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team manager"
|
||||
"value": "Manager echipă"
|
||||
}
|
||||
],
|
||||
"label.team-member": [
|
||||
|
|
@ -1288,7 +1288,7 @@
|
|||
"label.transactions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transactions"
|
||||
"value": "Tranzacții"
|
||||
}
|
||||
],
|
||||
"label.transfer": [
|
||||
|
|
@ -1330,7 +1330,7 @@
|
|||
"label.uniqueCustomers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Unique Customers"
|
||||
"value": "Clienți unici"
|
||||
}
|
||||
],
|
||||
"label.unknown": [
|
||||
|
|
@ -1372,7 +1372,7 @@
|
|||
"label.user-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "User Property"
|
||||
"value": "Proprietatea utilizatorului"
|
||||
}
|
||||
],
|
||||
"label.username": [
|
||||
|
|
@ -1396,7 +1396,7 @@
|
|||
"label.utm-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your campaigns through UTM parameters."
|
||||
"value": "Urmărește campaniile tale cu parametri UTM."
|
||||
}
|
||||
],
|
||||
"label.value": [
|
||||
|
|
@ -1432,7 +1432,7 @@
|
|||
"label.views-per-visit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Views per visit"
|
||||
"value": "Vizualizări per vizită"
|
||||
}
|
||||
],
|
||||
"label.visit-duration": [
|
||||
|
|
@ -1450,7 +1450,7 @@
|
|||
"label.visits": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Visits"
|
||||
"value": "Vizite"
|
||||
}
|
||||
],
|
||||
"label.website": [
|
||||
|
|
@ -1534,7 +1534,7 @@
|
|||
"message.collected-data": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Collected data"
|
||||
"value": "Date colectate"
|
||||
}
|
||||
],
|
||||
"message.confirm-delete": [
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -476,7 +476,7 @@
|
|||
"label.first-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "First seen"
|
||||
"value": "首次出现"
|
||||
}
|
||||
],
|
||||
"label.funnel": [
|
||||
|
|
@ -656,7 +656,7 @@
|
|||
"label.last-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last seen"
|
||||
"value": "最后出现"
|
||||
}
|
||||
],
|
||||
"label.leave": [
|
||||
|
|
@ -1050,19 +1050,19 @@
|
|||
"label.revenue": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue"
|
||||
"value": "收入"
|
||||
}
|
||||
],
|
||||
"label.revenue-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Look into your revenue across time."
|
||||
"value": "查看您的收入随时间的变化。"
|
||||
}
|
||||
],
|
||||
"label.revenue-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue Property"
|
||||
"value": "收入值"
|
||||
}
|
||||
],
|
||||
"label.role": [
|
||||
|
|
@ -1296,7 +1296,7 @@
|
|||
"label.transactions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transactions"
|
||||
"value": "交易"
|
||||
}
|
||||
],
|
||||
"label.transfer": [
|
||||
|
|
@ -1338,7 +1338,7 @@
|
|||
"label.uniqueCustomers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Unique Customers"
|
||||
"value": "独特客户"
|
||||
}
|
||||
],
|
||||
"label.unknown": [
|
||||
|
|
@ -1380,7 +1380,7 @@
|
|||
"label.user-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "User Property"
|
||||
"value": "用户属性"
|
||||
}
|
||||
],
|
||||
"label.username": [
|
||||
|
|
|
|||
|
|
@ -8,13 +8,13 @@
|
|||
"label.actions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "行動"
|
||||
"value": "行為"
|
||||
}
|
||||
],
|
||||
"label.activity": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "活動日誌"
|
||||
"value": "活動紀錄"
|
||||
}
|
||||
],
|
||||
"label.add": [
|
||||
|
|
@ -32,13 +32,13 @@
|
|||
"label.add-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add member"
|
||||
"value": "新增成員"
|
||||
}
|
||||
],
|
||||
"label.add-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add step"
|
||||
"value": "新增步驟"
|
||||
}
|
||||
],
|
||||
"label.add-website": [
|
||||
|
|
@ -104,7 +104,7 @@
|
|||
"label.breakdown": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "分解"
|
||||
"value": "細項分析"
|
||||
}
|
||||
],
|
||||
"label.browser": [
|
||||
|
|
@ -152,7 +152,7 @@
|
|||
"label.compare": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Compare"
|
||||
"value": "比較"
|
||||
}
|
||||
],
|
||||
"label.confirm": [
|
||||
|
|
@ -182,7 +182,7 @@
|
|||
"label.count": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Count"
|
||||
"value": "數量"
|
||||
}
|
||||
],
|
||||
"label.countries": [
|
||||
|
|
@ -206,7 +206,7 @@
|
|||
"label.create-report": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "建立報告"
|
||||
"value": "建立報表"
|
||||
}
|
||||
],
|
||||
"label.create-team": [
|
||||
|
|
@ -230,13 +230,13 @@
|
|||
"label.created-by": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Created By"
|
||||
"value": "建立者"
|
||||
}
|
||||
],
|
||||
"label.current": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Current"
|
||||
"value": "目前"
|
||||
}
|
||||
],
|
||||
"label.current-password": [
|
||||
|
|
@ -296,7 +296,7 @@
|
|||
"label.delete-report": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Delete report"
|
||||
"value": "刪除報表"
|
||||
}
|
||||
],
|
||||
"label.delete-team": [
|
||||
|
|
@ -368,7 +368,7 @@
|
|||
"label.dropoff": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "退出"
|
||||
"value": "離開"
|
||||
}
|
||||
],
|
||||
"label.edit": [
|
||||
|
|
@ -386,25 +386,25 @@
|
|||
"label.edit-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Edit member"
|
||||
"value": "編輯成員"
|
||||
}
|
||||
],
|
||||
"label.enable-share-url": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "啟用分享網址"
|
||||
"value": "啟用分享連結"
|
||||
}
|
||||
],
|
||||
"label.end-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "End Step"
|
||||
"value": "結束步驟"
|
||||
}
|
||||
],
|
||||
"label.entry": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Entry URL"
|
||||
"value": "進入網址"
|
||||
}
|
||||
],
|
||||
"label.event": [
|
||||
|
|
@ -428,7 +428,7 @@
|
|||
"label.exit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Exit URL"
|
||||
"value": "離開網址"
|
||||
}
|
||||
],
|
||||
"label.false": [
|
||||
|
|
@ -470,43 +470,43 @@
|
|||
"label.filters": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "篩選器"
|
||||
"value": "篩選條件"
|
||||
}
|
||||
],
|
||||
"label.first-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "First seen"
|
||||
"value": "首次造訪"
|
||||
}
|
||||
],
|
||||
"label.funnel": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "漏斗"
|
||||
"value": "漏斗分析"
|
||||
}
|
||||
],
|
||||
"label.funnel-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "瞭解使用者的轉換率和退出率"
|
||||
"value": "瞭解使用者的轉換率與流失率。"
|
||||
}
|
||||
],
|
||||
"label.goal": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goal"
|
||||
"value": "目標"
|
||||
}
|
||||
],
|
||||
"label.goals": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goals"
|
||||
"value": "目標"
|
||||
}
|
||||
],
|
||||
"label.goals-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your goals for pageviews and events."
|
||||
"value": "追蹤網頁瀏覽和事件的目標。"
|
||||
}
|
||||
],
|
||||
"label.greater-than": [
|
||||
|
|
@ -524,13 +524,13 @@
|
|||
"label.host": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Host"
|
||||
"value": "主機名稱"
|
||||
}
|
||||
],
|
||||
"label.hosts": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Hosts"
|
||||
"value": "主機名稱"
|
||||
}
|
||||
],
|
||||
"label.insights": [
|
||||
|
|
@ -542,7 +542,7 @@
|
|||
"label.insights-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "透過使用區段和篩選器來深入探索你的數據"
|
||||
"value": "使用區段和篩選器來深入分析您的資料。"
|
||||
}
|
||||
],
|
||||
"label.is": [
|
||||
|
|
@ -584,13 +584,13 @@
|
|||
"label.journey": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Journey"
|
||||
"value": "使用者旅程"
|
||||
}
|
||||
],
|
||||
"label.journey-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Understand how users navigate through your website."
|
||||
"value": "瞭解使用者如何瀏覽您的網站。"
|
||||
}
|
||||
],
|
||||
"label.language": [
|
||||
|
|
@ -642,7 +642,7 @@
|
|||
"label.last-months": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last "
|
||||
"value": "最近 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -650,13 +650,13 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " months"
|
||||
"value": " 個月"
|
||||
}
|
||||
],
|
||||
"label.last-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last seen"
|
||||
"value": "最後造訪"
|
||||
}
|
||||
],
|
||||
"label.leave": [
|
||||
|
|
@ -698,25 +698,25 @@
|
|||
"label.manage": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Manage"
|
||||
"value": "管理"
|
||||
}
|
||||
],
|
||||
"label.manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Manager"
|
||||
"value": "管理者"
|
||||
}
|
||||
],
|
||||
"label.max": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "最大"
|
||||
"value": "最大值"
|
||||
}
|
||||
],
|
||||
"label.member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Member"
|
||||
"value": "成員"
|
||||
}
|
||||
],
|
||||
"label.members": [
|
||||
|
|
@ -728,7 +728,7 @@
|
|||
"label.min": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "最小"
|
||||
"value": "最小值"
|
||||
}
|
||||
],
|
||||
"label.mobile": [
|
||||
|
|
@ -746,7 +746,7 @@
|
|||
"label.my-account": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "My account"
|
||||
"value": "我的帳號"
|
||||
}
|
||||
],
|
||||
"label.my-websites": [
|
||||
|
|
@ -780,31 +780,7 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"offset": 0,
|
||||
"options": {
|
||||
"one": {
|
||||
"value": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "record"
|
||||
}
|
||||
]
|
||||
},
|
||||
"other": {
|
||||
"value": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "records"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"pluralType": "cardinal",
|
||||
"type": 6,
|
||||
"value": "x"
|
||||
"value": " 筆紀錄"
|
||||
}
|
||||
],
|
||||
"label.ok": [
|
||||
|
|
@ -822,7 +798,7 @@
|
|||
"label.overview": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "概覽"
|
||||
"value": "總覽"
|
||||
}
|
||||
],
|
||||
"label.owner": [
|
||||
|
|
@ -834,7 +810,7 @@
|
|||
"label.page-of": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "頁面 "
|
||||
"value": "第 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -842,29 +818,33 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " / "
|
||||
"value": " 頁,共 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "total"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 頁"
|
||||
}
|
||||
],
|
||||
"label.page-views": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "頁面瀏覽"
|
||||
"value": "網頁瀏覽次數"
|
||||
}
|
||||
],
|
||||
"label.pageTitle": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "頁面標題"
|
||||
"value": "網頁標題"
|
||||
}
|
||||
],
|
||||
"label.pages": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "頁面"
|
||||
"value": "網頁"
|
||||
}
|
||||
],
|
||||
"label.password": [
|
||||
|
|
@ -876,13 +856,13 @@
|
|||
"label.path": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Path"
|
||||
"value": "路徑"
|
||||
}
|
||||
],
|
||||
"label.paths": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Paths"
|
||||
"value": "路徑"
|
||||
}
|
||||
],
|
||||
"label.powered-by": [
|
||||
|
|
@ -896,43 +876,43 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 提供"
|
||||
"value": " 提供技術支援"
|
||||
}
|
||||
],
|
||||
"label.previous": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous"
|
||||
"value": "上一個"
|
||||
}
|
||||
],
|
||||
"label.previous-period": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous period"
|
||||
"value": "上一期間"
|
||||
}
|
||||
],
|
||||
"label.previous-year": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous year"
|
||||
"value": "去年"
|
||||
}
|
||||
],
|
||||
"label.profile": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "個人資料"
|
||||
"value": "個人檔案"
|
||||
}
|
||||
],
|
||||
"label.properties": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Properties"
|
||||
"value": "屬性"
|
||||
}
|
||||
],
|
||||
"label.property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Property"
|
||||
"value": "屬性"
|
||||
}
|
||||
],
|
||||
"label.queries": [
|
||||
|
|
@ -986,13 +966,13 @@
|
|||
"label.region": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "區域"
|
||||
"value": "地區"
|
||||
}
|
||||
],
|
||||
"label.regions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "區域"
|
||||
"value": "地區"
|
||||
}
|
||||
],
|
||||
"label.remove": [
|
||||
|
|
@ -1004,13 +984,13 @@
|
|||
"label.remove-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Remove member"
|
||||
"value": "移除成員"
|
||||
}
|
||||
],
|
||||
"label.reports": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "報告"
|
||||
"value": "報表"
|
||||
}
|
||||
],
|
||||
"label.required": [
|
||||
|
|
@ -1028,13 +1008,13 @@
|
|||
"label.reset-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "重設網站"
|
||||
"value": "重設網站統計資料"
|
||||
}
|
||||
],
|
||||
"label.retention": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "保留"
|
||||
"value": "留存率"
|
||||
}
|
||||
],
|
||||
"label.retention-description": [
|
||||
|
|
@ -1046,19 +1026,19 @@
|
|||
"label.revenue": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue"
|
||||
"value": "營收"
|
||||
}
|
||||
],
|
||||
"label.revenue-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Look into your revenue across time."
|
||||
"value": "查看您的營收趨勢。"
|
||||
}
|
||||
],
|
||||
"label.revenue-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue Property"
|
||||
"value": "營收屬性"
|
||||
}
|
||||
],
|
||||
"label.role": [
|
||||
|
|
@ -1088,37 +1068,37 @@
|
|||
"label.search": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Search"
|
||||
"value": "搜尋"
|
||||
}
|
||||
],
|
||||
"label.select": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Select"
|
||||
"value": "選取"
|
||||
}
|
||||
],
|
||||
"label.select-date": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "選擇日期"
|
||||
"value": "選取日期"
|
||||
}
|
||||
],
|
||||
"label.select-role": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Select role"
|
||||
"value": "選取角色"
|
||||
}
|
||||
],
|
||||
"label.select-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "選擇網站"
|
||||
"value": "選取網站"
|
||||
}
|
||||
],
|
||||
"label.session": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Session"
|
||||
"value": "工作階段"
|
||||
}
|
||||
],
|
||||
"label.sessions": [
|
||||
|
|
@ -1136,7 +1116,7 @@
|
|||
"label.share-url": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "分享網址"
|
||||
"value": "分享連結"
|
||||
}
|
||||
],
|
||||
"label.single-day": [
|
||||
|
|
@ -1148,13 +1128,13 @@
|
|||
"label.start-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Start Step"
|
||||
"value": "起始步驟"
|
||||
}
|
||||
],
|
||||
"label.steps": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Steps"
|
||||
"value": "步驟"
|
||||
}
|
||||
],
|
||||
"label.sum": [
|
||||
|
|
@ -1184,7 +1164,7 @@
|
|||
"label.team-manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team manager"
|
||||
"value": "團隊管理者"
|
||||
}
|
||||
],
|
||||
"label.team-member": [
|
||||
|
|
@ -1208,7 +1188,7 @@
|
|||
"label.team-view-only": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team view only"
|
||||
"value": "團隊僅供檢視"
|
||||
}
|
||||
],
|
||||
"label.team-websites": [
|
||||
|
|
@ -1280,7 +1260,7 @@
|
|||
"label.total-records": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "總記錄"
|
||||
"value": "紀錄總數"
|
||||
}
|
||||
],
|
||||
"label.tracking-code": [
|
||||
|
|
@ -1292,19 +1272,19 @@
|
|||
"label.transactions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transactions"
|
||||
"value": "交易"
|
||||
}
|
||||
],
|
||||
"label.transfer": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transfer"
|
||||
"value": "轉移"
|
||||
}
|
||||
],
|
||||
"label.transfer-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transfer website"
|
||||
"value": "轉移網站"
|
||||
}
|
||||
],
|
||||
"label.true": [
|
||||
|
|
@ -1322,19 +1302,19 @@
|
|||
"label.unique": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "獨立"
|
||||
"value": "不重複"
|
||||
}
|
||||
],
|
||||
"label.unique-visitors": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "獨立訪客"
|
||||
"value": "不重複訪客"
|
||||
}
|
||||
],
|
||||
"label.uniqueCustomers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Unique Customers"
|
||||
"value": "不重複客戶"
|
||||
}
|
||||
],
|
||||
"label.unknown": [
|
||||
|
|
@ -1346,13 +1326,13 @@
|
|||
"label.untitled": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "無標題"
|
||||
"value": "未命名"
|
||||
}
|
||||
],
|
||||
"label.update": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Update"
|
||||
"value": "更新"
|
||||
}
|
||||
],
|
||||
"label.url": [
|
||||
|
|
@ -1376,7 +1356,7 @@
|
|||
"label.user-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "User Property"
|
||||
"value": "使用者屬性"
|
||||
}
|
||||
],
|
||||
"label.username": [
|
||||
|
|
@ -1400,7 +1380,7 @@
|
|||
"label.utm-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your campaigns through UTM parameters."
|
||||
"value": "透過 UTM 參數追蹤您的行銷活動。"
|
||||
}
|
||||
],
|
||||
"label.value": [
|
||||
|
|
@ -1430,19 +1410,19 @@
|
|||
"label.views": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "檢視"
|
||||
"value": "瀏覽次數"
|
||||
}
|
||||
],
|
||||
"label.views-per-visit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Views per visit"
|
||||
"value": "每次造訪的瀏覽次數"
|
||||
}
|
||||
],
|
||||
"label.visit-duration": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "平均造訪時間"
|
||||
"value": "造訪時間"
|
||||
}
|
||||
],
|
||||
"label.visitors": [
|
||||
|
|
@ -1454,7 +1434,7 @@
|
|||
"label.visits": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Visits"
|
||||
"value": "造訪次數"
|
||||
}
|
||||
],
|
||||
"label.website": [
|
||||
|
|
@ -1490,7 +1470,7 @@
|
|||
"message.action-confirmation": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Type "
|
||||
"value": "請在下方欄位輸入 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -1498,7 +1478,7 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " in the box below to confirm."
|
||||
"value": " 以確認。"
|
||||
}
|
||||
],
|
||||
"message.active-users": [
|
||||
|
|
@ -1512,13 +1492,13 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 個活躍的訪客"
|
||||
"value": " 位訪客"
|
||||
}
|
||||
],
|
||||
"message.collected-data": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Collected data"
|
||||
"value": "已蒐集的資料"
|
||||
}
|
||||
],
|
||||
"message.confirm-delete": [
|
||||
|
|
@ -1552,7 +1532,7 @@
|
|||
"message.confirm-remove": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Are you sure you want to remove "
|
||||
"value": "您確定要移除 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -1560,7 +1540,7 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": "?"
|
||||
"value": " 嗎?"
|
||||
}
|
||||
],
|
||||
"message.confirm-reset": [
|
||||
|
|
@ -1574,19 +1554,19 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 嗎?"
|
||||
"value": " 的統計資料嗎?"
|
||||
}
|
||||
],
|
||||
"message.delete-team-warning": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Deleting a team will also delete all team websites."
|
||||
"value": "刪除團隊的同時也會刪除所有團隊的網站。"
|
||||
}
|
||||
],
|
||||
"message.delete-website-warning": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "所有網站資料將被刪除。"
|
||||
"value": "所有網站資料都將被刪除。"
|
||||
}
|
||||
],
|
||||
"message.error": [
|
||||
|
|
@ -1596,17 +1576,21 @@
|
|||
}
|
||||
],
|
||||
"message.event-log": [
|
||||
{
|
||||
"type": 1,
|
||||
"value": "event"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 在 "
|
||||
"value": "在 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "url"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 上的 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "event"
|
||||
}
|
||||
],
|
||||
"message.go-to-settings": [
|
||||
|
|
@ -1618,19 +1602,19 @@
|
|||
"message.incorrect-username-password": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "使用者名稱和/或密碼不正確。"
|
||||
"value": "使用者名稱或密碼不正確。"
|
||||
}
|
||||
],
|
||||
"message.invalid-domain": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "無效的網域。請不要包含 http/https。"
|
||||
"value": "無效的網域。請勿包含 http/https。"
|
||||
}
|
||||
],
|
||||
"message.min-password-length": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "最少需要 "
|
||||
"value": "密碼長度至少需 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -1652,7 +1636,7 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " 的新版本已經可以使用!"
|
||||
"value": " 的新版本已推出!"
|
||||
}
|
||||
],
|
||||
"message.no-data-available": [
|
||||
|
|
@ -1694,7 +1678,7 @@
|
|||
"message.no-users": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "沒有使用者。"
|
||||
"value": "沒有任何使用者。"
|
||||
}
|
||||
],
|
||||
"message.no-websites-configured": [
|
||||
|
|
@ -1706,13 +1690,13 @@
|
|||
"message.page-not-found": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "找不到頁面"
|
||||
"value": "找不到網頁"
|
||||
}
|
||||
],
|
||||
"message.reset-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "要重設此網站,請在下方的方框中輸入 "
|
||||
"value": "要重設此網站的統計資料,請在下方欄位輸入 "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -1726,7 +1710,7 @@
|
|||
"message.reset-website-warning": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "此網站的所有統計將被刪除,但您的設定將保持不變。"
|
||||
"value": "此網站的所有統計資料都將被刪除,但您的設定將保持不變。"
|
||||
}
|
||||
],
|
||||
"message.saved": [
|
||||
|
|
@ -1738,13 +1722,13 @@
|
|||
"message.share-url": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "您的網站統計資料可以在以下網址公開檢視:"
|
||||
"value": "您的網站統計資料可在以下網址公開檢視:"
|
||||
}
|
||||
],
|
||||
"message.team-already-member": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "您已經是團隊的成員。"
|
||||
"value": "您已是該團隊的成員。"
|
||||
}
|
||||
],
|
||||
"message.team-not-found": [
|
||||
|
|
@ -1756,13 +1740,13 @@
|
|||
"message.team-websites-info": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "團隊的任何成員都可以檢視網站。"
|
||||
"value": "團隊中的所有成員都可以檢視網站。"
|
||||
}
|
||||
],
|
||||
"message.tracking-code": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "要追蹤此網站的統計,請將以下代碼放在您的 HTML 的 "
|
||||
"value": "要追蹤此網站的統計資料,請將以下程式碼放在您 HTML 的 "
|
||||
},
|
||||
{
|
||||
"children": [
|
||||
|
|
@ -1782,25 +1766,25 @@
|
|||
"message.transfer-team-website-to-user": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transfer this website to your account?"
|
||||
"value": "要將此網站轉移至您的帳號嗎?"
|
||||
}
|
||||
],
|
||||
"message.transfer-user-website-to-team": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Select the team to transfer this website to."
|
||||
"value": "請選擇要轉移此網站的團隊。"
|
||||
}
|
||||
],
|
||||
"message.transfer-website": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transfer website ownership to your account or another team."
|
||||
"value": "將網站所有權轉移至您的帳號或其他團隊。"
|
||||
}
|
||||
],
|
||||
"message.triggered-event": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Triggered event"
|
||||
"value": "已觸發的事件"
|
||||
}
|
||||
],
|
||||
"message.user-deleted": [
|
||||
|
|
@ -1812,7 +1796,7 @@
|
|||
"message.viewed-page": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Viewed page"
|
||||
"value": "已瀏覽的網頁"
|
||||
}
|
||||
],
|
||||
"message.visitor-log": [
|
||||
|
|
@ -1856,7 +1840,7 @@
|
|||
"message.visitors-dropped-off": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Visitors dropped off"
|
||||
"value": "訪客已離開"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import { terser } from 'rollup-plugin-terser';
|
|||
export default {
|
||||
input: 'src/tracker/index.js',
|
||||
output: {
|
||||
file: 'public/tracker.js',
|
||||
file: 'public/script.js',
|
||||
format: 'iife',
|
||||
},
|
||||
plugins: [
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ import TeamsButton from 'components/input/TeamsButton';
|
|||
import Icons from 'components/icons';
|
||||
import { useMessages, useNavigation, useTeamUrl } from 'components/hooks';
|
||||
import styles from './NavBar.module.css';
|
||||
import { useEffect } from 'react';
|
||||
import { getItem, setItem } from 'next-basics';
|
||||
|
||||
export function NavBar() {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
|
|
@ -74,10 +76,24 @@ export function NavBar() {
|
|||
|
||||
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 (
|
||||
<div className={styles.navbar}>
|
||||
<div className={styles.logo}>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,9 @@ async function getEnabled() {
|
|||
return !!process.env.ENABLE_TEST_CONSOLE;
|
||||
}
|
||||
|
||||
export default async function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
const enabled = await getEnabled();
|
||||
|
||||
if (!enabled) {
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.item {
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.item h1 {
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.item h2 {
|
||||
font-size: 14px;
|
||||
color: var(--base700);
|
||||
}
|
||||
|
||||
.text {
|
||||
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;
|
||||
}
|
||||
|
||||
.active .text {
|
||||
border-color: var(--base600);
|
||||
box-shadow: 4px 4px 4px var(--base100);
|
||||
.text {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.domain {
|
||||
font-size: 14px;
|
||||
color: var(--base700);
|
||||
}
|
||||
|
||||
.dragActive {
|
||||
|
|
@ -38,3 +38,20 @@
|
|||
.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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { useState, useMemo } from 'react';
|
||||
import { useState, useMemo, useEffect } from 'react';
|
||||
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
|
||||
import classNames from 'classnames';
|
||||
import { Button, Loading } from 'react-basics';
|
||||
import { Button, Loading, Toggle, SearchField } from 'react-basics';
|
||||
import { firstBy } from 'thenby';
|
||||
import useDashboard, { saveDashboard } from 'store/dashboard';
|
||||
import { useMessages, useWebsites } from 'components/hooks';
|
||||
|
|
@ -11,20 +11,39 @@ const DRAG_ID = 'dashboard-website-ordering';
|
|||
|
||||
export function DashboardEdit({ teamId }: { teamId: string }) {
|
||||
const settings = useDashboard();
|
||||
const { websiteOrder } = settings;
|
||||
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 });
|
||||
|
||||
const websites = result?.data;
|
||||
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 }) => ({ ...website, order: order.indexOf(website.id) }))
|
||||
.map((website: { id: any; name: string; domain: string }) => ({
|
||||
...website,
|
||||
order: order.indexOf(website.id),
|
||||
}))
|
||||
.sort(firstBy('order'));
|
||||
}
|
||||
return [];
|
||||
|
|
@ -38,21 +57,33 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
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 });
|
||||
saveDashboard({ editing: false, websiteOrder, websiteActive, isEdited });
|
||||
}
|
||||
|
||||
function handleReset() {
|
||||
setOrder([]);
|
||||
setActive([]);
|
||||
setEdited(false);
|
||||
}
|
||||
|
||||
if (isLoading) {
|
||||
|
|
@ -61,6 +92,8 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
|
||||
return (
|
||||
<>
|
||||
<div className={styles.header}>
|
||||
<SearchField className={styles.search} value={search} onSearch={setSearch} />
|
||||
<div className={styles.buttons}>
|
||||
<Button onClick={handleSave} variant="primary" size="sm">
|
||||
{formatMessage(labels.save)}
|
||||
|
|
@ -72,6 +105,7 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
{formatMessage(labels.reset)}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.dragActive}>
|
||||
<DragDropContext onDragEnd={handleWebsiteDrag}>
|
||||
<Droppable droppableId={DRAG_ID}>
|
||||
|
|
@ -81,7 +115,15 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
ref={provided.innerRef}
|
||||
style={{ marginBottom: snapshot.isDraggingOver ? 260 : null }}
|
||||
>
|
||||
{ordered.map(({ id, name, domain }, index) => (
|
||||
{ordered.map(({ id, name, domain }, index) => {
|
||||
if (
|
||||
search &&
|
||||
!`${name.toLowerCase()}${domain.toLowerCase()}`.includes(search.toLowerCase())
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Draggable key={id} draggableId={`${DRAG_ID}-${id}`} index={index}>
|
||||
{(provided, snapshot) => (
|
||||
<div
|
||||
|
|
@ -93,13 +135,18 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
{...provided.dragHandleProps}
|
||||
>
|
||||
<div className={styles.text}>
|
||||
<h1>{name}</h1>
|
||||
<h2>{domain}</h2>
|
||||
<div className={styles.name}>{name}</div>
|
||||
<div className={styles.domain}>{domain}</div>
|
||||
</div>
|
||||
<Toggle
|
||||
checked={active.includes(id)}
|
||||
onChange={() => handleActiveWebsites(id)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</Draggable>
|
||||
))}
|
||||
);
|
||||
})}
|
||||
{provided.placeholder}
|
||||
</div>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ import LinkButton from 'components/common/LinkButton';
|
|||
export function DashboardPage() {
|
||||
const { formatMessage, labels, messages } = useMessages();
|
||||
const { teamId, renderTeamUrl } = useTeamUrl();
|
||||
const { showCharts, editing } = useDashboard();
|
||||
const { showCharts, editing, isEdited } = useDashboard();
|
||||
const { dir } = useLocale();
|
||||
const pageSize = 10;
|
||||
const pageSize = isEdited ? 200 : 10;
|
||||
|
||||
const { result, query, params, setParams } = useWebsites({ teamId }, { pageSize });
|
||||
const { page } = params;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
import { useState } from 'react';
|
||||
import { Dropdown, Item, Button, Flexbox } from 'react-basics';
|
||||
import moment from 'moment-timezone';
|
||||
import { useTimezone, useMessages } from 'components/hooks';
|
||||
import { getTimezone } from 'lib/date';
|
||||
import styles from './TimezoneSetting.module.css';
|
||||
|
||||
const timezones = moment.tz.names();
|
||||
const timezones = Intl.supportedValuesOf('timeZone');
|
||||
|
||||
export function TimezoneSetting() {
|
||||
const [search, setSearch] = useState('');
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import { Metadata } from 'next';
|
||||
import ReportPage from './ReportPage';
|
||||
|
||||
export default function ({ params: { reportId } }) {
|
||||
export default async function ({ params }: { params: { reportId: string } }) {
|
||||
const { reportId } = await params;
|
||||
|
||||
return <ReportPage reportId={reportId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import UserPage from './UserPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { userId } }) {
|
||||
export default async function ({ params }: { params: { userId: string } }) {
|
||||
const { userId } = await params;
|
||||
|
||||
return <UserPage userId={userId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import WebsiteSettingsPage from './WebsiteSettingsPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default async function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteSettingsPage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import { Metadata } from 'next';
|
||||
import WebsitesSettingsPage from './WebsitesSettingsPage';
|
||||
|
||||
export default function ({ params: { teamId } }: { params: { teamId: string } }) {
|
||||
export default async function ({ params }: { params: { teamId: string } }) {
|
||||
const { teamId } = await params;
|
||||
|
||||
return <WebsitesSettingsPage teamId={teamId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,15 @@ import TeamProvider from './TeamProvider';
|
|||
import { Metadata } from 'next';
|
||||
import TeamSettingsLayout from './settings/TeamSettingsLayout';
|
||||
|
||||
export default function ({ children, params: { teamId } }) {
|
||||
export default async function ({
|
||||
children,
|
||||
params,
|
||||
}: {
|
||||
children: any;
|
||||
params: { teamId: string };
|
||||
}) {
|
||||
const { teamId } = await params;
|
||||
|
||||
return (
|
||||
<TeamProvider teamId={teamId}>
|
||||
<TeamSettingsLayout>{children}</TeamSettingsLayout>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import TeamMembersPage from './TeamMembersPage';
|
||||
import { Metadata } from 'next';
|
||||
import TeamMembersPage from './TeamMembersPage';
|
||||
|
||||
export default async function ({ params }: { params: { teamId: string } }) {
|
||||
const { teamId } = await params;
|
||||
|
||||
export default function ({ params: { teamId } }) {
|
||||
return <TeamMembersPage teamId={teamId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import { Metadata } from 'next';
|
||||
import TeamPage from './TeamPage';
|
||||
|
||||
export default function ({ params: { teamId } }) {
|
||||
export default async function ({ params }: { params: { teamId: string } }) {
|
||||
const { teamId } = await params;
|
||||
|
||||
return <TeamPage teamId={teamId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import TeamWebsitesPage from './TeamWebsitesPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { teamId } }) {
|
||||
export default async function ({ params }: { params: { teamId: string } }) {
|
||||
const { teamId } = await params;
|
||||
|
||||
return <TeamWebsitesPage teamId={teamId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ export function WebsiteChart({
|
|||
compareMode?: boolean;
|
||||
}) {
|
||||
const { dateRange, dateCompare } = useDateRange(websiteId);
|
||||
const { startDate, endDate, unit } = dateRange;
|
||||
const { startDate, endDate, unit, value } = dateRange;
|
||||
const { data, isLoading } = useWebsitePageviews(websiteId, compareMode ? dateCompare : undefined);
|
||||
const { pageviews, sessions, compare } = (data || {}) as any;
|
||||
|
||||
|
|
@ -49,6 +49,7 @@ export function WebsiteChart({
|
|||
maxDate={endDate.toISOString()}
|
||||
unit={unit}
|
||||
isLoading={isLoading}
|
||||
isAllTime={value === 'all'}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,17 +18,16 @@ export default function WebsiteChartList({
|
|||
limit?: number;
|
||||
}) {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
const { websiteOrder } = useDashboard();
|
||||
const { websiteOrder, websiteActive } = useDashboard();
|
||||
const { renderTeamUrl } = useTeamUrl();
|
||||
const { dir } = useLocale();
|
||||
|
||||
const ordered = useMemo(
|
||||
() =>
|
||||
websites
|
||||
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],
|
||||
);
|
||||
.sort(firstBy('order'));
|
||||
}, [websites, websiteOrder, websiteActive]);
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -59,5 +59,6 @@
|
|||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding-inline-end: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import WebsiteComparePage from './WebsiteComparePage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteComparePage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import { Metadata } from 'next';
|
||||
import EventsPage from './EventsPage';
|
||||
|
||||
export default async function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <EventsPage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,15 @@
|
|||
import { Metadata } from 'next';
|
||||
import WebsiteProvider from './WebsiteProvider';
|
||||
|
||||
export default function ({ children, params: { websiteId } }) {
|
||||
export default async function ({
|
||||
children,
|
||||
params,
|
||||
}: {
|
||||
children: any;
|
||||
params: { websiteId: string };
|
||||
}) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteProvider websiteId={websiteId}>{children}</WebsiteProvider>;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import WebsiteDetailsPage from './WebsiteDetailsPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function WebsitePage({ params: { websiteId } }) {
|
||||
export default async function WebsitePage({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteDetailsPage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export function RealtimeCountries({ data }) {
|
|||
|
||||
const renderCountryName = useCallback(
|
||||
({ x: code }) => (
|
||||
<span className={classNames(locale, styles.row)}>
|
||||
<span className={classNames(styles.row)}>
|
||||
<TypeIcon type="country" value={code?.toLowerCase()} />
|
||||
{countryNames[code]}
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import WebsiteRealtimePage from './WebsiteRealtimePage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteRealtimePage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import WebsiteReportsPage from './WebsiteReportsPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <WebsiteReportsPage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
display: grid;
|
||||
grid-template-columns: max-content max-content 1fr;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
}
|
||||
|
|
@ -15,10 +16,6 @@
|
|||
width: 150px;
|
||||
}
|
||||
|
||||
.value {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ export function SessionActivity({
|
|||
</StatusLight>
|
||||
</div>
|
||||
<Icon>{eventName ? <Icons.Bolt /> : <Icons.Eye />}</Icon>
|
||||
<div className={styles.value}>{eventName || urlPath}</div>
|
||||
<div>{eventName || urlPath}</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,13 @@
|
|||
import SessionDetailsPage from './SessionDetailsPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function WebsitePage({ params: { websiteId, sessionId } }) {
|
||||
export default async function WebsitePage({
|
||||
params,
|
||||
}: {
|
||||
params: { websiteId: string; sessionId: string };
|
||||
}) {
|
||||
const { websiteId, sessionId } = await params;
|
||||
|
||||
return <SessionDetailsPage websiteId={websiteId} sessionId={sessionId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import SessionsPage from './SessionsPage';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export default function ({ params: { websiteId } }) {
|
||||
export default async function ({ params }: { params: { websiteId: string } }) {
|
||||
const { websiteId } = await params;
|
||||
|
||||
return <SessionsPage websiteId={websiteId} />;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
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 '@fontsource/inter/800.css';
|
||||
import 'react-basics/dist/styles.css';
|
||||
import 'styles/locale.css';
|
||||
import 'styles/index.css';
|
||||
import 'styles/variables.css';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
import SharePage from './SharePage';
|
||||
|
||||
export default function ({ params: { shareId } }) {
|
||||
export default async function ({ params }: { params: { shareId: string } }) {
|
||||
const { shareId } = await params;
|
||||
|
||||
return <SharePage shareId={shareId[0]} />;
|
||||
}
|
||||
|
|
|
|||
8
src/assets/pushpin.svg
Normal file
8
src/assets/pushpin.svg
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<svg
|
||||
viewBox="0 0 1024 1024"
|
||||
fill="currentColor"
|
||||
height="1em"
|
||||
width="1em"
|
||||
>
|
||||
<path d="M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3-15.4 12.3-16.6 35.4-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 00-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 571 B |
|
|
@ -14,6 +14,7 @@ export interface BarChartProps extends ChartProps {
|
|||
YAxisType?: string;
|
||||
minDate?: number | string;
|
||||
maxDate?: number | string;
|
||||
isAllTime?: boolean;
|
||||
}
|
||||
|
||||
export function BarChart(props: BarChartProps) {
|
||||
|
|
@ -29,6 +30,7 @@ export function BarChart(props: BarChartProps) {
|
|||
minDate,
|
||||
maxDate,
|
||||
currency,
|
||||
isAllTime,
|
||||
} = props;
|
||||
|
||||
const options: any = useMemo(() => {
|
||||
|
|
@ -37,7 +39,7 @@ export function BarChart(props: BarChartProps) {
|
|||
x: {
|
||||
type: XAxisType,
|
||||
stacked: true,
|
||||
min: minDate && new Date(minDate).getSeconds() === 0 ? minDate : '',
|
||||
min: isAllTime ? '' : minDate,
|
||||
max: maxDate,
|
||||
time: {
|
||||
unit,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
function getHostName(url: string) {
|
||||
const match = url.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:/\n?=]+)/im);
|
||||
const match = url.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?([^:/\n?=]+)/im);
|
||||
return match && match.length > 1 ? match[1] : null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,9 +12,12 @@ export function TypeIcon({
|
|||
return (
|
||||
<>
|
||||
<img
|
||||
src={`${process.env.basePath || ''}/images/${type}/${
|
||||
value?.replaceAll(' ', '-').toLowerCase() || 'unknown'
|
||||
}.png`}
|
||||
src={`${process.env.basePath || ''}/images/${type}/${value
|
||||
?.replaceAll(' ', '-')
|
||||
.toLowerCase()}.png`}
|
||||
onError={e => {
|
||||
e.currentTarget.src = `${process.env.basePath || ''}/images/${type}/unknown.png`;
|
||||
}}
|
||||
alt={value}
|
||||
width={type === 'country' ? undefined : 16}
|
||||
height={type === 'country' ? undefined : 16}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { UseQueryOptions } from '@tanstack/react-query';
|
||||
import { useApi } from '../useApi';
|
||||
import { useFilterParams } from '../useFilterParams';
|
||||
import { useSearchParams } from 'next/navigation';
|
||||
|
||||
export function useWebsiteMetrics(
|
||||
websiteId: string,
|
||||
|
|
@ -9,6 +10,7 @@ export function useWebsiteMetrics(
|
|||
) {
|
||||
const { get, useQuery } = useApi();
|
||||
const params = useFilterParams(websiteId);
|
||||
const searchParams = useSearchParams();
|
||||
|
||||
return useQuery({
|
||||
queryKey: [
|
||||
|
|
@ -20,12 +22,9 @@ export function useWebsiteMetrics(
|
|||
},
|
||||
],
|
||||
queryFn: async () => {
|
||||
const filters = { ...params };
|
||||
|
||||
filters[queryParams.type] = undefined;
|
||||
|
||||
const data = await get(`/websites/${websiteId}/metrics`, {
|
||||
...filters,
|
||||
...params,
|
||||
[searchParams.get('view')]: undefined,
|
||||
...queryParams,
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
import { useApi } from '../useApi';
|
||||
import { useCountryNames, useRegionNames } from 'components/hooks';
|
||||
import useLocale from '../useLocale';
|
||||
|
||||
export function useWebsiteValues({
|
||||
websiteId,
|
||||
|
|
@ -14,6 +16,36 @@ export function useWebsiteValues({
|
|||
search?: string;
|
||||
}) {
|
||||
const { get, useQuery } = useApi();
|
||||
const { locale } = useLocale();
|
||||
const { countryNames } = useCountryNames(locale);
|
||||
const { regionNames } = useRegionNames(locale);
|
||||
|
||||
const names = {
|
||||
country: countryNames,
|
||||
region: regionNames,
|
||||
};
|
||||
|
||||
const getSearch = (type: string, value: string) => {
|
||||
if (value) {
|
||||
const values = names[type];
|
||||
|
||||
if (values) {
|
||||
return (
|
||||
Object.keys(values)
|
||||
.reduce((arr: string[], key: string) => {
|
||||
if (values[key].toLowerCase().includes(value.toLowerCase())) {
|
||||
return arr.concat(key);
|
||||
}
|
||||
return arr;
|
||||
}, [])
|
||||
.slice(0, 5)
|
||||
.join(',') || value
|
||||
);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
return useQuery({
|
||||
queryKey: ['websites:values', { websiteId, type, startDate, endDate, search }],
|
||||
|
|
@ -22,7 +54,7 @@ export function useWebsiteValues({
|
|||
type,
|
||||
startAt: +startDate,
|
||||
endAt: +endDate,
|
||||
search,
|
||||
search: getSearch(type, search),
|
||||
}),
|
||||
enabled: !!(websiteId && type && startDate && endDate),
|
||||
});
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ 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';
|
||||
|
||||
export function useFormat() {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
const { locale } = useLocale();
|
||||
const { countryNames } = useCountryNames(locale);
|
||||
const { languageNames } = useLanguageNames(locale);
|
||||
|
||||
const formatOS = (value: string): string => {
|
||||
return OS_NAMES[value] || value;
|
||||
|
|
@ -34,6 +36,10 @@ export function useFormat() {
|
|||
return countryNames[country] ? `${value}, ${countryNames[country]}` : value;
|
||||
};
|
||||
|
||||
const formatLanguage = (value: string): string => {
|
||||
return languageNames[value?.split('-')[0]] || value;
|
||||
};
|
||||
|
||||
const formatValue = (value: string, type: string, data?: { [key: string]: any }): string => {
|
||||
switch (type) {
|
||||
case 'os':
|
||||
|
|
@ -48,12 +54,23 @@ export function useFormat() {
|
|||
return formatRegion(value);
|
||||
case 'city':
|
||||
return formatCity(value, data?.country);
|
||||
case 'language':
|
||||
return formatLanguage(value);
|
||||
default:
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
return { formatOS, formatBrowser, formatDevice, formatCountry, formatRegion, formatValue };
|
||||
return {
|
||||
formatOS,
|
||||
formatBrowser,
|
||||
formatDevice,
|
||||
formatCountry,
|
||||
formatRegion,
|
||||
formatCity,
|
||||
formatLanguage,
|
||||
formatValue,
|
||||
};
|
||||
}
|
||||
|
||||
export default useFormat;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export function useLanguageNames(locale) {
|
|||
}
|
||||
}, [locale]);
|
||||
|
||||
return list;
|
||||
return { languageNames: list };
|
||||
}
|
||||
|
||||
export default useLanguageNames;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ 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';
|
||||
|
|
@ -47,6 +48,7 @@ const icons = {
|
|||
Nodes,
|
||||
Overview,
|
||||
Profile,
|
||||
PushPin,
|
||||
Reports,
|
||||
Sun,
|
||||
User,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { Icon, Button, PopupTrigger, Popup, Text } from 'react-basics';
|
||||
import { Icon, Button, PopupTrigger, Popup } from 'react-basics';
|
||||
import classNames from 'classnames';
|
||||
import { languages } from 'lib/lang';
|
||||
import { useLocale } from 'components/hooks';
|
||||
|
|
@ -33,7 +33,7 @@ export function LanguageButton() {
|
|||
className={classNames(styles.item, { [styles.selected]: value === locale })}
|
||||
onClick={(e: any) => handleSelect(value, close, e)}
|
||||
>
|
||||
<Text>{label}</Text>
|
||||
<span lang={value}>{label}</span>
|
||||
{value === locale && (
|
||||
<Icon className={styles.icon}>
|
||||
<Icons.Check />
|
||||
|
|
|
|||
|
|
@ -1,25 +1,24 @@
|
|||
import MetricsTable, { MetricsTableProps } from './MetricsTable';
|
||||
import { emptyFilter } from 'lib/filters';
|
||||
import FilterLink from 'components/common/FilterLink';
|
||||
import TypeIcon from 'components/common/TypeIcon';
|
||||
import { useLocale } from 'components/hooks';
|
||||
import { useMessages } from 'components/hooks';
|
||||
import { useCountryNames } from 'components/hooks';
|
||||
import { useFormat } from 'components/hooks';
|
||||
|
||||
export function CitiesTable(props: MetricsTableProps) {
|
||||
const { locale } = useLocale();
|
||||
const { formatMessage, labels } = useMessages();
|
||||
const { countryNames } = useCountryNames(locale);
|
||||
|
||||
const renderLabel = (city: string, country: string) => {
|
||||
const countryName = countryNames[country];
|
||||
return countryName ? `${city}, ${countryName}` : city;
|
||||
};
|
||||
const { formatCity } = useFormat();
|
||||
|
||||
const renderLink = ({ x: city, country }) => {
|
||||
return (
|
||||
<FilterLink id="city" value={city} label={renderLabel(city, country)}>
|
||||
{country && <TypeIcon type="country" value={country} />}
|
||||
<FilterLink id="city" value={city} label={formatCity(city, country)}>
|
||||
{country && (
|
||||
<img
|
||||
src={`${process.env.basePath || ''}/images/country/${
|
||||
country?.toLowerCase() || 'xx'
|
||||
}.png`}
|
||||
alt={country}
|
||||
/>
|
||||
)}
|
||||
</FilterLink>
|
||||
);
|
||||
};
|
||||
|
|
@ -32,6 +31,7 @@ export function CitiesTable(props: MetricsTableProps) {
|
|||
metric={formatMessage(labels.visitors)}
|
||||
dataFilter={emptyFilter}
|
||||
renderLabel={renderLink}
|
||||
searchFormattedValues={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,8 +14,7 @@ export function CountriesTable({ ...props }: MetricsTableProps) {
|
|||
return (
|
||||
<FilterLink
|
||||
id="country"
|
||||
className={locale}
|
||||
value={countryNames[code] && code}
|
||||
value={(countryNames[code] && code) || code}
|
||||
label={formatCountry(code)}
|
||||
>
|
||||
<TypeIcon type="country" value={code?.toLowerCase()} />
|
||||
|
|
@ -30,6 +29,7 @@ export function CountriesTable({ ...props }: MetricsTableProps) {
|
|||
type="country"
|
||||
metric={formatMessage(labels.visitors)}
|
||||
renderLabel={renderLink}
|
||||
searchFormattedValues={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ export function DevicesTable(props: MetricsTableProps) {
|
|||
type="device"
|
||||
metric={formatMessage(labels.visitors)}
|
||||
renderLabel={renderLink}
|
||||
searchFormattedValues={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { useMemo } from 'react';
|
||||
import { colord } from 'colord';
|
||||
import BarChart from 'components/charts/BarChart';
|
||||
import { useLocale, useDateRange, useWebsiteEventsSeries } from 'components/hooks';
|
||||
import { CHART_COLORS } from 'lib/constants';
|
||||
import { useDateRange, useLocale, useWebsiteEventsSeries } from 'components/hooks';
|
||||
import { renderDateLabels } from 'lib/charts';
|
||||
import { CHART_COLORS } from 'lib/constants';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export interface EventsChartProps {
|
||||
websiteId: string;
|
||||
|
|
@ -12,7 +12,7 @@ export interface EventsChartProps {
|
|||
|
||||
export function EventsChart({ websiteId, className }: EventsChartProps) {
|
||||
const {
|
||||
dateRange: { startDate, endDate, unit },
|
||||
dateRange: { startDate, endDate, unit, value },
|
||||
} = useDateRange(websiteId);
|
||||
const { locale } = useLocale();
|
||||
const { data, isLoading } = useWebsiteEventsSeries(websiteId);
|
||||
|
|
@ -55,6 +55,7 @@ export function EventsChart({ websiteId, className }: EventsChartProps) {
|
|||
stacked={true}
|
||||
renderXLabel={renderDateLabels(unit, locale)}
|
||||
isLoading={isLoading}
|
||||
isAllTime={value === 'all'}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import MetricsTable, { MetricsTableProps } from './MetricsTable';
|
||||
import { percentFilter } from 'lib/filters';
|
||||
import { useLanguageNames } from 'components/hooks';
|
||||
import { useLocale } from 'components/hooks';
|
||||
import { useMessages } from 'components/hooks';
|
||||
import { useFormat } from 'components/hooks';
|
||||
|
||||
export function LanguagesTable({
|
||||
onDataLoad,
|
||||
|
|
@ -10,10 +10,10 @@ export function LanguagesTable({
|
|||
}: { onDataLoad: (data: any) => void } & MetricsTableProps) {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
const { locale } = useLocale();
|
||||
const languageNames = useLanguageNames(locale);
|
||||
const { formatLanguage } = useFormat();
|
||||
|
||||
const renderLabel = ({ x }) => {
|
||||
return <div className={locale}>{languageNames[x?.split('-')[0]] ?? x}</div>;
|
||||
return <div className={locale}>{formatLanguage(x)}</div>;
|
||||
};
|
||||
|
||||
return (
|
||||
|
|
@ -24,6 +24,7 @@ export function LanguagesTable({
|
|||
metric={formatMessage(labels.visitors)}
|
||||
onDataLoad={data => onDataLoad?.(percentFilter(data))}
|
||||
renderLabel={renderLabel}
|
||||
searchFormattedValues={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import { safeDecodeURIComponent } from 'next-basics';
|
|||
import { colord } from 'colord';
|
||||
import classNames from 'classnames';
|
||||
import { LegendItem } from 'chart.js/auto';
|
||||
import { useLocale } from 'components/hooks';
|
||||
import styles from './Legend.module.css';
|
||||
|
||||
export function Legend({
|
||||
|
|
@ -13,8 +12,6 @@ export function Legend({
|
|||
items: any[];
|
||||
onClick: (index: LegendItem) => void;
|
||||
}) {
|
||||
const { locale } = useLocale();
|
||||
|
||||
if (!items.find(({ text }) => text)) {
|
||||
return null;
|
||||
}
|
||||
|
|
@ -32,7 +29,7 @@ export function Legend({
|
|||
onClick={() => onClick(item)}
|
||||
>
|
||||
<StatusLight color={color.alpha(color.alpha() + 0.2).toHex()}>
|
||||
<span className={locale}>{safeDecodeURIComponent(text)}</span>
|
||||
{safeDecodeURIComponent(text)}
|
||||
</StatusLight>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ export interface MetricsTableProps extends ListTableProps {
|
|||
onDataLoad?: (data: any) => void;
|
||||
onSearch?: (search: string) => void;
|
||||
allowSearch?: boolean;
|
||||
searchFormattedValues?: boolean;
|
||||
showMore?: boolean;
|
||||
params?: { [key: string]: any };
|
||||
children?: ReactNode;
|
||||
|
|
@ -40,6 +41,7 @@ export function MetricsTable({
|
|||
onDataLoad,
|
||||
delay = null,
|
||||
allowSearch = false,
|
||||
searchFormattedValues = false,
|
||||
showMore = true,
|
||||
params,
|
||||
children,
|
||||
|
|
@ -53,7 +55,7 @@ export function MetricsTable({
|
|||
|
||||
const { data, isLoading, isFetched, error } = useWebsiteMetrics(
|
||||
websiteId,
|
||||
{ type, limit, search, ...params },
|
||||
{ type, limit, search: searchFormattedValues ? undefined : search, ...params },
|
||||
{
|
||||
retryDelay: delay || DEFAULT_ANIMATION_DURATION,
|
||||
onDataLoad,
|
||||
|
|
@ -74,6 +76,14 @@ 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;
|
||||
|
|
|
|||
|
|
@ -14,9 +14,16 @@ export interface PagepageviewsChartProps extends BarChartProps {
|
|||
};
|
||||
unit: string;
|
||||
isLoading?: boolean;
|
||||
isAllTime?: boolean;
|
||||
}
|
||||
|
||||
export function PagepageviewsChart({ data, unit, isLoading, ...props }: PagepageviewsChartProps) {
|
||||
export function PagepageviewsChart({
|
||||
data,
|
||||
unit,
|
||||
isLoading,
|
||||
isAllTime,
|
||||
...props
|
||||
}: PagepageviewsChartProps) {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
const { colors } = useTheme();
|
||||
const { locale } = useLocale();
|
||||
|
|
@ -74,6 +81,7 @@ export function PagepageviewsChart({ data, unit, isLoading, ...props }: Pagepage
|
|||
data={chartData}
|
||||
unit={unit}
|
||||
isLoading={isLoading}
|
||||
isAllTime={isAllTime}
|
||||
renderXLabel={renderDateLabels(unit, locale)}
|
||||
/>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ export function RegionsTable(props: MetricsTableProps) {
|
|||
|
||||
const renderLink = ({ x: code, country }) => {
|
||||
return (
|
||||
<FilterLink id="region" className={locale} value={code} label={getRegionName(code, country)}>
|
||||
<FilterLink id="region" value={code} label={getRegionName(code, country)}>
|
||||
<TypeIcon type="country" value={country?.toLowerCase()} />
|
||||
</FilterLink>
|
||||
);
|
||||
|
|
@ -25,6 +25,7 @@ export function RegionsTable(props: MetricsTableProps) {
|
|||
metric={formatMessage(labels.visitors)}
|
||||
dataFilter={emptyFilter}
|
||||
renderLabel={renderLink}
|
||||
searchFormattedValues={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ export function WorldMap({
|
|||
const { formatMessage, labels } = useMessages();
|
||||
const { countryNames } = useCountryNames(locale);
|
||||
const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale);
|
||||
const unknownLabel = formatMessage(labels.unknown);
|
||||
const {
|
||||
dateRange: { startDate, endDate },
|
||||
} = useDateRange(websiteId);
|
||||
|
|
@ -62,7 +63,9 @@ export function WorldMap({
|
|||
if (code === 'AQ') return;
|
||||
const country = metrics?.find(({ x }) => x === code);
|
||||
setTooltipPopup(
|
||||
`${countryNames[code]}: ${formatLongNumber(country?.y || 0)} ${visitorsLabel}` as any,
|
||||
`${countryNames[code] || unknownLabel}: ${formatLongNumber(
|
||||
country?.y || 0,
|
||||
)} ${visitorsLabel}` as any,
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,88 +1,88 @@
|
|||
{
|
||||
"label.access-code": "Access code",
|
||||
"label.access-code": "Přístupový kód",
|
||||
"label.actions": "Akce",
|
||||
"label.activity": "Activity log",
|
||||
"label.add": "Add",
|
||||
"label.add-description": "Add description",
|
||||
"label.add-member": "Add member",
|
||||
"label.add-step": "Add step",
|
||||
"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": "After",
|
||||
"label.after": "Po",
|
||||
"label.all": "Vše",
|
||||
"label.all-time": "All time",
|
||||
"label.all-time": "Celá doba",
|
||||
"label.analytics": "Analytics",
|
||||
"label.average": "Average",
|
||||
"label.average": "Průměr",
|
||||
"label.back": "Zpět",
|
||||
"label.before": "Before",
|
||||
"label.before": "Před",
|
||||
"label.bounce-rate": "Okamžité opuštění",
|
||||
"label.breakdown": "Breakdown",
|
||||
"label.browser": "Browser",
|
||||
"label.browsers": "Prohlížeč",
|
||||
"label.browser": "Prohlížeč",
|
||||
"label.browsers": "Prohlížeče",
|
||||
"label.cancel": "Zrušit",
|
||||
"label.change-password": "Změnit heslo",
|
||||
"label.cities": "Cities",
|
||||
"label.city": "City",
|
||||
"label.clear-all": "Clear all",
|
||||
"label.compare": "Compare",
|
||||
"label.confirm": "Confirm",
|
||||
"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": "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.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": "Current",
|
||||
"label.current": "Aktuální",
|
||||
"label.current-password": "Aktuální heslo",
|
||||
"label.custom-range": "Vlastní rozsah",
|
||||
"label.dashboard": "Přehled",
|
||||
"label.data": "Data",
|
||||
"label.date": "Date",
|
||||
"label.date": "Datum",
|
||||
"label.date-range": "Období",
|
||||
"label.day": "Day",
|
||||
"label.day": "Den",
|
||||
"label.default-date-range": "Výchozí období",
|
||||
"label.delete": "Smazat",
|
||||
"label.delete-report": "Delete report",
|
||||
"label.delete-team": "Delete team",
|
||||
"label.delete-user": "Delete user",
|
||||
"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": "Description",
|
||||
"label.description": "Popis",
|
||||
"label.desktop": "Stolní počítač",
|
||||
"label.details": "Details",
|
||||
"label.device": "Device",
|
||||
"label.details": "Detaily",
|
||||
"label.device": "Zařízení",
|
||||
"label.devices": "Zařízení",
|
||||
"label.dismiss": "Odejít",
|
||||
"label.does-not-contain": "Does not contain",
|
||||
"label.does-not-contain": "Neobsahuje",
|
||||
"label.domain": "Doména",
|
||||
"label.dropoff": "Dropoff",
|
||||
"label.edit": "Upravit",
|
||||
"label.edit-dashboard": "Edit dashboard",
|
||||
"label.edit-member": "Edit member",
|
||||
"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": "Entry URL",
|
||||
"label.event": "Event",
|
||||
"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": "Field",
|
||||
"label.field": "Pole",
|
||||
"label.fields": "Fields",
|
||||
"label.filter": "Filter",
|
||||
"label.filter": "Filtr",
|
||||
"label.filter-combined": "Kombinace",
|
||||
"label.filter-raw": "Nezpracované",
|
||||
"label.filters": "Filters",
|
||||
"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": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"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",
|
||||
|
|
@ -98,44 +98,44 @@
|
|||
"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.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": "Last {x} months",
|
||||
"label.last-months": "Posledních {x} měsíců",
|
||||
"label.last-seen": "Last seen",
|
||||
"label.leave": "Leave",
|
||||
"label.leave-team": "Leave team",
|
||||
"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": "Manage",
|
||||
"label.manager": "Manager",
|
||||
"label.manage": "Spravovat",
|
||||
"label.manager": "Správce",
|
||||
"label.max": "Max",
|
||||
"label.member": "Member",
|
||||
"label.members": "Members",
|
||||
"label.member": "Člen",
|
||||
"label.members": "Členové",
|
||||
"label.min": "Min",
|
||||
"label.mobile": "Mobilní telefon",
|
||||
"label.more": "Více",
|
||||
"label.my-account": "My account",
|
||||
"label.my-websites": "My websites",
|
||||
"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": "Overview",
|
||||
"label.owner": "Owner",
|
||||
"label.overview": "Přehled",
|
||||
"label.owner": "Vlastník",
|
||||
"label.page-of": "Page {current} of {total}",
|
||||
"label.page-views": "Zobrazení stránek",
|
||||
"label.pageTitle": "Page title",
|
||||
"label.pageTitle": "Název stránky",
|
||||
"label.pages": "Stránky",
|
||||
"label.password": "Heslo",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "Cesta",
|
||||
"label.paths": "Cesty",
|
||||
"label.powered-by": "Běží na {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
|
|
@ -228,13 +228,13 @@
|
|||
"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ěvy",
|
||||
"label.visits": "Visits",
|
||||
"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": "Window",
|
||||
"label.yesterday": "Yesterday",
|
||||
"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",
|
||||
|
|
|
|||
|
|
@ -2,278 +2,278 @@
|
|||
"label.access-code": "Zuegangscode",
|
||||
"label.actions": "Aktione",
|
||||
"label.activity": "Aktivitätsverlauf",
|
||||
"label.add": "Add",
|
||||
"label.add-description": "Add description",
|
||||
"label.add-member": "Add member",
|
||||
"label.add-step": "Add step",
|
||||
"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": "After",
|
||||
"label.after": "Nach",
|
||||
"label.all": "Alli",
|
||||
"label.all-time": "Gesamte Zitruum",
|
||||
"label.all-time": "Gsamte Zitruum",
|
||||
"label.analytics": "Analytics",
|
||||
"label.average": "Average",
|
||||
"label.average": "Durchschnitt",
|
||||
"label.back": "Zrugg",
|
||||
"label.before": "Before",
|
||||
"label.before": "Vor",
|
||||
"label.bounce-rate": "Absprungsrate",
|
||||
"label.breakdown": "Breakdown",
|
||||
"label.breakdown": "Uufschlüsselig",
|
||||
"label.browser": "Browser",
|
||||
"label.browsers": "Browser",
|
||||
"label.cancel": "Abbreche",
|
||||
"label.change-password": "Passwort ändere",
|
||||
"label.cities": "Städt",
|
||||
"label.city": "City",
|
||||
"label.city": "Stadt",
|
||||
"label.clear-all": "Alles lösche",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "Vergliiche",
|
||||
"label.confirm": "Bestätige",
|
||||
"label.confirm-password": "Passwort widerhole",
|
||||
"label.contains": "Contains",
|
||||
"label.contains": "Enthaltet",
|
||||
"label.continue": "Wiiter",
|
||||
"label.count": "Count",
|
||||
"label.count": "Azahl",
|
||||
"label.countries": "Länder",
|
||||
"label.country": "Country",
|
||||
"label.create": "Create",
|
||||
"label.create-report": "Create report",
|
||||
"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": "Current",
|
||||
"label.current-password": "Jetzigs Passwort",
|
||||
"label.current": "Aktuell",
|
||||
"label.current-password": "Aktuells Passwort",
|
||||
"label.custom-range": "Benutzerdefinierte Bereich",
|
||||
"label.dashboard": "Übersicht",
|
||||
"label.data": "Datä",
|
||||
"label.date": "Date",
|
||||
"label.date": "Datum",
|
||||
"label.date-range": "Datumsbereich",
|
||||
"label.day": "Day",
|
||||
"label.default-date-range": "Vorigstellte Datumsbereich",
|
||||
"label.day": "Tag",
|
||||
"label.default-date-range": "Voriigstellte Datumsbereich",
|
||||
"label.delete": "Lösche",
|
||||
"label.delete-report": "Delete report",
|
||||
"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": "Description",
|
||||
"label.description": "Beschriibig",
|
||||
"label.desktop": "Desktop",
|
||||
"label.details": "Details",
|
||||
"label.device": "Device",
|
||||
"label.device": "Grät",
|
||||
"label.devices": "Grät",
|
||||
"label.dismiss": "Verwerfe",
|
||||
"label.does-not-contain": "Does not contain",
|
||||
"label.dismiss": "Verwärfe",
|
||||
"label.does-not-contain": "Enthaltet nid",
|
||||
"label.domain": "Domain",
|
||||
"label.dropoff": "Dropoff",
|
||||
"label.dropoff": "Absprung",
|
||||
"label.edit": "Bearbeite",
|
||||
"label.edit-dashboard": "Dashboard bearbeite",
|
||||
"label.edit-member": "Edit member",
|
||||
"label.edit-member": "Mitglied bearbeite",
|
||||
"label.enable-share-url": "Freigab-URL aktiviere",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.event": "Event",
|
||||
"label.event-data": "Event data",
|
||||
"label.end-step": "Schlussschritt",
|
||||
"label.entry": "Iigangs URL",
|
||||
"label.event": "Ereigniss",
|
||||
"label.event-data": "Ereigniss Date",
|
||||
"label.events": "Ereigniss",
|
||||
"label.exit": "Exit URL",
|
||||
"label.false": "False",
|
||||
"label.field": "Field",
|
||||
"label.fields": "Fields",
|
||||
"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": "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.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": "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.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": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"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": "Last {x} months",
|
||||
"label.last-seen": "Last seen",
|
||||
"label.last-months": "Letzti {x} Mönet",
|
||||
"label.last-seen": "Zletzt gse",
|
||||
"label.leave": "Verlah",
|
||||
"label.leave-team": "Team verlah",
|
||||
"label.less-than": "Less than",
|
||||
"label.less-than-equals": "Less than or equals",
|
||||
"label.login": "Aamelde",
|
||||
"label.logout": "Abmelde",
|
||||
"label.manage": "Manage",
|
||||
"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": "Member",
|
||||
"label.member": "Mitglied",
|
||||
"label.members": "Mitglieder",
|
||||
"label.min": "Min",
|
||||
"label.mobile": "Handy",
|
||||
"label.mobile": "Händy",
|
||||
"label.more": "Meh",
|
||||
"label.my-account": "My account",
|
||||
"label.my-websites": "My websites",
|
||||
"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": "Overview",
|
||||
"label.overview": "Übersicht",
|
||||
"label.owner": "Bsitzer",
|
||||
"label.page-of": "Page {current} of {total}",
|
||||
"label.page-of": "Siite {current} vo {total}",
|
||||
"label.page-views": "Siitenufrüef",
|
||||
"label.pageTitle": "Page title",
|
||||
"label.pageTitle": "Siitetitel",
|
||||
"label.pages": "Siite",
|
||||
"label.password": "Passwort",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.powered-by": "Betribe dur {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"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": "Query",
|
||||
"label.query": "Abfrag",
|
||||
"label.query-parameters": "Abfragparameter",
|
||||
"label.realtime": "Echtzit",
|
||||
"label.referrer": "Referrer",
|
||||
"label.referrers": "Referrer",
|
||||
"label.referrer": "Verwiiser",
|
||||
"label.referrers": "Verwiisendi",
|
||||
"label.refresh": "Aktualisiere",
|
||||
"label.regenerate": "Erneuere",
|
||||
"label.region": "Region",
|
||||
"label.regions": "Regionä",
|
||||
"label.remove": "Entferne",
|
||||
"label.remove-member": "Remove member",
|
||||
"label.reports": "Reports",
|
||||
"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": "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.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": "Run query",
|
||||
"label.run-query": "Abfrag starte",
|
||||
"label.save": "Speichere",
|
||||
"label.screens": "Bildschirmuflösige",
|
||||
"label.search": "Search",
|
||||
"label.select": "Select",
|
||||
"label.select-date": "Select date",
|
||||
"label.select-role": "Select role",
|
||||
"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": "Session",
|
||||
"label.sessions": "Sessions",
|
||||
"label.session": "Sitzig",
|
||||
"label.sessions": "Sitzige",
|
||||
"label.settings": "Istellige",
|
||||
"label.share-url": "Freigab-URL",
|
||||
"label.single-day": "Ein Tag",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.sum": "Sum",
|
||||
"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-manager": "Team Manager",
|
||||
"label.team-member": "Team Mitglied",
|
||||
"label.team-name": "Team name",
|
||||
"label.team-name": "Team Name",
|
||||
"label.team-owner": "Team Bsitzer",
|
||||
"label.team-view-only": "Team view only",
|
||||
"label.team-websites": "Team websites",
|
||||
"label.team-view-only": "Nur für Teammitglieder sichtbar",
|
||||
"label.team-websites": "Team Websiite",
|
||||
"label.teams": "Teams",
|
||||
"label.theme": "Thema",
|
||||
"label.this-month": "De Monet",
|
||||
"label.this-week": "Die Wuche",
|
||||
"label.this-year": "Das Jahr",
|
||||
"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": "Schaubilder umschalte",
|
||||
"label.toggle-charts": "Charts umschalte",
|
||||
"label.total": "Total",
|
||||
"label.total-records": "Total records",
|
||||
"label.total-records": "Gsamti Datesätz",
|
||||
"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": "Eidütigi Bsuecher",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"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": "Untitled",
|
||||
"label.untitled": "Unbennant",
|
||||
"label.update": "Update",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "Benutzer",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "Benutzereigeschafte",
|
||||
"label.username": "Benutzername",
|
||||
"label.users": "Benutzer",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.value": "Value",
|
||||
"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": "View only",
|
||||
"label.view-only": "Nume aluege",
|
||||
"label.views": "Ufrüef",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.views-per-visit": "Ufrüef pro Bsuech",
|
||||
"label.visit-duration": "Durchschn. Bsuechsziit",
|
||||
"label.visitors": "Bsuecher",
|
||||
"label.visits": "Visits",
|
||||
"label.visits": "Bsüech",
|
||||
"label.website": "Website",
|
||||
"label.website-id": "Websiite ID",
|
||||
"label.websites": "Websiite",
|
||||
"label.window": "Window",
|
||||
"label.window": "Fenster",
|
||||
"label.yesterday": "Gester",
|
||||
"message.action-confirmation": "Type {confirmation} in the box below to confirm.",
|
||||
"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": "Collected data",
|
||||
"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": "Are you sure you want to remove {target}?",
|
||||
"message.confirm-reset": "Sind Sie sicher, dass Sie dStatistike vo {target} zruggsetze wend?",
|
||||
"message.delete-team-warning": "Deleting a team will also delete all team websites.",
|
||||
"message.delete-website-warning": "Alli dezueghörige Date werdet ebefalls glöscht.",
|
||||
"message.error": "Es isch en Fehler uftrete.",
|
||||
"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": "Falschs Passwort oder Benutzername.",
|
||||
"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": "A new version of Umami {version} is available!",
|
||||
"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": "No event data is available.",
|
||||
"message.no-event-data": "Es sind kei Event Date verfügbar.",
|
||||
"message.no-match-password": "Passwörter stimmed ned überi",
|
||||
"message.no-results-found": "No results were found.",
|
||||
"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": "To reset this website, type {confirmation} in the box below to confirm.",
|
||||
"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 dem Team.",
|
||||
"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önd vo jedem im Team agluegt werde",
|
||||
"message.team-websites-info": "Websiite chöi vo jedem im Team agluegt werde",
|
||||
"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": "Benutzer glöscht.",
|
||||
"message.viewed-page": "Viewed page",
|
||||
"message.visitor-log": "Bsuecher us {country} benutzt {browser} uf {os} {device}",
|
||||
"message.visitors-dropped-off": "Visitors dropped off"
|
||||
"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"
|
||||
}
|
||||
|
|
@ -67,8 +67,8 @@
|
|||
"label.enable-share-url": "Freigabe-URL aktivieren",
|
||||
"label.end-step": "Schlussschritt",
|
||||
"label.entry": "Eingangs-URL",
|
||||
"label.event": "Ereigniss",
|
||||
"label.event-data": "Ereignissdaten",
|
||||
"label.event": "Ereignis",
|
||||
"label.event-data": "Ereignisdaten",
|
||||
"label.events": "Ereignisse",
|
||||
"label.exit": "Ausgangs-URL",
|
||||
"label.false": "Falsch",
|
||||
|
|
@ -271,7 +271,7 @@
|
|||
"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": "Ausgelöstes Ereigniss",
|
||||
"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}",
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@
|
|||
"label.edit-member": "Modifier le membre",
|
||||
"label.enable-share-url": "Activer l'URL de partage",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.entry": "URL d'entrée",
|
||||
"label.event": "Évènement",
|
||||
"label.event-data": "Données d'évènements",
|
||||
"label.events": "Évènements",
|
||||
|
|
@ -78,12 +78,12 @@
|
|||
"label.filter-combined": "Combiné",
|
||||
"label.filter-raw": "Brut",
|
||||
"label.filters": "Filtres",
|
||||
"label.first-seen": "First seen",
|
||||
"label.first-seen": "Vu pour la première fois",
|
||||
"label.funnel": "Entonnoir",
|
||||
"label.funnel-description": "Suivi des conversions et des taux d'abandons.",
|
||||
"label.goal": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"label.goals-description": "Track your goals for pageviews and events.",
|
||||
"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.host": "Host",
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
"label.join": "Rejoindre",
|
||||
"label.join-team": "Rejoindre une équipe",
|
||||
"label.journey": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"label.journey-description": "Comprendre comment les utilisateurs naviguent sur votre site web.",
|
||||
"label.language": "Langue",
|
||||
"label.languages": "Langues",
|
||||
"label.laptop": "Portable",
|
||||
|
|
@ -137,12 +137,12 @@
|
|||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.powered-by": "Propulsé par {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"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": "Properties",
|
||||
"label.property": "Property",
|
||||
"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",
|
||||
|
|
@ -162,14 +162,14 @@
|
|||
"label.retention": "Rétention",
|
||||
"label.retention-description": "Mesure de l'attractivité du site en visualisant les taux de visiteurs qui reviennent.",
|
||||
"label.revenue": "Revenue",
|
||||
"label.revenue-description": "Look into your revenue across time.",
|
||||
"label.revenue-property": "Revenue Property",
|
||||
"label.revenue-description": "Examinez vos revenus au fil du temps.",
|
||||
"label.revenue-property": "Propriétés des revenues",
|
||||
"label.role": "Rôle",
|
||||
"label.run-query": "Éxécuter la requête",
|
||||
"label.save": "Enregistrer",
|
||||
"label.screens": "Résolutions d'écran",
|
||||
"label.search": "Rechercher",
|
||||
"label.select": "Select",
|
||||
"label.select": "Selectionner",
|
||||
"label.select-date": "Choisir une période",
|
||||
"label.select-role": "Choisir un rôle",
|
||||
"label.select-website": "Choisir un site",
|
||||
|
|
@ -178,17 +178,17 @@
|
|||
"label.settings": "Paramètres",
|
||||
"label.share-url": "URL de partage",
|
||||
"label.single-day": "Journée",
|
||||
"label.start-step": "Start Step",
|
||||
"label.start-step": "Etape de démarrage",
|
||||
"label.steps": "Étapes",
|
||||
"label.sum": "Somme",
|
||||
"label.tablet": "Tablette",
|
||||
"label.team": "Équipe",
|
||||
"label.team-id": "ID d'équipe",
|
||||
"label.team-manager": "Team manager",
|
||||
"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": "Team view only",
|
||||
"label.team-view-only": "Vue d'équipe uniquement",
|
||||
"label.team-websites": "Sites d'équipes",
|
||||
"label.teams": "Équipes",
|
||||
"label.theme": "Thème",
|
||||
|
|
@ -209,14 +209,14 @@
|
|||
"label.type": "Type",
|
||||
"label.unique": "Unique",
|
||||
"label.unique-visitors": "Visiteurs uniques",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "Clients uniques",
|
||||
"label.unknown": "Inconnu",
|
||||
"label.untitled": "Sans titre",
|
||||
"label.update": "Modifier",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "Utilisateur",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "Propriétés d'utilisateurs",
|
||||
"label.username": "Nom d'utilisateur",
|
||||
"label.users": "Utilisateurs",
|
||||
"label.utm": "UTM",
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"label.access-code": "Access code",
|
||||
"label.access-code": "पहुंच कोड",
|
||||
"label.actions": "कार्य",
|
||||
"label.activity": "Activity log",
|
||||
"label.add": "Add",
|
||||
"label.add-description": "Add description",
|
||||
"label.activity": "गतिविधि लॉग",
|
||||
"label.add": "जोडो",
|
||||
"label.add-description": "विवरण लिखें",
|
||||
"label.add-member": "Add member",
|
||||
"label.add-step": "Add step",
|
||||
"label.add-website": "वेबसाइट",
|
||||
|
|
@ -155,7 +155,7 @@
|
|||
"label.regions": "Regions",
|
||||
"label.remove": "Remove",
|
||||
"label.remove-member": "Remove member",
|
||||
"label.reports": "Reports",
|
||||
"label.reports": "प्रतिवेदन",
|
||||
"label.required": "अपेक्षित",
|
||||
"label.reset": "रीसेट",
|
||||
"label.reset-website": "Reset statistics",
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@
|
|||
"label.views-per-visit": "訪問あたりの閲覧数",
|
||||
"label.visit-duration": "平均滞在時間",
|
||||
"label.visitors": "訪問者",
|
||||
"label.visits": "訪問者数",
|
||||
"label.visits": "訪問数",
|
||||
"label.website": "Webサイト",
|
||||
"label.website-id": "WebサイトID",
|
||||
"label.websites": "Webサイト",
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
{
|
||||
"label.access-code": "Access code",
|
||||
"label.access-code": "Tilgangskode",
|
||||
"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.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": "After",
|
||||
"label.after": "Etter",
|
||||
"label.all": "Alle",
|
||||
"label.all-time": "Noensinne",
|
||||
"label.analytics": "Analytics",
|
||||
"label.average": "Average",
|
||||
"label.average": "Gjennomsnnitt",
|
||||
"label.back": "Tilbake",
|
||||
"label.before": "Before",
|
||||
"label.before": "Før",
|
||||
"label.bounce-rate": "Avvisningsfrekvens",
|
||||
"label.breakdown": "Breakdown",
|
||||
"label.browser": "Browser",
|
||||
"label.breakdown": "Nedbrytning",
|
||||
"label.browser": "Nettleser",
|
||||
"label.browsers": "Nettlesere",
|
||||
"label.cancel": "Avvis",
|
||||
"label.change-password": "Bytt passord",
|
||||
"label.cities": "Cities",
|
||||
"label.city": "City",
|
||||
"label.clear-all": "Clear all",
|
||||
"label.compare": "Compare",
|
||||
"label.confirm": "Confirm",
|
||||
"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": "Contains",
|
||||
"label.continue": "Continue",
|
||||
"label.count": "Count",
|
||||
"label.contains": "Inneholder",
|
||||
"label.continue": "Fortsett",
|
||||
"label.count": "Antall",
|
||||
"label.countries": "Land",
|
||||
"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.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": "Date",
|
||||
"label.date": "Dato",
|
||||
"label.date-range": "Datointervall",
|
||||
"label.day": "Day",
|
||||
"label.day": "Dag",
|
||||
"label.default-date-range": "Standard datoperiode",
|
||||
"label.delete": "Slett",
|
||||
"label.delete-report": "Delete report",
|
||||
|
|
@ -54,226 +54,227 @@
|
|||
"label.delete-website": "Slett nettstedet",
|
||||
"label.description": "Description",
|
||||
"label.desktop": "Stasjonær",
|
||||
"label.details": "Details",
|
||||
"label.device": "Device",
|
||||
"label.details": "Detaljer",
|
||||
"label.device": "Enhet",
|
||||
"label.devices": "Enheter",
|
||||
"label.dismiss": "Avbryt",
|
||||
"label.does-not-contain": "Does not contain",
|
||||
"label.does-not-contain": "Innholder ikke",
|
||||
"label.domain": "Domene",
|
||||
"label.dropoff": "Dropoff",
|
||||
"label.edit": "Rediger",
|
||||
"label.edit-dashboard": "Edit dashboard",
|
||||
"label.edit-member": "Edit member",
|
||||
"label.edit-dashboard": "Rediger dashboard",
|
||||
"label.edit-member": "Rediger bruker",
|
||||
"label.enable-share-url": "Aktiver delings-URL",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.event": "Event",
|
||||
"label.event-data": "Event data",
|
||||
"label.events": "Arrangementer",
|
||||
"label.exit": "Exit URL",
|
||||
"label.false": "False",
|
||||
"label.field": "Field",
|
||||
"label.fields": "Fields",
|
||||
"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": "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.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": "Last seen",
|
||||
"label.leave": "Leave",
|
||||
"label.leave-team": "Leave team",
|
||||
"label.less-than": "Less than",
|
||||
"label.less-than-equals": "Less than or equals",
|
||||
"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": "Manage",
|
||||
"label.manager": "Manager",
|
||||
"label.max": "Max",
|
||||
"label.member": "Member",
|
||||
"label.members": "Members",
|
||||
"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": "My account",
|
||||
"label.my-websites": "My websites",
|
||||
"label.my-account": "Min konto",
|
||||
"label.my-websites": "Mine nettsider",
|
||||
"label.name": "Navn",
|
||||
"label.new-password": "Nytt passord",
|
||||
"label.none": "None",
|
||||
"label.none": "Ingen",
|
||||
"label.number-of-records": "{x} {x, plural, one {record} other {records}}",
|
||||
"label.ok": "OK",
|
||||
"label.os": "OS",
|
||||
"label.overview": "Overview",
|
||||
"label.overview": "Oversikt",
|
||||
"label.owner": "Eier",
|
||||
"label.page-of": "Page {current} of {total}",
|
||||
"label.page-of": "Side {current} av {total}",
|
||||
"label.page-views": "Sidevisninger",
|
||||
"label.pageTitle": "Page title",
|
||||
"label.pageTitle": "Sidetittel",
|
||||
"label.pages": "Sider",
|
||||
"label.password": "Passord",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "Sti",
|
||||
"label.paths": "Stier",
|
||||
"label.powered-by": "Drevet av {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "Forrige",
|
||||
"label.previous-period": "Forrige periode",
|
||||
"label.previous-year": "Forrige år",
|
||||
"label.profile": "Profil",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.queries": "Queries",
|
||||
"label.query": "Query",
|
||||
"label.query-parameters": "Query parameters",
|
||||
"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": "Referrer",
|
||||
"label.referrers": "Referanser",
|
||||
"label.referrer": "Henviser",
|
||||
"label.referrers": "Henvisere",
|
||||
"label.refresh": "Oppdater",
|
||||
"label.regenerate": "Regenerate",
|
||||
"label.regenerate": "Regenerer",
|
||||
"label.region": "Region",
|
||||
"label.regions": "Regions",
|
||||
"label.remove": "Remove",
|
||||
"label.remove-member": "Remove member",
|
||||
"label.reports": "Reports",
|
||||
"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": "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.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": "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.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": "Enkelt dag",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"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": "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.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": "Title",
|
||||
"label.title": "Tittel",
|
||||
"label.today": "I dag",
|
||||
"label.toggle-charts": "Veksle grafer",
|
||||
"label.total": "Total",
|
||||
"label.total-records": "Total records",
|
||||
"label.total": "Totalt",
|
||||
"label.total-records": "Totalt antall oppføringer",
|
||||
"label.tracking-code": "Sporingskode",
|
||||
"label.transactions": "Transactions",
|
||||
"label.transfer": "Transfer",
|
||||
"label.transfer-website": "Transfer website",
|
||||
"label.true": "True",
|
||||
"label.transactions": "Transaksjoner",
|
||||
"label.transfer": "Overfør",
|
||||
"label.transfer-website": "Overfør nettsted",
|
||||
"label.true": "Sant",
|
||||
"label.type": "Type",
|
||||
"label.unique": "Unique",
|
||||
"label.unique": "Unike",
|
||||
"label.unique-visitors": "Unike besøkende",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "Unike kunder",
|
||||
"label.unknown": "Ukjent",
|
||||
"label.untitled": "Untitled",
|
||||
"label.update": "Update",
|
||||
"label.untitled": "Uten tittel",
|
||||
"label.update": "Oppdater",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "User",
|
||||
"label.user-property": "User Property",
|
||||
"label.urls": "URL-er",
|
||||
"label.user": "Bruker",
|
||||
"label.user-property": "Brukeregenskap",
|
||||
"label.username": "Brukernavn",
|
||||
"label.users": "Users",
|
||||
"label.users": "Brukere",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.value": "Value",
|
||||
"label.view": "View",
|
||||
"label.utm-description": "Spor kampanjene dine via UTM-parametre.",
|
||||
"label.value": "Verdi",
|
||||
"label.view": "Vis",
|
||||
"label.view-details": "Vis detaljer",
|
||||
"label.view-only": "View only",
|
||||
"label.view-only": "Kun visning",
|
||||
"label.views": "Visninger",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.views-per-visit": "Visninger per besøk",
|
||||
"label.visit-duration": "Gjennomsnittlig besøkstid",
|
||||
"label.visitors": "Besøkende",
|
||||
"label.visits": "Visits",
|
||||
"label.website": "Website",
|
||||
"label.website-id": "Website ID",
|
||||
"label.visits": "Besøk",
|
||||
"label.website": "Nettsted",
|
||||
"label.website-id": "Nettsted-ID",
|
||||
"label.websites": "Nettsteder",
|
||||
"label.window": "Window",
|
||||
"label.yesterday": "Yesterday",
|
||||
"message.action-confirmation": "Type {confirmation} in the box below to confirm.",
|
||||
"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": "Collected data",
|
||||
"message.collected-data": "Innsamlede 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 vil nullstille {target}'s statistikk?",
|
||||
"message.delete-team-warning": "Deleting a team will also delete all team websites.",
|
||||
"message.delete-website-warning": "Alle tilknyttede data slettes også.",
|
||||
"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} on {url}",
|
||||
"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": "Minimum length of {n} characters",
|
||||
"message.new-version-available": "A new version of Umami {version} is available!",
|
||||
"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": "No event data is available.",
|
||||
"message.no-event-data": "Ingen hendelsesdata er tilgjengelig.",
|
||||
"message.no-match-password": "Passordene er ikke like",
|
||||
"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-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": "Side ikke funnet.",
|
||||
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
|
||||
"message.reset-website-warning": "All statistikk for denne nettsiden vil bli slettet, men sporingskoden din vil forbli uberørt.",
|
||||
"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": "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.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": "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.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": "Visitors dropped off"
|
||||
"message.visitors-dropped-off": "Besøkende falt fra"
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
"label.add": "Adaugă",
|
||||
"label.add-description": "Adaugă descriere",
|
||||
"label.add-member": "Adaugă membru",
|
||||
"label.add-step": "Add step",
|
||||
"label.add-website": "Adăugare site web",
|
||||
"label.add-step": "Adaugă pas",
|
||||
"label.add-website": "Adaugă site web",
|
||||
"label.admin": "Administrator",
|
||||
"label.after": "După",
|
||||
"label.all": "Toate",
|
||||
|
|
@ -24,12 +24,12 @@
|
|||
"label.cities": "Orașe",
|
||||
"label.city": "Oraș",
|
||||
"label.clear-all": "Șterge tot",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "Compară",
|
||||
"label.confirm": "Confirm",
|
||||
"label.confirm-password": "Confirmare parolă",
|
||||
"label.contains": "Conține",
|
||||
"label.continue": "Continuă",
|
||||
"label.count": "Count",
|
||||
"label.count": "Număr",
|
||||
"label.countries": "Țări",
|
||||
"label.country": "Țară",
|
||||
"label.create": "Crează",
|
||||
|
|
@ -37,21 +37,21 @@
|
|||
"label.create-team": "Crează echipă",
|
||||
"label.create-user": "Crează utilizator",
|
||||
"label.created": "Creat",
|
||||
"label.created-by": "Created By",
|
||||
"label.current": "Current",
|
||||
"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": "Data",
|
||||
"label.date-range": "Interval de date",
|
||||
"label.date": "Dată",
|
||||
"label.date-range": "Interval",
|
||||
"label.day": "Zi",
|
||||
"label.default-date-range": "Interval de date implicit",
|
||||
"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": "Ștergere site web",
|
||||
"label.delete-website": "Șterge site web",
|
||||
"label.description": "Descriere",
|
||||
"label.desktop": "Desktop",
|
||||
"label.details": "Detalii",
|
||||
|
|
@ -65,12 +65,12 @@
|
|||
"label.edit-dashboard": "Editare tablou de bord",
|
||||
"label.edit-member": "Editare membru",
|
||||
"label.enable-share-url": "Activare adresă URL de distribuire",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.end-step": "Pas final",
|
||||
"label.entry": "URL de intrare",
|
||||
"label.event": "Eveniment",
|
||||
"label.event-data": "Date despre eveniment",
|
||||
"label.events": "Evenimente",
|
||||
"label.exit": "Exit URL",
|
||||
"label.exit": "URL de ieșire",
|
||||
"label.false": "Fals",
|
||||
"label.field": "Câmp",
|
||||
"label.fields": "Câmpuri",
|
||||
|
|
@ -78,12 +78,12 @@
|
|||
"label.filter-combined": "Combinat",
|
||||
"label.filter-raw": "Brut",
|
||||
"label.filters": "Filtre",
|
||||
"label.first-seen": "First seen",
|
||||
"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": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"label.goals-description": "Track your goals for pageviews and events.",
|
||||
"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",
|
||||
|
|
@ -96,15 +96,15 @@
|
|||
"label.is-set": "Este setat",
|
||||
"label.join": "Alătură-te",
|
||||
"label.join-team": "Alătură-te echipei",
|
||||
"label.journey": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"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": "Last {x} months",
|
||||
"label.last-seen": "Last seen",
|
||||
"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",
|
||||
|
|
@ -134,15 +134,15 @@
|
|||
"label.pageTitle": "Titlul paginii",
|
||||
"label.pages": "Pagini",
|
||||
"label.password": "Parolă",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "Rută",
|
||||
"label.paths": "Rute",
|
||||
"label.powered-by": "Cu sprijinul {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "Anterior",
|
||||
"label.previous-period": "Perioda anterioară",
|
||||
"label.previous-year": "Anul anterior",
|
||||
"label.profile": "Profil",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.properties": "Proprietăți",
|
||||
"label.property": "Proprietate",
|
||||
"label.queries": "Interogări",
|
||||
"label.query": "Interogare",
|
||||
"label.query-parameters": "Parametri de interogare",
|
||||
|
|
@ -161,8 +161,8 @@
|
|||
"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": "Revenue",
|
||||
"label.revenue-description": "Look into your revenue across time.",
|
||||
"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",
|
||||
|
|
@ -173,18 +173,18 @@
|
|||
"label.select-date": "Selectează data",
|
||||
"label.select-role": "Selectează rolul",
|
||||
"label.select-website": "Selectează website",
|
||||
"label.session": "Session",
|
||||
"label.session": "Sesiune",
|
||||
"label.sessions": "Sesiuni",
|
||||
"label.settings": "Setări",
|
||||
"label.share-url": "Partajare URL",
|
||||
"label.single-day": "O singură zi",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.start-step": "Pas de început",
|
||||
"label.steps": "Pași",
|
||||
"label.sum": "Sumă",
|
||||
"label.tablet": "Tabletă",
|
||||
"label.team": "Echipă",
|
||||
"label.team-id": "ID Echipa",
|
||||
"label.team-manager": "Team manager",
|
||||
"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ă",
|
||||
|
|
@ -202,34 +202,34 @@
|
|||
"label.total": "Total",
|
||||
"label.total-records": "Total înregistrări",
|
||||
"label.tracking-code": "Cod de urmărire",
|
||||
"label.transactions": "Transactions",
|
||||
"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": "Unique Customers",
|
||||
"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": "User Property",
|
||||
"label.user-property": "Proprietatea utilizatorului",
|
||||
"label.username": "Nume utilizator",
|
||||
"label.users": "Utilizatori",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"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": "Views per visit",
|
||||
"label.views-per-visit": "Vizualizări per vizită",
|
||||
"label.visit-duration": "Timp mediu de vizitare",
|
||||
"label.visitors": "Vizitatori",
|
||||
"label.visits": "Visits",
|
||||
"label.visits": "Vizite",
|
||||
"label.website": "Website",
|
||||
"label.website-id": "ID Website",
|
||||
"label.websites": "Site-uri web",
|
||||
|
|
@ -237,7 +237,7 @@
|
|||
"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": "Collected data",
|
||||
"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}?",
|
||||
|
|
|
|||
|
|
@ -2,194 +2,194 @@
|
|||
"label.access-code": "Код доступа",
|
||||
"label.actions": "Действия",
|
||||
"label.activity": "Журнал активности",
|
||||
"label.add": "Add",
|
||||
"label.add-description": "Add description",
|
||||
"label.add-member": "Add member",
|
||||
"label.add-step": "Add step",
|
||||
"label.add": "Добавить",
|
||||
"label.add-description": "Добавить описание",
|
||||
"label.add-member": "Добавить участника",
|
||||
"label.add-step": "Добавить шаг",
|
||||
"label.add-website": "Добавить сайт",
|
||||
"label.admin": "Администратор",
|
||||
"label.after": "After",
|
||||
"label.after": "После",
|
||||
"label.all": "Все",
|
||||
"label.all-time": "Все время",
|
||||
"label.analytics": "Аналитика",
|
||||
"label.average": "Average",
|
||||
"label.average": "Средний",
|
||||
"label.back": "Назад",
|
||||
"label.before": "Before",
|
||||
"label.before": "До",
|
||||
"label.bounce-rate": "Отказы",
|
||||
"label.breakdown": "Breakdown",
|
||||
"label.browser": "Browser",
|
||||
"label.breakdown": "Авария",
|
||||
"label.browser": "Браузер",
|
||||
"label.browsers": "Браузеры",
|
||||
"label.cancel": "Отменить",
|
||||
"label.change-password": "Изменить пароль",
|
||||
"label.cities": "Города",
|
||||
"label.city": "City",
|
||||
"label.city": "Город",
|
||||
"label.clear-all": "Очистить все",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "Сравнить",
|
||||
"label.confirm": "Подтвердить",
|
||||
"label.confirm-password": "Подтвердить пароль",
|
||||
"label.contains": "Contains",
|
||||
"label.contains": "Содержит",
|
||||
"label.continue": "Продолжить",
|
||||
"label.count": "Count",
|
||||
"label.count": "Считать",
|
||||
"label.countries": "Страны",
|
||||
"label.country": "Country",
|
||||
"label.create": "Create",
|
||||
"label.create-report": "Create report",
|
||||
"label.country": "Страна",
|
||||
"label.create": "Создать",
|
||||
"label.create-report": "Создать отчет",
|
||||
"label.create-team": "Создать команду",
|
||||
"label.create-user": "Создать пользователя",
|
||||
"label.created": "Создано",
|
||||
"label.created-by": "Created By",
|
||||
"label.current": "Current",
|
||||
"label.created-by": "Создано",
|
||||
"label.current": "Текущий",
|
||||
"label.current-password": "Текущий пароль",
|
||||
"label.custom-range": "Другой период",
|
||||
"label.dashboard": "Информационная панель",
|
||||
"label.data": "Данные",
|
||||
"label.date": "Date",
|
||||
"label.date": "Дата",
|
||||
"label.date-range": "Диапазон дат",
|
||||
"label.day": "Day",
|
||||
"label.day": "День",
|
||||
"label.default-date-range": "Диапазон дат по-умолчанию",
|
||||
"label.delete": "Удалить",
|
||||
"label.delete-report": "Delete report",
|
||||
"label.delete-report": "Удалить отчет",
|
||||
"label.delete-team": "Удалить команду",
|
||||
"label.delete-user": "Удалить пользователя",
|
||||
"label.delete-website": "Удалить сайт",
|
||||
"label.description": "Description",
|
||||
"label.description": "Описание",
|
||||
"label.desktop": "Настольный компьютер",
|
||||
"label.details": "Подробности",
|
||||
"label.device": "Device",
|
||||
"label.device": "Устройство",
|
||||
"label.devices": "Устройства",
|
||||
"label.dismiss": "Отклонить",
|
||||
"label.does-not-contain": "Does not contain",
|
||||
"label.does-not-contain": "Не содержит",
|
||||
"label.domain": "Домен",
|
||||
"label.dropoff": "Dropoff",
|
||||
"label.dropoff": "Высадка",
|
||||
"label.edit": "Изменить",
|
||||
"label.edit-dashboard": "Редактировать дашборд",
|
||||
"label.edit-member": "Edit member",
|
||||
"label.edit-member": "Редактировать участника",
|
||||
"label.enable-share-url": "Разрешить делиться ссылкой",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.event": "Event",
|
||||
"label.event-data": "Event data",
|
||||
"label.end-step": "Конечный шаг",
|
||||
"label.entry": "URL-адрес входа",
|
||||
"label.event": "Событие",
|
||||
"label.event-data": "Данные о событии",
|
||||
"label.events": "События",
|
||||
"label.exit": "Exit URL",
|
||||
"label.false": "False",
|
||||
"label.field": "Field",
|
||||
"label.fields": "Fields",
|
||||
"label.filter": "Filter",
|
||||
"label.exit": "URL-адрес выхода",
|
||||
"label.false": "Ложь",
|
||||
"label.field": "Поле",
|
||||
"label.fields": "Поля",
|
||||
"label.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.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": "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.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.journey-description": "Поймите, как пользователи перемещаются по вашему сайту.",
|
||||
"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.last-months": "Последние {x} месяцев",
|
||||
"label.last-seen": "Последний вход",
|
||||
"label.leave": "Уйти",
|
||||
"label.leave-team": "Покинуть команду",
|
||||
"label.less-than": "Less than",
|
||||
"label.less-than-equals": "Less than or equals",
|
||||
"label.less-than": "Меньше, чем",
|
||||
"label.less-than-equals": "Меньше или равно",
|
||||
"label.login": "Войти",
|
||||
"label.logout": "Выйти",
|
||||
"label.manage": "Manage",
|
||||
"label.manager": "Manager",
|
||||
"label.max": "Max",
|
||||
"label.member": "Member",
|
||||
"label.manage": "Управление",
|
||||
"label.manager": "Менеджер",
|
||||
"label.max": "Максимум",
|
||||
"label.member": "Участник",
|
||||
"label.members": "Участники",
|
||||
"label.min": "Min",
|
||||
"label.min": "Минимум",
|
||||
"label.mobile": "Смартфон",
|
||||
"label.more": "Больше",
|
||||
"label.my-account": "My account",
|
||||
"label.my-websites": "My websites",
|
||||
"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.number-of-records": "{x} {x, plural, one {запись} other {записи}}",
|
||||
"label.ok": "OK",
|
||||
"label.os": "OS",
|
||||
"label.overview": "Overview",
|
||||
"label.overview": "Обзор",
|
||||
"label.owner": "Владелец",
|
||||
"label.page-of": "Page {current} of {total}",
|
||||
"label.page-of": "Страница {current} из {total}",
|
||||
"label.page-views": "Просмотры страниц",
|
||||
"label.pageTitle": "Page title",
|
||||
"label.pageTitle": "Название страницы",
|
||||
"label.pages": "Страницы",
|
||||
"label.password": "Пароль",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "Путь",
|
||||
"label.paths": "Пути",
|
||||
"label.powered-by": "На движке {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "Предыдущий",
|
||||
"label.previous-period": "Предыдущий период",
|
||||
"label.previous-year": "Предыдущий год",
|
||||
"label.profile": "Профиль",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.properties": "Свойства",
|
||||
"label.property": "Свойство",
|
||||
"label.queries": "Запросы",
|
||||
"label.query": "Query",
|
||||
"label.query": "Запрос",
|
||||
"label.query-parameters": "Параметры запроса",
|
||||
"label.realtime": "Реальное время",
|
||||
"label.referrer": "Referrer",
|
||||
"label.referrer": "Реферер",
|
||||
"label.referrers": "Источники",
|
||||
"label.refresh": "Обновить",
|
||||
"label.regenerate": "Обновить",
|
||||
"label.region": "Region",
|
||||
"label.region": "Регион",
|
||||
"label.regions": "Регионы",
|
||||
"label.remove": "Удалить",
|
||||
"label.remove-member": "Remove member",
|
||||
"label.reports": "Reports",
|
||||
"label.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.retention": "Удержание",
|
||||
"label.retention-description": "Измерьте «прилипаемость» вашего сайта, отслеживая, как часто пользователи возвращаются на него.",
|
||||
"label.revenue": "Выручка",
|
||||
"label.revenue-description": "Изучите свои доходы за определенное время.",
|
||||
"label.revenue-property": "Доходная недвижимость",
|
||||
"label.role": "Роль",
|
||||
"label.run-query": "Run query",
|
||||
"label.run-query": "Выполнить запрос",
|
||||
"label.save": "Сохранить",
|
||||
"label.screens": "Экраны",
|
||||
"label.search": "Search",
|
||||
"label.select": "Select",
|
||||
"label.select-date": "Select date",
|
||||
"label.select-role": "Select role",
|
||||
"label.search": "Поиск",
|
||||
"label.select": "Выберите",
|
||||
"label.select-date": "Выберите дату",
|
||||
"label.select-role": "Выберите роль",
|
||||
"label.select-website": "Выбрать сайт",
|
||||
"label.session": "Session",
|
||||
"label.session": "Сессия",
|
||||
"label.sessions": "Сессии",
|
||||
"label.settings": "Настройки",
|
||||
"label.share-url": "Поделиться ссылкой",
|
||||
"label.single-day": "Один день",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.sum": "Sum",
|
||||
"label.start-step": "Начальный этап",
|
||||
"label.steps": "Шаги",
|
||||
"label.sum": "Сумма",
|
||||
"label.tablet": "Планшет",
|
||||
"label.team": "Команда",
|
||||
"label.team-id": "ID команды",
|
||||
"label.team-manager": "Team manager",
|
||||
"label.team-manager": "Менеджер команды",
|
||||
"label.team-member": "Член команды",
|
||||
"label.team-name": "Team name",
|
||||
"label.team-name": "Название команды",
|
||||
"label.team-owner": "Владелец команды",
|
||||
"label.team-view-only": "Team view only",
|
||||
"label.team-websites": "Team websites",
|
||||
"label.team-view-only": "Только командный просмотр",
|
||||
"label.team-websites": "Веб-сайты команды",
|
||||
"label.teams": "Команды",
|
||||
"label.theme": "Тема",
|
||||
"label.this-month": "Этот месяц",
|
||||
|
|
@ -199,62 +199,62 @@
|
|||
"label.title": "Заголовок",
|
||||
"label.today": "Сегодня",
|
||||
"label.toggle-charts": "Показать/скрыть графики",
|
||||
"label.total": "Total",
|
||||
"label.total-records": "Total records",
|
||||
"label.total": "Всего",
|
||||
"label.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.transactions": "Транзакции",
|
||||
"label.transfer": "Передача",
|
||||
"label.transfer-website": "Передать сайт",
|
||||
"label.true": "Правда",
|
||||
"label.type": "Тип",
|
||||
"label.unique": "Уникальный",
|
||||
"label.unique-visitors": "Уникальные посетители",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "Уникальные клиенты",
|
||||
"label.unknown": "Неизвестно",
|
||||
"label.untitled": "Untitled",
|
||||
"label.update": "Update",
|
||||
"label.untitled": "Без названия",
|
||||
"label.update": "Обновление",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "Пользователь",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "Собственность пользователя",
|
||||
"label.username": "Имя пользователя",
|
||||
"label.users": "Пользователи",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.value": "Value",
|
||||
"label.utm-description": "Отслеживайте свои кампании с помощью UTM-параметров.",
|
||||
"label.value": "Значение",
|
||||
"label.view": "Просмотреть",
|
||||
"label.view-details": "Посмотреть детали",
|
||||
"label.view-only": "View only",
|
||||
"label.view-only": "Только просмотр",
|
||||
"label.views": "Просмотры",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.views-per-visit": "Просмотров за посещение",
|
||||
"label.visit-duration": "Среднее время посещения",
|
||||
"label.visitors": "Посетители",
|
||||
"label.visits": "Visits",
|
||||
"label.website": "Website",
|
||||
"label.visits": "Посещения",
|
||||
"label.website": "Сайт",
|
||||
"label.website-id": "ID сайта",
|
||||
"label.websites": "Сайты",
|
||||
"label.window": "Window",
|
||||
"label.window": "Окно",
|
||||
"label.yesterday": "Вчера",
|
||||
"message.action-confirmation": "Type {confirmation} in the box below to confirm.",
|
||||
"message.action-confirmation": "Введите {confirmation} в поле ниже, чтобы подтвердить.",
|
||||
"message.active-users": "{x} текущих посетителей",
|
||||
"message.collected-data": "Collected data",
|
||||
"message.collected-data": "Собранные данные",
|
||||
"message.confirm-delete": "Вы уверены, что хотите удалить {target}?",
|
||||
"message.confirm-leave": "Вы уверены, что хотите уйти {target}?",
|
||||
"message.confirm-remove": "Are you sure you want to remove {target}?",
|
||||
"message.confirm-remove": "Вы уверены, что хотите удалить {target}?",
|
||||
"message.confirm-reset": "Вы уверены, что хотите сбросить статистику {target}?",
|
||||
"message.delete-team-warning": "Deleting a team will also delete all team websites.",
|
||||
"message.delete-team-warning": "При удалении команды будут удалены и все ее веб-сайты.",
|
||||
"message.delete-website-warning": "Все связанные данные будут также удалены.",
|
||||
"message.error": "Что-то пошло не так.",
|
||||
"message.event-log": "{event} on {url}",
|
||||
"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": "A new version of Umami {version} is available!",
|
||||
"message.new-version-available": "Вышла новая версия Umami {version}!",
|
||||
"message.no-data-available": "Нет данных.",
|
||||
"message.no-event-data": "No event data is available.",
|
||||
"message.no-event-data": "Данные о событиях отсутствуют.",
|
||||
"message.no-match-password": "Пароли не совпадают",
|
||||
"message.no-results-found": "No results were found.",
|
||||
"message.no-results-found": "Результаты не найдены.",
|
||||
"message.no-team-websites": "У этой команды нет ни одного сайта.",
|
||||
"message.no-teams": "Вы не создали ни одной команды.",
|
||||
"message.no-users": "Нет пользователей.",
|
||||
|
|
@ -268,12 +268,12 @@
|
|||
"message.team-not-found": "Команда не найдена.",
|
||||
"message.team-websites-info": "Сайты могут просматривать все члены команды.",
|
||||
"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.transfer-team-website-to-user": "Перенести этот сайт в свой прфоиль?",
|
||||
"message.transfer-user-website-to-team": "Выберите команду, которой нужно передать этот сайт.",
|
||||
"message.transfer-website": "Передайте право владения сайтом своей учетной записи или другой команде.",
|
||||
"message.triggered-event": "Запущенное событие",
|
||||
"message.user-deleted": "Пользователь удален.",
|
||||
"message.viewed-page": "Viewed page",
|
||||
"message.viewed-page": "Просмотренная страница",
|
||||
"message.visitor-log": "Посетитель из {country} используя {browser} на {os} {device}",
|
||||
"message.visitors-dropped-off": "Visitors dropped off"
|
||||
"message.visitors-dropped-off": "Высадка посетителей"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@
|
|||
"label.filter-combined": "合并",
|
||||
"label.filter-raw": "原始",
|
||||
"label.filters": "筛选",
|
||||
"label.first-seen": "First seen",
|
||||
"label.first-seen": "首次出现",
|
||||
"label.funnel": "分析",
|
||||
"label.funnel-description": "了解用户的转换率和退出率。",
|
||||
"label.goal": "目标",
|
||||
|
|
@ -104,7 +104,7 @@
|
|||
"label.last-days": "最近 {x} 天",
|
||||
"label.last-hours": "最近 {x} 小时",
|
||||
"label.last-months": "最近 {x} 个月",
|
||||
"label.last-seen": "Last seen",
|
||||
"label.last-seen": "最后出现",
|
||||
"label.leave": "离开",
|
||||
"label.leave-team": "离开团队",
|
||||
"label.less-than": "少于",
|
||||
|
|
@ -161,9 +161,9 @@
|
|||
"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.revenue": "收入",
|
||||
"label.revenue-description": "查看您的收入随时间的变化。",
|
||||
"label.revenue-property": "收入值",
|
||||
"label.role": "角色",
|
||||
"label.run-query": "查询",
|
||||
"label.save": "保存",
|
||||
|
|
@ -202,21 +202,21 @@
|
|||
"label.total": "总数",
|
||||
"label.total-records": "总记录数",
|
||||
"label.tracking-code": "跟踪代码",
|
||||
"label.transactions": "Transactions",
|
||||
"label.transactions": "交易",
|
||||
"label.transfer": "转移",
|
||||
"label.transfer-website": "转移网站",
|
||||
"label.true": "是",
|
||||
"label.type": "类型",
|
||||
"label.unique": "独立",
|
||||
"label.unique-visitors": "独立访客",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "独特客户",
|
||||
"label.unknown": "未知",
|
||||
"label.untitled": "未命名",
|
||||
"label.update": "更新",
|
||||
"label.url": "网址",
|
||||
"label.urls": "网址",
|
||||
"label.user": "用户",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "用户属性",
|
||||
"label.username": "用户名",
|
||||
"label.users": "用户",
|
||||
"label.utm": "UTM",
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"label.access-code": "存取碼",
|
||||
"label.actions": "行動",
|
||||
"label.activity": "活動日誌",
|
||||
"label.actions": "行為",
|
||||
"label.activity": "活動紀錄",
|
||||
"label.add": "新增",
|
||||
"label.add-description": "新增描述",
|
||||
"label.add-member": "Add member",
|
||||
"label.add-step": "Add step",
|
||||
"label.add-member": "新增成員",
|
||||
"label.add-step": "新增步驟",
|
||||
"label.add-website": "新增網站",
|
||||
"label.admin": "管理員",
|
||||
"label.after": "之後",
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
"label.back": "返回",
|
||||
"label.before": "之前",
|
||||
"label.bounce-rate": "跳出率",
|
||||
"label.breakdown": "分解",
|
||||
"label.breakdown": "細項分析",
|
||||
"label.browser": "瀏覽器",
|
||||
"label.browsers": "瀏覽器",
|
||||
"label.cancel": "取消",
|
||||
|
|
@ -24,21 +24,21 @@
|
|||
"label.cities": "城市",
|
||||
"label.city": "城市",
|
||||
"label.clear-all": "全部清除",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "比較",
|
||||
"label.confirm": "確認",
|
||||
"label.confirm-password": "確認密碼",
|
||||
"label.contains": "包含",
|
||||
"label.continue": "繼續",
|
||||
"label.count": "Count",
|
||||
"label.count": "數量",
|
||||
"label.countries": "國家",
|
||||
"label.country": "國家",
|
||||
"label.create": "建立",
|
||||
"label.create-report": "建立報告",
|
||||
"label.create-report": "建立報表",
|
||||
"label.create-team": "建立團隊",
|
||||
"label.create-user": "建立使用者",
|
||||
"label.created": "已建立",
|
||||
"label.created-by": "Created By",
|
||||
"label.current": "Current",
|
||||
"label.created-by": "建立者",
|
||||
"label.current": "目前",
|
||||
"label.current-password": "目前密碼",
|
||||
"label.custom-range": "自訂範圍",
|
||||
"label.dashboard": "儀表板",
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
"label.day": "日",
|
||||
"label.default-date-range": "預設日期範圍",
|
||||
"label.delete": "刪除",
|
||||
"label.delete-report": "Delete report",
|
||||
"label.delete-report": "刪除報表",
|
||||
"label.delete-team": "刪除團隊",
|
||||
"label.delete-user": "刪除使用者",
|
||||
"label.delete-website": "刪除網站",
|
||||
|
|
@ -60,89 +60,89 @@
|
|||
"label.dismiss": "關閉",
|
||||
"label.does-not-contain": "不包含",
|
||||
"label.domain": "網域",
|
||||
"label.dropoff": "退出",
|
||||
"label.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.edit-member": "編輯成員",
|
||||
"label.enable-share-url": "啟用分享連結",
|
||||
"label.end-step": "結束步驟",
|
||||
"label.entry": "進入網址",
|
||||
"label.event": "事件",
|
||||
"label.event-data": "事件資料",
|
||||
"label.events": "事件",
|
||||
"label.exit": "Exit URL",
|
||||
"label.exit": "離開網址",
|
||||
"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.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.host": "主機名稱",
|
||||
"label.hosts": "主機名稱",
|
||||
"label.insights": "洞察",
|
||||
"label.insights-description": "透過使用區段和篩選器來深入探索你的數據",
|
||||
"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.journey": "使用者旅程",
|
||||
"label.journey-description": "瞭解使用者如何瀏覽您的網站。",
|
||||
"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.last-months": "最近 {x} 個月",
|
||||
"label.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.manage": "管理",
|
||||
"label.manager": "管理者",
|
||||
"label.max": "最大值",
|
||||
"label.member": "成員",
|
||||
"label.members": "成員",
|
||||
"label.min": "最小",
|
||||
"label.min": "最小值",
|
||||
"label.mobile": "行動裝置",
|
||||
"label.more": "更多",
|
||||
"label.my-account": "My account",
|
||||
"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.number-of-records": "{x} 筆紀錄",
|
||||
"label.ok": "OK",
|
||||
"label.os": "作業系統",
|
||||
"label.overview": "概覽",
|
||||
"label.overview": "總覽",
|
||||
"label.owner": "擁有者",
|
||||
"label.page-of": "頁面 {current} / {total}",
|
||||
"label.page-views": "頁面瀏覽",
|
||||
"label.pageTitle": "頁面標題",
|
||||
"label.pages": "頁面",
|
||||
"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.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": "查詢參數",
|
||||
|
|
@ -151,44 +151,44 @@
|
|||
"label.referrers": "參照來源",
|
||||
"label.refresh": "重新整理",
|
||||
"label.regenerate": "重新產生",
|
||||
"label.region": "區域",
|
||||
"label.regions": "區域",
|
||||
"label.region": "地區",
|
||||
"label.regions": "地區",
|
||||
"label.remove": "移除",
|
||||
"label.remove-member": "Remove member",
|
||||
"label.reports": "報告",
|
||||
"label.remove-member": "移除成員",
|
||||
"label.reports": "報表",
|
||||
"label.required": "必填",
|
||||
"label.reset": "重設",
|
||||
"label.reset-website": "重設網站",
|
||||
"label.retention": "保留",
|
||||
"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.revenue": "營收",
|
||||
"label.revenue-description": "查看您的營收趨勢。",
|
||||
"label.revenue-property": "營收屬性",
|
||||
"label.role": "角色",
|
||||
"label.run-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.search": "搜尋",
|
||||
"label.select": "選取",
|
||||
"label.select-date": "選取日期",
|
||||
"label.select-role": "選取角色",
|
||||
"label.select-website": "選取網站",
|
||||
"label.session": "工作階段",
|
||||
"label.sessions": "工作階段",
|
||||
"label.settings": "設定",
|
||||
"label.share-url": "分享網址",
|
||||
"label.share-url": "分享連結",
|
||||
"label.single-day": "單日",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.start-step": "起始步驟",
|
||||
"label.steps": "步驟",
|
||||
"label.sum": "總和",
|
||||
"label.tablet": "平板",
|
||||
"label.team": "團隊",
|
||||
"label.team-id": "團隊 ID",
|
||||
"label.team-manager": "Team manager",
|
||||
"label.team-manager": "團隊管理者",
|
||||
"label.team-member": "團隊成員",
|
||||
"label.team-name": "團隊名稱",
|
||||
"label.team-owner": "團隊擁有者",
|
||||
"label.team-view-only": "Team view only",
|
||||
"label.team-view-only": "團隊僅供檢視",
|
||||
"label.team-websites": "團隊網站",
|
||||
"label.teams": "團隊",
|
||||
"label.theme": "主題",
|
||||
|
|
@ -200,80 +200,80 @@
|
|||
"label.today": "今天",
|
||||
"label.toggle-charts": "切換圖表",
|
||||
"label.total": "總計",
|
||||
"label.total-records": "總記錄",
|
||||
"label.total-records": "紀錄總數",
|
||||
"label.tracking-code": "追蹤代碼",
|
||||
"label.transactions": "Transactions",
|
||||
"label.transfer": "Transfer",
|
||||
"label.transfer-website": "Transfer website",
|
||||
"label.transactions": "交易",
|
||||
"label.transfer": "轉移",
|
||||
"label.transfer-website": "轉移網站",
|
||||
"label.true": "是",
|
||||
"label.type": "類型",
|
||||
"label.unique": "獨立",
|
||||
"label.unique-visitors": "獨立訪客",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.unique": "不重複",
|
||||
"label.unique-visitors": "不重複訪客",
|
||||
"label.uniqueCustomers": "不重複客戶",
|
||||
"label.unknown": "未知",
|
||||
"label.untitled": "無標題",
|
||||
"label.update": "Update",
|
||||
"label.untitled": "未命名",
|
||||
"label.update": "更新",
|
||||
"label.url": "網址",
|
||||
"label.urls": "網址",
|
||||
"label.user": "使用者",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "使用者屬性",
|
||||
"label.username": "使用者名稱",
|
||||
"label.users": "使用者",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.utm-description": "透過 UTM 參數追蹤您的行銷活動。",
|
||||
"label.value": "值",
|
||||
"label.view": "檢視",
|
||||
"label.view-details": "檢視詳細資訊",
|
||||
"label.view-only": "僅供檢視",
|
||||
"label.views": "檢視",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.visit-duration": "平均造訪時間",
|
||||
"label.views": "瀏覽次數",
|
||||
"label.views-per-visit": "每次造訪的瀏覽次數",
|
||||
"label.visit-duration": "造訪時間",
|
||||
"label.visitors": "訪客",
|
||||
"label.visits": "Visits",
|
||||
"label.visits": "造訪次數",
|
||||
"label.website": "網站",
|
||||
"label.website-id": "網站 ID",
|
||||
"label.websites": "網站",
|
||||
"label.window": "視窗",
|
||||
"label.yesterday": "昨天",
|
||||
"message.action-confirmation": "Type {confirmation} in the box below to confirm.",
|
||||
"message.active-users": "目前有 {x} 個活躍的訪客",
|
||||
"message.collected-data": "Collected data",
|
||||
"message.action-confirmation": "請在下方欄位輸入 {confirmation} 以確認。",
|
||||
"message.active-users": "目前有 {x} 位訪客",
|
||||
"message.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.confirm-remove": "您確定要移除 {target} 嗎?",
|
||||
"message.confirm-reset": "您確定要重設 {target} 的統計資料嗎?",
|
||||
"message.delete-team-warning": "刪除團隊的同時也會刪除所有團隊的網站。",
|
||||
"message.delete-website-warning": "所有網站資料都將被刪除。",
|
||||
"message.error": "發生錯誤。",
|
||||
"message.event-log": "{event} 在 {url}",
|
||||
"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.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-users": "沒有任何使用者。",
|
||||
"message.no-websites-configured": "您尚未設定任何網站。",
|
||||
"message.page-not-found": "找不到頁面",
|
||||
"message.reset-website": "要重設此網站,請在下方的方框中輸入 {confirmation} 以確認。",
|
||||
"message.reset-website-warning": "此網站的所有統計將被刪除,但您的設定將保持不變。",
|
||||
"message.page-not-found": "找不到網頁",
|
||||
"message.reset-website": "要重設此網站的統計資料,請在下方欄位輸入 {confirmation} 以確認。",
|
||||
"message.reset-website-warning": "此網站的所有統計資料都將被刪除,但您的設定將保持不變。",
|
||||
"message.saved": "已儲存。",
|
||||
"message.share-url": "您的網站統計資料可以在以下網址公開檢視:",
|
||||
"message.team-already-member": "您已經是團隊的成員。",
|
||||
"message.share-url": "您的網站統計資料可在以下網址公開檢視:",
|
||||
"message.team-already-member": "您已是該團隊的成員。",
|
||||
"message.team-not-found": "找不到團隊。",
|
||||
"message.team-websites-info": "團隊的任何成員都可以檢視網站。",
|
||||
"message.tracking-code": "要追蹤此網站的統計,請將以下代碼放在您的 HTML 的 <head>...</head> 區段中。",
|
||||
"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.team-websites-info": "團隊中的所有成員都可以檢視網站。",
|
||||
"message.tracking-code": "要追蹤此網站的統計資料,請將以下程式碼放在您 HTML 的 <head>...</head> 區段中。",
|
||||
"message.transfer-team-website-to-user": "要將此網站轉移至您的帳號嗎?",
|
||||
"message.transfer-user-website-to-team": "請選擇要轉移此網站的團隊。",
|
||||
"message.transfer-website": "將網站所有權轉移至您的帳號或其他團隊。",
|
||||
"message.triggered-event": "已觸發的事件",
|
||||
"message.user-deleted": "使用者已刪除。",
|
||||
"message.viewed-page": "Viewed page",
|
||||
"message.viewed-page": "已瀏覽的網頁",
|
||||
"message.visitor-log": "來自 {country} 的訪客在 {device} 上的 {os} 使用 {browser} 瀏覽。",
|
||||
"message.visitors-dropped-off": "Visitors dropped off"
|
||||
"message.visitors-dropped-off": "訪客已離開"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import * as detect from '../detect';
|
||||
import { expect } from '@jest/globals';
|
||||
|
||||
const IP = '127.0.0.1';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import * as format from '../format';
|
||||
import { expect } from '@jest/globals';
|
||||
|
||||
test('parseTime', () => {
|
||||
expect(format.parseTime(86400 + 3600 + 60 + 1)).toEqual({
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Report } from '@prisma/client';
|
||||
import redis from '@umami/redis-client';
|
||||
import { getClient } from '@umami/redis-client';
|
||||
import debug from 'debug';
|
||||
import { PERMISSIONS, ROLE_PERMISSIONS, SHARE_TOKEN_HEADER, ROLES } from 'lib/constants';
|
||||
import { PERMISSIONS, ROLE_PERMISSIONS, SHARE_TOKEN_HEADER } from 'lib/constants';
|
||||
import { secret } from 'lib/crypto';
|
||||
import { NextApiRequest } from 'next';
|
||||
import { createSecureToken, ensureArray, getRandomChars, parseToken } from 'next-basics';
|
||||
|
|
@ -14,10 +14,12 @@ const cloudMode = process.env.CLOUD_MODE;
|
|||
export async function saveAuth(data: any, expire = 0) {
|
||||
const authKey = `auth:${getRandomChars(32)}`;
|
||||
|
||||
await redis.client.set(authKey, data);
|
||||
const redis = getClient();
|
||||
|
||||
await redis.set(authKey, data);
|
||||
|
||||
if (expire) {
|
||||
await redis.client.expire(authKey, expire);
|
||||
await redis.expire(authKey, expire);
|
||||
}
|
||||
|
||||
return createSecureToken({ authKey }, secret());
|
||||
|
|
|
|||
|
|
@ -68,6 +68,10 @@ function getDateSQL(field: string, unit: string, timezone?: string) {
|
|||
return `toDateTime(date_trunc('${unit}', ${field}))`;
|
||||
}
|
||||
|
||||
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}}`;
|
||||
|
||||
|
|
@ -229,6 +233,7 @@ export default {
|
|||
connect,
|
||||
getDateStringSQL,
|
||||
getDateSQL,
|
||||
getSearchSQL,
|
||||
getFilterQuery,
|
||||
getUTCString,
|
||||
parseFilters,
|
||||
|
|
|
|||
|
|
@ -239,12 +239,12 @@ 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})$/;
|
||||
/^(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 UUID_REGEX =
|
||||
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
|
||||
export const HOSTNAME_REGEX =
|
||||
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/;
|
||||
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-_]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-_]*[A-Za-z0-9])$/;
|
||||
export const IP_REGEX =
|
||||
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:(?:(:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/;
|
||||
export const DATETIME_REGEX =
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import moment from 'moment-timezone';
|
||||
import {
|
||||
addMinutes,
|
||||
addHours,
|
||||
|
|
@ -105,8 +104,17 @@ const DATE_FUNCTIONS = {
|
|||
},
|
||||
};
|
||||
|
||||
export function isValidTimezone(timezone: string) {
|
||||
try {
|
||||
Intl.DateTimeFormat(undefined, { timeZone: timezone });
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function getTimezone() {
|
||||
return moment.tz.guess();
|
||||
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||
}
|
||||
|
||||
export function parseDateValue(value: string) {
|
||||
|
|
|
|||
|
|
@ -67,6 +67,14 @@ function getRegionCode(country: string, region: string) {
|
|||
return region.includes('-') ? region : `${country}-${region}`;
|
||||
}
|
||||
|
||||
function safeDecodeCfHeader(s: string | undefined | null): string | undefined | null {
|
||||
if (s === undefined || s === null) {
|
||||
return s;
|
||||
}
|
||||
|
||||
return Buffer.from(s, 'latin1').toString('utf-8');
|
||||
}
|
||||
|
||||
export async function getLocation(ip: string, req: NextApiRequestCollect) {
|
||||
// Ignore local ips
|
||||
if (await isLocalhost(ip)) {
|
||||
|
|
@ -75,9 +83,9 @@ export async function getLocation(ip: string, req: NextApiRequestCollect) {
|
|||
|
||||
// Cloudflare headers
|
||||
if (req.headers['cf-ipcountry']) {
|
||||
const country = safeDecodeURIComponent(req.headers['cf-ipcountry']);
|
||||
const subdivision1 = safeDecodeURIComponent(req.headers['cf-region-code']);
|
||||
const city = safeDecodeURIComponent(req.headers['cf-ipcity']);
|
||||
const country = safeDecodeCfHeader(req.headers['cf-ipcountry']);
|
||||
const subdivision1 = safeDecodeCfHeader(req.headers['cf-region-code']);
|
||||
const city = safeDecodeCfHeader(req.headers['cf-ipcity']);
|
||||
|
||||
return {
|
||||
country,
|
||||
|
|
|
|||
|
|
@ -1,12 +1,14 @@
|
|||
import { getWebsiteSession, getWebsite } from 'queries';
|
||||
import { Website, Session } from '@prisma/client';
|
||||
import redis from '@umami/redis-client';
|
||||
import { getClient, redisEnabled } from '@umami/redis-client';
|
||||
|
||||
export async function fetchWebsite(websiteId: string): Promise<Website> {
|
||||
let website = null;
|
||||
|
||||
if (redis.enabled) {
|
||||
website = await redis.client.fetch(`website:${websiteId}`, () => getWebsite(websiteId), 86400);
|
||||
if (redisEnabled) {
|
||||
const redis = getClient();
|
||||
|
||||
website = await redis.fetch(`website:${websiteId}`, () => getWebsite(websiteId), 86400);
|
||||
} else {
|
||||
website = await getWebsite(websiteId);
|
||||
}
|
||||
|
|
@ -21,8 +23,10 @@ export async function fetchWebsite(websiteId: string): Promise<Website> {
|
|||
export async function fetchSession(websiteId: string, sessionId: string): Promise<Session> {
|
||||
let session = null;
|
||||
|
||||
if (redis.enabled) {
|
||||
session = await redis.client.fetch(
|
||||
if (redisEnabled) {
|
||||
const redis = getClient();
|
||||
|
||||
session = await redis.fetch(
|
||||
`session:${sessionId}`,
|
||||
() => getWebsiteSession(websiteId, sessionId),
|
||||
86400,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import cors from 'cors';
|
||||
import debug from 'debug';
|
||||
import redis from '@umami/redis-client';
|
||||
import { getClient, redisEnabled } from '@umami/redis-client';
|
||||
import { getAuthToken, parseShareToken } from 'lib/auth';
|
||||
import { ROLES } from 'lib/constants';
|
||||
import { secret } from 'lib/crypto';
|
||||
|
|
@ -54,8 +54,10 @@ export const useAuth = createMiddleware(async (req, res, next) => {
|
|||
|
||||
if (userId) {
|
||||
user = await getUser(userId);
|
||||
} else if (redis.enabled && authKey) {
|
||||
const key = await redis.client.get(authKey);
|
||||
} else if (redisEnabled && authKey) {
|
||||
const redis = getClient();
|
||||
|
||||
const key = await redis.get(authKey);
|
||||
|
||||
if (key?.userId) {
|
||||
user = await getUser(key.userId);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import debug from 'debug';
|
||||
import { Prisma } from '@prisma/client';
|
||||
import prisma from '@umami/prisma-client';
|
||||
import moment from 'moment-timezone';
|
||||
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';
|
||||
|
|
@ -75,7 +75,7 @@ function getDateSQL(field: string, unit: string, timezone?: string): string {
|
|||
|
||||
if (db === MYSQL) {
|
||||
if (timezone) {
|
||||
const tz = moment.tz(timezone).format('Z');
|
||||
const tz = formatInTimeZone(new Date(), timezone, 'yyyy-MM-dd HH:mm:ss');
|
||||
return `date_format(convert_tz(${field},'+00:00','${tz}'), '${MYSQL_DATE_FORMATS[unit]}')`;
|
||||
}
|
||||
return `date_format(${field}, '${MYSQL_DATE_FORMATS[unit]}')`;
|
||||
|
|
@ -90,7 +90,7 @@ function getDateWeeklySQL(field: string, timezone?: string) {
|
|||
}
|
||||
|
||||
if (db === MYSQL) {
|
||||
const tz = moment.tz(timezone).format('Z');
|
||||
const tz = formatInTimeZone(new Date(), timezone, 'yyyy-MM-dd HH:mm:ss');
|
||||
return `date_format(convert_tz(${field},'+00:00','${tz}'), '%w:%H')`;
|
||||
}
|
||||
}
|
||||
|
|
@ -119,11 +119,11 @@ function getTimestampDiffSQL(field1: string, field2: string): string {
|
|||
}
|
||||
}
|
||||
|
||||
function getSearchSQL(column: string): string {
|
||||
function getSearchSQL(column: string, param: string = 'search'): string {
|
||||
const db = getDatabaseType();
|
||||
const like = db === POSTGRESQL ? 'ilike' : 'like';
|
||||
|
||||
return `and ${column} ${like} {{search}}`;
|
||||
return `and ${column} ${like} {{${param}}`;
|
||||
}
|
||||
|
||||
function mapFilter(column: string, operator: string, name: string, type: string = '') {
|
||||
|
|
|
|||
|
|
@ -88,5 +88,5 @@ export async function getSession(req: NextApiRequestCollect): Promise<SessionDat
|
|||
}
|
||||
}
|
||||
|
||||
return { ...session, visitId: visitId };
|
||||
return { ...session, visitId };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import moment from 'moment-timezone';
|
||||
import * as yup from 'yup';
|
||||
import { isValidTimezone } from 'lib/date';
|
||||
import { UNIT_TYPES } from './constants';
|
||||
|
||||
export const TimezoneTest = yup
|
||||
|
|
@ -8,7 +8,7 @@ export const TimezoneTest = yup
|
|||
.test(
|
||||
'timezone',
|
||||
() => `Invalid timezone`,
|
||||
value => moment.tz.zone(value) !== null,
|
||||
value => isValidTimezone(value),
|
||||
);
|
||||
|
||||
export const UnitTypeTest = yup.string().test(
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import redis from '@umami/redis-client';
|
||||
import { redisEnabled } from '@umami/redis-client';
|
||||
import { saveAuth } from 'lib/auth';
|
||||
import { secret } from 'lib/crypto';
|
||||
import { useValidate } from 'lib/middleware';
|
||||
|
|
@ -49,7 +49,7 @@ export default async (
|
|||
const user = await getUserByUsername(username, { includePassword: true });
|
||||
|
||||
if (user && checkPassword(password, user.password)) {
|
||||
if (redis.enabled) {
|
||||
if (redisEnabled) {
|
||||
const token = await saveAuth({ userId: user.id });
|
||||
|
||||
return ok(res, { token, user });
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { methodNotAllowed, ok } from 'next-basics';
|
||||
import redis from '@umami/redis-client';
|
||||
import { getClient, redisEnabled } from '@umami/redis-client';
|
||||
import { useAuth } from 'lib/middleware';
|
||||
import { getAuthToken } from 'lib/auth';
|
||||
import { NextApiRequest, NextApiResponse } from 'next';
|
||||
|
|
@ -8,8 +8,10 @@ export default async (req: NextApiRequest, res: NextApiResponse) => {
|
|||
await useAuth(req, res);
|
||||
|
||||
if (req.method === 'POST') {
|
||||
if (redis.enabled) {
|
||||
await redis.client.del(getAuthToken(req));
|
||||
if (redisEnabled) {
|
||||
const redis = getClient();
|
||||
|
||||
await redis.del(getAuthToken(req));
|
||||
}
|
||||
|
||||
return ok(res);
|
||||
|
|
|
|||
|
|
@ -2,13 +2,13 @@ import { NextApiRequestAuth } from 'lib/types';
|
|||
import { useAuth } from 'lib/middleware';
|
||||
import { NextApiResponse } from 'next';
|
||||
import { badRequest, ok } from 'next-basics';
|
||||
import redis from '@umami/redis-client';
|
||||
import { redisEnabled } from '@umami/redis-client';
|
||||
import { saveAuth } from 'lib/auth';
|
||||
|
||||
export default async (req: NextApiRequestAuth, res: NextApiResponse) => {
|
||||
await useAuth(req, res);
|
||||
|
||||
if (redis.enabled && req.auth.user) {
|
||||
if (redisEnabled && req.auth.user) {
|
||||
const token = await saveAuth({ userId: req.auth.user.id }, 86400);
|
||||
|
||||
return ok(res, { user: req.auth.user, token });
|
||||
|
|
|
|||
|
|
@ -31,7 +31,10 @@ const schema = {
|
|||
.of(
|
||||
yup.object().shape({
|
||||
type: yup.string().required(),
|
||||
value: yup.string().required(),
|
||||
value: yup
|
||||
.string()
|
||||
.matches(/^[a-zA-Z0-9/*-_]+$/, 'Invalid URL pattern')
|
||||
.required(),
|
||||
}),
|
||||
)
|
||||
.min(2)
|
||||
|
|
|
|||
|
|
@ -102,6 +102,11 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
|
|||
await useSession(req, res);
|
||||
|
||||
const session = req.session;
|
||||
|
||||
if (!session?.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
const iat = Math.floor(new Date().getTime() / 1000);
|
||||
|
||||
// expire visitId after 30 minutes
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue