diff --git a/.github/workflows/cd-cloud.yml b/.github/workflows/cd-cloud.yml index b155624a..90a09dab 100644 --- a/.github/workflows/cd-cloud.yml +++ b/.github/workflows/cd-cloud.yml @@ -1,4 +1,4 @@ -name: Create docker images +name: Create docker images (cloud) on: push: diff --git a/.github/workflows/cd-manual.yml b/.github/workflows/cd-manual.yml deleted file mode 100644 index 1f8651fa..00000000 --- a/.github/workflows/cd-manual.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Create docker images (manual) - -on: - workflow_dispatch: - inputs: - version: - type: string - description: Version - required: true - -jobs: - build: - name: Build, push, and deploy - runs-on: ubuntu-latest - - strategy: - matrix: - db-type: [postgresql, mysql] - - 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: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }} - buildArgs: DATABASE_TYPE=${{ matrix.db-type }} - registry: ghcr.io - multiPlatform: true - platform: linux/amd64,linux/arm64 - 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: ${{ 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 }} - password: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index f67f51c3..a02e9900 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -1,50 +1,80 @@ name: Create docker images -on: [create] +on: + push: + tags: + - 'v*.*.*' + workflow_dispatch: jobs: build: name: Build, push, and deploy - if: ${{ startsWith(github.ref, 'refs/tags/v') }} runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write strategy: matrix: - db-type: [postgresql, mysql] + db-type: [postgresql] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v5 - - name: Set env - run: | - 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 + # Install cosign (for image signing) + - name: Install cosign + uses: sigstore/cosign-installer@v3 - - uses: mr-smithers-excellent/docker-build-push@v6 - name: Build & push Docker image to ghcr.io for ${{ matrix.db-type }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log into Docker Hub + if: github.repository == 'umami-software/umami' + uses: docker/login-action@v3 + with: + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Log into GHCR + uses: docker/login-action@v3 with: - image: umami - tags: ${{ env.tag_major }}, ${{ env.tag_minor }}, ${{ env.tag_patch }}, ${{ env.tag_latest }} - buildArgs: DATABASE_TYPE=${{ matrix.db-type }} registry: ghcr.io - multiPlatform: true - platform: linux/amd64,linux/arm64 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 }} + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v5 with: - image: umamisoftware/umami - 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 }} - password: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file + images: | + umamisoftware/umami,enable=${{ github.repository == 'umami-software/umami' }} + ghcr.io/${{ github.repository }} + flavor: | + latest=auto + prefix=${{ matrix.db-type }}- + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64,linux/arm64 + build-args: DATABASE_TYPE=${{ matrix.db-type }} + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Sign the published image digest + - name: Sign the published Docker image + env: + TAGS: ${{ steps.meta.outputs.tags }} + DIGEST: ${{ steps.build-and-push.outputs.digest }} + run: echo "${TAGS}" | xargs -I {} cosign sign --yes "{}@${DIGEST}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 835407b4..d2e027cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,20 +19,26 @@ jobs: matrix: include: - node-version: 18.18 + pnpm-version: 10 db-type: postgresql - node-version: 18.18 + pnpm-version: 10 db-type: mysql steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 # required so that setup-node will work + with: + version: ${{ matrix.pnpm-version }} + run_install: false - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - cache: 'yarn' + cache: 'pnpm' env: DATABASE_TYPE: ${{ matrix.db-type }} - - run: npm install --global yarn - - run: yarn install - - run: yarn test - - run: yarn build + - run: npm install --global pnpm + - run: pnpm install + - run: pnpm test + - run: pnpm build diff --git a/.github/workflows/delete-untagged-images.yml b/.github/workflows/delete-untagged-images.yml new file mode 100644 index 00000000..a23a1bd2 --- /dev/null +++ b/.github/workflows/delete-untagged-images.yml @@ -0,0 +1,22 @@ +name: Delete untagged GHCR images + +on: + workflow_dispatch: # Run manually from the Actions tab + +jobs: + cleanup: + name: Delete all untagged images + runs-on: ubuntu-latest + + permissions: + packages: write + contents: read + + steps: + - name: Delete untagged GHCR images + uses: actions/delete-package-versions@v5 + with: + package-name: "umami" # 👈 change if your GHCR package name differs + package-type: "container" + delete-only-untagged-versions: true + min-versions-to-keep: 0 diff --git a/.gitignore b/.gitignore index 70a1e193..9cf14dd6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules .pnp .pnp.js +.pnpm-store # testing /coverage diff --git a/README.md b/README.md index cf84d762..fcbe856f 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ A detailed getting started guide can be found at [umami.is/docs](https://umami.i ```bash git clone https://github.com/umami-software/umami.git cd umami -npm install +pnpm install ``` ### Configure Umami @@ -64,7 +64,7 @@ mysql://username:mypassword@localhost:3306/mydb ### Build the Application ```bash -npm run build +pnpm run build ``` _The build step will create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**._ @@ -72,7 +72,7 @@ _The build step will create tables in your database if you are installing for th ### Start the Application ```bash -npm run start +pnpm run start ``` _By default, this will launch the application on `http://localhost:3000`. You will need to either [proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) requests from your web server or change the [port](https://nextjs.org/docs/api-reference/cli#production) to serve the application directly._ @@ -107,8 +107,8 @@ To get the latest features, simply do a pull, install any new dependencies, and ```bash git pull -npm install -npm run build +pnpm install +pnpm run build ``` To update the Docker image, simply pull the new images and rebuild: diff --git a/cypress/e2e/api-website.cy.ts b/cypress/e2e/api-website.cy.ts index 7f7d17c3..cd336bda 100644 --- a/cypress/e2e/api-website.cy.ts +++ b/cypress/e2e/api-website.cy.ts @@ -149,6 +149,21 @@ describe('Website API tests', () => { }); }); + it('Updates a website with only shareId.', () => { + cy.request({ + method: 'POST', + url: `/api/websites/${websiteId}`, + headers: { + 'Content-Type': 'application/json', + Authorization: Cypress.env('authorization'), + }, + body: { shareId: 'ABCDEF' }, + }).then(response => { + expect(response.status).to.eq(200); + expect(response.body).to.have.property('shareId', 'ABCDEF'); + }); + }); + it('Resets a website by removing all data related to the website.', () => { cy.request({ method: 'POST', diff --git a/docker-compose.yml b/docker-compose.yml index 7b51db66..9fb3473c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: umami: image: ghcr.io/umami-software/umami:postgresql-latest ports: - - "3000:3000" + - '3000:3000' environment: DATABASE_URL: postgresql://umami:umami@db:5432/umami DATABASE_TYPE: postgresql @@ -14,7 +14,7 @@ services: init: true restart: always healthcheck: - test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"] + test: ['CMD-SHELL', 'curl http://localhost:3000/api/heartbeat'] interval: 5s timeout: 5s retries: 5 @@ -28,7 +28,7 @@ services: - umami-db-data:/var/lib/postgresql/data restart: always healthcheck: - test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}'] interval: 5s timeout: 5s retries: 5 diff --git a/package.json b/package.json index 4e775a59..8b7b31fe 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "kafkajs": "^2.1.0", "maxmind": "^4.3.24", "md5": "^2.3.0", - "next": "15.3.3", + "next": "15.4.7", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f5e4bef..f962ce3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,8 +123,8 @@ importers: specifier: ^2.3.0 version: 2.3.0 next: - specifier: 15.3.3 - version: 15.3.3(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.4.7 + version: 15.4.7(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) node-fetch: specifier: ^3.2.8 version: 3.3.2 @@ -1317,8 +1317,8 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} @@ -1589,124 +1589,128 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1826,56 +1830,56 @@ packages: resolution: {integrity: sha512-F+HiQaUpISBmooALpwDULoCCwUhI6MugEEBstjuxOL2rh2ROFhK4abv87f4GxVXRSmw0AtXAp2eiP8vHcZ3NKQ==} engines: {node: '>=18.0.0'} - '@next/env@15.3.3': - resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} + '@next/env@15.4.7': + resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} '@next/eslint-plugin-next@14.2.30': resolution: {integrity: sha512-mvVsMIutMxQ4NGZEMZ1kiBNc+la8Xmlk30bKUmCPQz2eFkmsLv54Mha8QZarMaCtSPkkFA1TMD+FIZk0l/PpzA==} - '@next/swc-darwin-arm64@15.3.3': - resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} + '@next/swc-darwin-arm64@15.4.7': + resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.3': - resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} + '@next/swc-darwin-x64@15.4.7': + resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.3': - resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} + '@next/swc-linux-arm64-gnu@15.4.7': + resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.3': - resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} + '@next/swc-linux-arm64-musl@15.4.7': + resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.3': - resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} + '@next/swc-linux-x64-gnu@15.4.7': + resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.3': - resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} + '@next/swc-linux-x64-musl@15.4.7': + resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.3': - resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} + '@next/swc-win32-arm64-msvc@15.4.7': + resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.3': - resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} + '@next/swc-win32-x64-msvc@15.4.7': + resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2151,9 +2155,6 @@ packages: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -2802,10 +2803,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} engines: {node: '>=6'} @@ -2845,8 +2842,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2957,13 +2954,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -3307,8 +3297,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -4129,9 +4119,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -4940,13 +4927,13 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.3.3: - resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} + next@15.4.7: + resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -6033,8 +6020,8 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: @@ -6080,9 +6067,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -6161,10 +6145,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -7885,7 +7865,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true @@ -8145,90 +8125,93 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@img/sharp-darwin-arm64@0.34.3': + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-arm64': 1.2.3 optional: true - '@img/sharp-darwin-x64@0.34.3': + '@img/sharp-darwin-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': + '@img/sharp-libvips-darwin-arm64@1.2.3': optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': + '@img/sharp-libvips-darwin-x64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': + '@img/sharp-libvips-linux-arm64@1.2.3': optional: true - '@img/sharp-libvips-linux-arm@1.2.0': + '@img/sharp-libvips-linux-arm@1.2.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': + '@img/sharp-libvips-linux-ppc64@1.2.3': optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': + '@img/sharp-libvips-linux-s390x@1.2.3': optional: true - '@img/sharp-libvips-linux-x64@1.2.0': + '@img/sharp-libvips-linux-x64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.3': optional: true - '@img/sharp-linux-arm64@0.34.3': + '@img/sharp-linux-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.3 optional: true - '@img/sharp-linux-arm@0.34.3': + '@img/sharp-linux-arm@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.3 optional: true - '@img/sharp-linux-ppc64@0.34.3': + '@img/sharp-linux-ppc64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.3 optional: true - '@img/sharp-linux-s390x@0.34.3': + '@img/sharp-linux-s390x@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.3 optional: true - '@img/sharp-linux-x64@0.34.3': + '@img/sharp-linux-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.3 optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': + '@img/sharp-linuxmusl-arm64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 optional: true - '@img/sharp-linuxmusl-x64@0.34.3': + '@img/sharp-linuxmusl-x64@0.34.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 optional: true - '@img/sharp-wasm32@0.34.3': + '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-win32-arm64@0.34.3': + '@img/sharp-win32-arm64@0.34.4': optional: true - '@img/sharp-win32-ia32@0.34.3': + '@img/sharp-win32-ia32@0.34.4': optional: true - '@img/sharp-win32-x64@0.34.3': + '@img/sharp-win32-x64@0.34.4': optional: true '@isaacs/balanced-match@4.0.1': {} @@ -8447,40 +8430,40 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.0 optional: true '@netlify/plugin-nextjs@5.11.6': {} - '@next/env@15.3.3': {} + '@next/env@15.4.7': {} '@next/eslint-plugin-next@14.2.30': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@15.3.3': + '@next/swc-darwin-arm64@15.4.7': optional: true - '@next/swc-darwin-x64@15.3.3': + '@next/swc-darwin-x64@15.4.7': optional: true - '@next/swc-linux-arm64-gnu@15.3.3': + '@next/swc-linux-arm64-gnu@15.4.7': optional: true - '@next/swc-linux-arm64-musl@15.3.3': + '@next/swc-linux-arm64-musl@15.4.7': optional: true - '@next/swc-linux-x64-gnu@15.3.3': + '@next/swc-linux-x64-gnu@15.4.7': optional: true - '@next/swc-linux-x64-musl@15.3.3': + '@next/swc-linux-x64-musl@15.4.7': optional: true - '@next/swc-win32-arm64-msvc@15.3.3': + '@next/swc-win32-arm64-msvc@15.4.7': optional: true - '@next/swc-win32-x64-msvc@15.3.3': + '@next/swc-win32-x64-msvc@15.4.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8772,8 +8755,6 @@ snapshots: - supports-color - typescript - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -9349,7 +9330,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -9496,7 +9477,7 @@ snapshots: browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 electron-to-chromium: 1.5.187 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -9520,10 +9501,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - cachedir@2.4.0: {} call-bind-apply-helpers@1.0.2: @@ -9565,11 +9542,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001743: {} caseless@0.12.0: {} @@ -9663,18 +9640,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - colord@2.9.3: {} colorette@1.4.0: {} @@ -10075,7 +10040,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: + detect-libc@2.1.0: optional: true detect-newline@3.1.0: {} @@ -11100,9 +11065,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: - optional: true - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -12087,27 +12049,25 @@ snapshots: natural-compare@1.4.0: {} - next@15.3.3(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.4.7(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@next/env': 15.3.3 - '@swc/counter': 0.1.3 + '@next/env': 15.4.7 '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) styled-jsx: 5.1.6(@babel/core@7.28.0)(react@19.1.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.3 - '@next/swc-darwin-x64': 15.3.3 - '@next/swc-linux-arm64-gnu': 15.3.3 - '@next/swc-linux-arm64-musl': 15.3.3 - '@next/swc-linux-x64-gnu': 15.3.3 - '@next/swc-linux-x64-musl': 15.3.3 - '@next/swc-win32-arm64-msvc': 15.3.3 - '@next/swc-win32-x64-msvc': 15.3.3 - sharp: 0.34.3 + '@next/swc-darwin-arm64': 15.4.7 + '@next/swc-darwin-x64': 15.4.7 + '@next/swc-linux-arm64-gnu': 15.4.7 + '@next/swc-linux-arm64-musl': 15.4.7 + '@next/swc-linux-x64-gnu': 15.4.7 + '@next/swc-linux-x64-musl': 15.4.7 + '@next/swc-win32-arm64-msvc': 15.4.7 + '@next/swc-win32-x64-msvc': 15.4.7 + sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -13229,34 +13189,34 @@ snapshots: setimmediate@1.0.5: {} - sharp@0.34.3: + sharp@0.34.4: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 + '@img/colour': 1.0.0 + detect-libc: 2.1.0 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.3 - '@img/sharp-darwin-x64': 0.34.3 - '@img/sharp-libvips-darwin-arm64': 1.2.0 - '@img/sharp-libvips-darwin-x64': 1.2.0 - '@img/sharp-libvips-linux-arm': 1.2.0 - '@img/sharp-libvips-linux-arm64': 1.2.0 - '@img/sharp-libvips-linux-ppc64': 1.2.0 - '@img/sharp-libvips-linux-s390x': 1.2.0 - '@img/sharp-libvips-linux-x64': 1.2.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - '@img/sharp-linux-arm': 0.34.3 - '@img/sharp-linux-arm64': 0.34.3 - '@img/sharp-linux-ppc64': 0.34.3 - '@img/sharp-linux-s390x': 0.34.3 - '@img/sharp-linux-x64': 0.34.3 - '@img/sharp-linuxmusl-arm64': 0.34.3 - '@img/sharp-linuxmusl-x64': 0.34.3 - '@img/sharp-wasm32': 0.34.3 - '@img/sharp-win32-arm64': 0.34.3 - '@img/sharp-win32-ia32': 0.34.3 - '@img/sharp-win32-x64': 0.34.3 + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 optional: true shebang-command@1.2.0: @@ -13305,11 +13265,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - sisteransi@1.0.5: {} slash@3.0.0: {} @@ -13397,8 +13352,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamsearch@1.1.0: {} - string-argv@0.3.2: {} string-hash@1.1.3: {} diff --git a/public/intl/country/uz-UZ.json b/public/intl/country/uz-UZ.json new file mode 100644 index 00000000..0105597f --- /dev/null +++ b/public/intl/country/uz-UZ.json @@ -0,0 +1,251 @@ +{ + "AF": "Afg\u02bboniston", + "AX": "Aland orollari", + "AL": "Albaniya", + "US": "Amerika Qo\u2018shma Shtatlari", + "AS": "Amerika Samoasi", + "AD": "Andorra", + "AI": "Angilya", + "AO": "Angola", + "AQ": "Antarktida", + "AG": "Antigua va Barbuda", + "VI": "AQSH Virgin orollari", + "UM": "AQSH yondosh orollari", + "AR": "Argentina", + "AM": "Armaniston", + "AW": "Aruba", + "AU": "Avstraliya", + "AT": "Avstriya", + "BS": "Bagama orollari", + "BH": "Bahrayn", + "BD": "Bangladesh", + "BB": "Barbados", + "BY": "Belarus", + "BE": "Belgiya", + "BZ": "Beliz", + "BJ": "Benin", + "BM": "Bermuda orollari", + "AE": "Birlashgan Arab Amirliklari", + "BG": "Bolgariya", + "BO": "Boliviya", + "BQ": "Boneyr, Sint-Estatius va Saba", + "BA": "Bosniya va Gertsegovina", + "BW": "Botsvana", + "BR": "Braziliya", + "VG": "Britaniya Virgin orollari", + "IO": "Britaniyaning Hind okeanidagi hududi", + "BN": "Bruney", + "BF": "Burkina-Faso", + "BI": "Burundi", + "BT": "Butan", + "BV": "Buve oroli", + "GB": "Buyuk Britaniya", + "DK": "Daniya", + "DM": "Dominika", + "DO": "Dominikan Respublikasi", + "ET": "Efiopiya", + "EC": "Ekvador", + "GQ": "Ekvatorial Gvineya", + "ER": "Eritreya", + "IR": "Eron", + "EE": "Estoniya", + "PS": "Falastin hududlari", + "FO": "Farer orollari", + "FJ": "Fiji", + "PH": "Filippin", + "FI": "Finlandiya", + "FK": "Folklend orollari", + "FR": "Fransiya", + "GF": "Fransuz Gvianasi", + "TF": "Fransuz Janubiy hududlari", + "PF": "Fransuz Polineziyasi", + "GA": "Gabon", + "HT": "Gaiti", + "GM": "Gambiya", + "GH": "Gana", + "GY": "Gayana", + "DE": "Germaniya", + "GG": "Gernsi", + "GI": "Gibraltar", + "HN": "Gonduras", + "HK": "Gonkong (Xitoy MMH)", + "GD": "Grenada", + "GL": "Grenlandiya", + "GR": "Gretsiya", + "GE": "Gruziya", + "GU": "Guam", + "GP": "Gvadelupe", + "GT": "Gvatemala", + "GN": "Gvineya", + "GW": "Gvineya-Bisau", + "IN": "Hindiston", + "ID": "Indoneziya", + "JO": "Iordaniya", + "IE": "Irlandiya", + "IQ": "Iroq", + "IS": "Islandiya", + "ES": "Ispaniya", + "IL": "Isroil", + "IT": "Italiya", + "ZA": "Janubiy Afrika Respublikasi", + "GS": "Janubiy Georgiya va Janubiy Sendvich orollari", + "KR": "Janubiy Koreya", + "SS": "Janubiy Sudan", + "DZ": "Jazoir", + "JE": "Jersi", + "DJ": "Jibuti", + "CV": "Kabo-Verde", + "KH": "Kambodja", + "CM": "Kamerun", + "CA": "Kanada", + "KY": "Kayman orollari", + "KE": "Keniya", + "CY": "Kipr", + "KI": "Kiribati", + "CC": "Kokos (Kiling) orollari", + "CO": "Kolumbiya", + "KM": "Komor orollari", + "CG": "Kongo \u2013 Brazzavil", + "CD": "Kongo \u2013 Kinshasa", + "CR": "Kosta-Rika", + "CI": "Kot-d\u2019Ivuar", + "CU": "Kuba", + "CK": "Kuk orollari", + "CW": "Kyurasao", + "LA": "Laos", + "LV": "Latviya", + "LS": "Lesoto", + "LR": "Liberiya", + "LT": "Litva", + "LB": "Livan", + "LY": "Liviya", + "LI": "Lixtenshteyn", + "LU": "Lyuksemburg", + "MG": "Madagaskar", + "MO": "Makao (Xitoy MMH)", + "MW": "Malavi", + "MY": "Malayziya", + "MV": "Maldiv orollari", + "ML": "Mali", + "MT": "Malta", + "CF": "Markaziy Afrika Respublikasi", + "MA": "Marokash", + "MQ": "Martinika", + "MH": "Marshall orollari", + "MU": "Mavrikiy", + "MR": "Mavritaniya", + "YT": "Mayotta", + "MX": "Meksika", + "IM": "Men oroli", + "FM": "Mikroneziya", + "EG": "Misr", + "MD": "Moldova", + "MC": "Monako", + "MN": "Mongoliya", + "MS": "Montserrat", + "MZ": "Mozambik", + "SH": "Muqaddas Yelena oroli", + "MM": "Myanma (Birma)", + "NA": "Namibiya", + "NR": "Nauru", + "NP": "Nepal", + "NL": "Niderlandiya", + "NE": "Niger", + "NG": "Nigeriya", + "NI": "Nikaragua", + "NU": "Niue", + "NF": "Norfolk oroli", + "NO": "Norvegiya", + "AZ": "Ozarbayjon", + "PW": "Palau", + "PA": "Panama", + "PG": "Papua \u2013 Yangi Gvineya", + "PY": "Paragvay", + "PE": "Peru", + "PN": "Pitkern orollari", + "PK": "Pokiston", + "PL": "Polsha", + "PT": "Portugaliya", + "PR": "Puerto-Riko", + "QA": "Qatar", + "KG": "Qirg\u02bbiziston", + "KZ": "Qozog\u02bbiston", + "KW": "Quvayt", + "RE": "Reyunion", + "CX": "Rojdestvo oroli", + "RU": "Rossiya", + "RW": "Ruanda", + "RO": "Ruminiya", + "SV": "Salvador", + "WS": "Samoa", + "SM": "San-Marino", + "ST": "San-Tome va Prinsipi", + "SA": "Saudiya Arabistoni", + "BL": "Sen-Bartelemi", + "PM": "Sen-Pyer va Mikelon", + "SN": "Senegal", + "KN": "Sent-Kits va Nevis", + "LC": "Sent-Lyusiya", + "MF": "Sent-Martin", + "VC": "Sent-Vinsent va Grenadin", + "RS": "Serbiya", + "SC": "Seyshel orollari", + "SG": "Singapur", + "SX": "Sint-Marten", + "SK": "Slovakiya", + "SI": "Sloveniya", + "SB": "Solomon orollari", + "SO": "Somali", + "SD": "Sudan", + "SR": "Surinam", + "SY": "Suriya", + "SZ": "Svazilend", + "SL": "Syerra-Leone", + "TH": "Tailand", + "TZ": "Tanzaniya", + "TW": "Tayvan", + "TL": "Timor-Leste", + "TG": "Togo", + "TJ": "Tojikiston", + "TK": "Tokelau", + "TO": "Tonga", + "TT": "Trinidad va Tobago", + "TN": "Tunis", + "TR": "Turkiya", + "TM": "Turkmaniston", + "TC": "Turks va Kaykos orollari", + "TV": "Tuvalu", + "UG": "Uganda", + "UA": "Ukraina", + "OM": "Ummon", + "WF": "Uollis va Futuna", + "UY": "Urugvay", + "VU": "Vanuatu", + "VA": "Vatikan", + "VE": "Venesuela", + "HU": "Vengriya", + "VN": "Vyetnam", + "HM": "Xerd va Makdonald orollari", + "CN": "Xitoy", + "HR": "Xorvatiya", + "YE": "Yaman", + "JM": "Yamayka", + "NC": "Yangi Kaledoniya", + "NZ": "Yangi Zelandiya", + "JP": "Yaponiya", + "ZM": "Zambiya", + "ZW": "Zimbabve", + "UZ": "O\u02bbzbekiston", + "EH": "G\u2018arbiy Sahroi Kabir", + "KP": "Shimoliy Koreya", + "MK": "Shimoliy Makedoniya", + "MP": "Shimoliy Mariana orollari", + "SJ": "Shpitsbergen va Yan-Mayen", + "LK": "Shri-Lanka", + "SE": "Shvetsiya", + "CH": "Shveytsariya", + "TD": "Chad", + "ME": "Chernogoriya", + "CZ": "Chexiya", + "CL": "Chili" +} diff --git a/public/intl/language/uz-UZ.json b/public/intl/language/uz-UZ.json new file mode 100644 index 00000000..daacab88 --- /dev/null +++ b/public/intl/language/uz-UZ.json @@ -0,0 +1,611 @@ +{ + "ab": "abxazcha", + "ace": "Achinese", + "ach": "Acoli", + "ada": "Adangme", + "ady": "Adyghe", + "aa": "Afar", + "afh": "Afrihili", + "af": "afrikancha", + "agq": "ag\u2018emcha", + "ain": "Ainu", + "ak": "akancha", + "akk": "Akkadian", + "bss": "Akoose", + "akz": "Alabama", + "sq": "albancha", + "ale": "Aleut", + "arq": "Algerian Arabic", + "en_US": "American English", + "ase": "American Sign Language", + "am": "amxarcha", + "egy": "Ancient Egyptian", + "grc": "Ancient Greek", + "anp": "Angika", + "zh_Hant": "an\u02bcanaviy xitoycha", + "njo": "Ao Naga", + "ar": "arabcha", + "an": "Aragonese", + "arc": "Aramaic", + "aro": "Araona", + "arp": "Arapaho", + "arw": "Arawak", + "hy": "armancha", + "rup": "Aromanian", + "frp": "Arpitan", + "as": "assamcha", + "ast": "Asturian", + "asa": "asucha", + "cch": "Atsam", + "av": "Avaric", + "ae": "Avestan", + "en_AU": "Avstraliya inglizchasi", + "de_AT": "Avstriya olmonchasi", + "awa": "Awadhi", + "ay": "Aymara", + "bfq": "Badaga", + "ksf": "bafiycha", + "bfd": "Bafut", + "bqi": "Bakhtiari", + "ban": "Balinese", + "bal": "Baluchi", + "bm": "bambarcha", + "bax": "Bamun", + "bjn": "Banjar", + "bas": "Basaa", + "eu": "baskcha", + "bbc": "Batak Toba", + "bar": "Bavarian", + "bej": "Beja", + "be": "belaruscha", + "bem": "bembacha", + "bez": "benacha", + "bn": "bengalcha", + "bew": "Betawi", + "bho": "Bhojpuri", + "bik": "Bikol", + "bin": "Bini", + "my": "birmancha", + "bpy": "Bishnupriya", + "bi": "Bislama", + "byn": "Blin", + "zbl": "Blissymbols", + "brx": "bodocha", + "bg": "bolgarcha", + "ba": "boshqircha", + "bs": "bosniycha", + "brh": "Brahui", + "bra": "Braj", + "pt_BR": "Braziliya portugalchasi", + "br": "bretoncha", + "en_GB": "Britaniya inglizchasi", + "bug": "Buginese", + "bum": "Bulu", + "bua": "Buriat", + "cad": "Caddo", + "frc": "Cajun French", + "yue": "Cantonese", + "cps": "Capiznon", + "car": "Carib", + "cay": "Cayuga", + "ceb": "Cebuano", + "dtp": "Central Dusun", + "esu": "Central Yupik", + "shu": "Chadian Arabic", + "chg": "Chagatai", + "ch": "Chamorro", + "ce": "Chechen", + "chr": "cherokcha", + "cs": "chexcha", + "chy": "Cheyenne", + "chb": "Chibcha", + "cgg": "chigcha", + "qug": "Chimborazo Highland Quichua", + "chn": "Chinook Jargon", + "chp": "Chipewyan", + "cho": "Choctaw", + "cu": "Church Slavic", + "chk": "Chuukese", + "cv": "Chuvash", + "nwc": "Classical Newari", + "syc": "Classical Syriac", + "ksh": "Colognian", + "swb": "Comorian", + "cop": "Coptic", + "cr": "Cree", + "mus": "Creek", + "crh": "Crimean Turkish", + "dak": "Dakota", + "dar": "Dargwa", + "da": "datcha", + "dzg": "Dazaga", + "del": "Delaware", + "din": "Dinka", + "dv": "Divehi", + "doi": "Dogri", + "dgr": "Dogrib", + "dua": "dualcha", + "dyu": "Dyula", + "frs": "Eastern Frisian", + "efi": "Efik", + "arz": "Egyptian Arabic", + "eka": "Ekajuk", + "elx": "Elamite", + "ebu": "embucha", + "egl": "Emilian", + "myv": "Erzya", + "eo": "esperantocha", + "et": "estoncha", + "ewo": "Ewondo", + "ext": "Extremaduran", + "fan": "Fang", + "fat": "Fanti", + "fo": "farercha", + "fj": "fijcha", + "hif": "Fiji Hindi", + "fil": "filipincha", + "fi": "fincha", + "nl_BE": "flamandcha", + "fon": "Fon", + "fa": "forscha", + "gur": "Frafra", + "fr": "fransuzcha", + "fur": "Friulian", + "ff": "Fulah", + "gaa": "Ga", + "gag": "gagozcha", + "ht": "gaitcha", + "gl": "galitsiycha", + "gan": "Gan Chinese", + "lg": "gandcha", + "haw": "gavaycha", + "gay": "Gayo", + "gba": "Gbaya", + "gez": "Geez", + "aln": "Gheg Albanian", + "bbj": "Ghomala", + "fy": "g\u02bbarbiy friziancha", + "glk": "Gilaki", + "gil": "Gilbertese", + "gom": "Goan Konkani", + "nl": "gollandcha", + "gon": "Gondi", + "gn": "gorancha", + "gor": "Gorontalo", + "got": "Gothic", + "grb": "Grebo", + "ka": "gruzincha", + "gu": "gujoratcha", + "guz": "guzcha", + "gwi": "Gwich\u02bcin", + "hai": "Haida", + "hak": "Hakka Chinese", + "hz": "Herero", + "hil": "Hiligaynon", + "hi": "hindcha", + "ho": "Hiri Motu", + "hit": "Hittite", + "hmn": "Hmong", + "hup": "Hupa", + "iba": "Iban", + "ibb": "Ibibio", + "he": "ibroniy", + "io": "Ido", + "ig": "igbocha", + "ilo": "Iloko", + "smn": "inari semiycha", + "id": "indoneyzcha", + "en": "inglizcha", + "izh": "Ingrian", + "inh": "Ingush", + "ia": "Interlingua", + "ie": "Interlingue", + "iu": "inuktitutcha", + "ik": "Inupiaq", + "ga": "irlandcha", + "is": "islandcha", + "es": "ispancha", + "it": "italyancha", + "ee": "ivicha", + "jam": "Jamaican Creole English", + "sma": "janubiy semiycha", + "kaj": "Jju", + "jrb": "Judeo-Arabic", + "jpr": "Judeo-Persian", + "jut": "Jutish", + "kbd": "Kabardian", + "kea": "kabuverdiancha", + "kac": "Kachin", + "kgp": "Kaingang", + "kkj": "Kako", + "kl": "kalallisutcha", + "kln": "kalenjincha", + "xal": "Kalmyk", + "kam": "kambcha", + "fr_CA": "Kanada fransuzchasi", + "en_CA": "Kanada inglizchasi", + "kbl": "Kanembu", + "kn": "kannadcha", + "kr": "Kanuri", + "kaa": "Kara-Kalpak", + "krc": "Karachay-Balkar", + "krl": "Karelian", + "ks": "kashmircha", + "csb": "Kashubian", + "ca": "katalancha", + "kaw": "Kawi", + "ken": "Kenyang", + "kha": "Khasi", + "kho": "Khotanese", + "khw": "Khowar", + "ki": "kikuycha", + "kmb": "Kimbundu", + "krj": "Kinaray-a", + "rw": "kinyarvandcha", + "kiu": "Kirmanjki", + "tlh": "Klingon", + "bkm": "Kom", + "kv": "Komi", + "koi": "komi-permyakcha", + "kg": "Kongo", + "swc": "kongo svahiliycha", + "kok": "konkancha", + "ko": "koreyscha", + "kw": "kornishcha", + "kfo": "Koro", + "co": "korsiancha", + "ses": "koryaboro senniycha", + "kos": "Kosraean", + "avk": "Kotava", + "kpe": "Kpelle", + "kri": "Krio", + "kj": "Kuanyama", + "kum": "Kumyk", + "ku": "kurdcha", + "kru": "Kurukh", + "kut": "Kutenai", + "nmg": "kvaziycha", + "lad": "Ladino", + "lah": "Lahnda", + "lkt": "lakotcha", + "lam": "Lamba", + "lag": "langcha", + "lo": "laoscha", + "ltg": "Latgalian", + "lv": "latishcha", + "lzz": "Laz", + "lez": "Lezghian", + "lij": "Ligurian", + "li": "Limburgish", + "ln": "lingalcha", + "lfn": "Lingua Franca Nova", + "lzh": "Literary Chinese", + "lt": "litovcha", + "liv": "Livonian", + "jbo": "Lojban", + "lmo": "Lombard", + "es_419": "Lotin Amerika ispanchasi", + "la": "lotincha", + "nds": "Low German", + "sli": "Lower Silesian", + "loz": "Lozi", + "lu": "luba-katangcha", + "lua": "Luba-Lulua", + "lui": "Luiseno", + "smj": "luli semiycha", + "lun": "Lunda", + "luo": "luocha", + "luy": "luycha", + "lb": "lyuksemburgcha", + "mde": "Maba", + "jmc": "machamcha", + "mad": "Madurese", + "maf": "Mafa", + "mag": "Magahi", + "vmf": "Main-Franconian", + "mai": "Maithili", + "mak": "Makasar", + "mk": "makedoncha", + "mgh": "makuva-mittocha", + "mg": "malagasiycha", + "ml": "malayamcha", + "ms": "malaycha", + "mt": "maltacha", + "mnc": "Manchu", + "mdr": "Mandar", + "man": "Mandingo", + "mni": "Manipuri", + "mi": "maoriycha", + "arn": "mapuchiycha", + "kde": "maqondiy", + "mr": "maratcha", + "chm": "Mari", + "tzm": "markaziy atlas vaqt zonasi", + "mh": "Marshallese", + "mwr": "Marwari", + "mas": "masaycha", + "mzn": "Mazanderani", + "byv": "Medumba", + "es_MX": "Meksika ispanchasi", + "gv": "mencha", + "men": "Mende", + "mwv": "Mentawai", + "mer": "merucha", + "mgo": "metacha", + "mic": "Micmac", + "dum": "Middle Dutch", + "enm": "Middle English", + "frm": "Middle French", + "gmh": "Middle High German", + "mga": "Middle Irish", + "nan": "Min Nan Chinese", + "min": "Minangkabau", + "xmf": "Mingrelian", + "mwl": "Mirandese", + "lus": "Mizo", + "mn": "mo\u2018g\u2018ulcha", + "moh": "mohaukcha", + "mdf": "Moksha", + "ro_MD": "moldovan rumincha", + "lol": "Mongo", + "mfe": "morisyencha", + "ary": "Moroccan Arabic", + "mos": "Mossi", + "mul": "Multiple Languages", + "mua": "mundangcha", + "ttt": "Muslim Tat", + "mye": "Myene", + "naq": "namacha", + "na": "Nauru", + "nv": "Navajo", + "ng": "Ndonga", + "nap": "Neapolitan", + "de": "nemischa", + "ne": "nepalcha", + "new": "Newari", + "sba": "Ngambay", + "nnh": "Ngiemboon", + "jgo": "ngombcha", + "yrl": "Nheengatu", + "nia": "Nias", + "niu": "Niuean", + "nog": "Nogai", + "und": "noma\u02bclum til", + "frr": "Northern Frisian", + "nso": "Northern Sotho", + "nb": "norvegcha bokmal", + "nn": "norvegcha ninorsk", + "no": "Norwegian", + "nov": "Novial", + "nus": "noyrcha", + "nqo": "nqoancha", + "nym": "Nyamwezi", + "ny": "Nyanja", + "nyn": "nyankolcha", + "tog": "Nyasa Tonga", + "nyo": "Nyoro", + "nzi": "Nzima", + "oc": "Occitan", + "uz": "o\u02bbzbekcha", + "oj": "Ojibwa", + "ang": "Old English", + "fro": "Old French", + "goh": "Old High German", + "sga": "Old Irish", + "non": "Old Norse", + "peo": "Old Persian", + "pro": "Old Proven\u00e7al", + "or": "oriycha", + "om": "oromocha", + "osa": "Osage", + "os": "Ossetic", + "ota": "Ottoman Turkish", + "az": "ozarbayjoncha", + "pal": "Pahlavi", + "pfl": "Palatine German", + "pau": "Palauan", + "pi": "Pali", + "pam": "Pampanga", + "pag": "Pangasinan", + "pa": "panjobcha", + "pap": "Papiamento", + "pdc": "Pennsylvania German", + "phn": "Phoenician", + "pcd": "Picard", + "pms": "Piedmontese", + "pdt": "Plautdietsch", + "pon": "Pohnpeian", + "pl": "polyakcha", + "pnt": "Pontic", + "pt": "portugalcha", + "prg": "Prussian", + "ps": "pushtu tili", + "quc": "qichiancha", + "ky": "qirg\u02bbizcha", + "kab": "qobilcha", + "khq": "qoyra-chincha", + "kk": "qozoqcha", + "dsb": "quyi sorbcha", + "qu": "qvechuancha", + "raj": "Rajasthani", + "rap": "Rapanui", + "rar": "Rarotongan", + "rif": "Riffian", + "rgn": "Romagnol", + "rm": "romancha", + "rom": "Romany", + "rof": "rombacha", + "root": "Root", + "rtm": "Rotuman", + "rug": "Roviana", + "rwk": "ruandcha", + "ro": "rumincha", + "rn": "rundcha", + "ru": "ruscha", + "rue": "Rusyn", + "ssy": "Saho", + "sah": "Sakha", + "sam": "Samaritan Aramaic", + "saq": "samburcha", + "sm": "Samoan", + "sgs": "Samogitian", + "sad": "Sandawe", + "sg": "sangoancha", + "sbp": "sanguancha", + "sa": "sanskritcha", + "sat": "Santali", + "sc": "Sardinian", + "sas": "Sasak", + "sdc": "Sassarese Sardinian", + "stq": "Saterland Frisian", + "saz": "Saurashtra", + "sco": "Scots", + "gd": "Scottish Gaelic", + "sly": "Selayar", + "sel": "Selkup", + "see": "Seneca", + "seh": "seniycha", + "sr": "serbcha", + "sh": "Serbo-Croatian", + "srr": "Serer", + "sei": "Seri", + "ksb": "shambalacha", + "shn": "Shan", + "nd": "shimoliy ndebelcha", + "se": "shimoliy semiycha", + "sms": "shkolt semiycha", + "sn": "shoniycha", + "sv": "shvedcha", + "fr_CH": "Shvesariya fransuzchasi", + "de_CH": "Shvesariya olmonchasi", + "gsw": "shveysariya nemischasi", + "scn": "Sicilian", + "sid": "Sidamo", + "bla": "Siksika", + "szl": "Silesian", + "sd": "sindxiycha", + "si": "sinholcha", + "den": "Slave", + "sk": "slovakcha", + "sl": "slovencha", + "zh_Hans": "soddalashtirilgan xitoycha", + "xog": "sogancha", + "sog": "Sogdien", + "so": "somalicha", + "snk": "Soninke", + "ckb": "sorani kurd tili", + "azb": "South Azerbaijani", + "nr": "South Ndebele", + "alt": "Southern Altai", + "st": "Southern Sotho", + "srn": "Sranan Tongo", + "zgh": "standart marokash tamazit", + "suk": "Sukuma", + "sux": "Sumerian", + "su": "sundancha", + "sus": "Susu", + "sw": "svahilcha", + "ss": "Swati", + "syr": "Syriac", + "shi": "tachilgitcha", + "tl": "Tagalog", + "ty": "Tahitian", + "dav": "taitcha", + "tly": "Talysh", + "tmh": "Tamashek", + "ta": "tamilcha", + "trv": "Taroko", + "tt": "tatarcha", + "th": "taycha", + "te": "telugvancha", + "ter": "Tereno", + "teo": "tesoancha", + "tet": "Tetum", + "bo": "tibetcha", + "tig": "Tigre", + "ti": "tigrincha", + "zxx": "til tarkibi yo\u02bbq", + "tem": "Timne", + "tiv": "Tiv", + "tli": "Tlingit", + "tg": "tojikcha", + "tpi": "Tok Pisin", + "tkl": "Tokelau", + "to": "tongocha", + "fit": "Tornedalen Finnish", + "twq": "tosovoqcha", + "tkr": "Tsakhur", + "tsd": "Tsakonian", + "tsi": "Tsimshian", + "ts": "Tsonga", + "tn": "Tswana", + "tcy": "Tulu", + "tum": "Tumbuka", + "aeb": "Tunisian Arabic", + "tr": "turkcha", + "tk": "turkmancha", + "tru": "Turoyo", + "tvl": "Tuvalu", + "tyv": "Tuvinian", + "tw": "Twi", + "kcg": "Tyap", + "udm": "Udmurt", + "cy": "uelscha", + "uga": "Ugaritic", + "uk": "ukraincha", + "umb": "Umbundu", + "ur": "urducha", + "ug": "uyg\u02bburcha", + "vai": "vayancha", + "ve": "Venda", + "vec": "Venetian", + "hu": "vengrcha", + "vep": "Veps", + "vo": "Volap\u00fck", + "wo": "volofcha", + "vro": "V\u00f5ro", + "vot": "Votic", + "vun": "vunjoancha", + "vi": "vyetnamcha", + "wa": "Walloon", + "wae": "Walser", + "war": "Waray", + "wbp": "Warlpiri", + "was": "Washo", + "guc": "Wayuu", + "vls": "West Flemish", + "mrj": "Western Mari", + "wal": "Wolaytta", + "wuu": "Wu Chinese", + "ha": "xauscha", + "hsn": "Xiang Chinese", + "zh": "xitoycha", + "km": "xmercha", + "hr": "xorvatcha", + "xh": "xosancha", + "yav": "Yangben", + "yao": "Yao", + "yap": "Yapese", + "ja": "yaponcha", + "jv": "yavancha", + "ybb": "Yemba", + "es_ES": "Yevropa ispanchasi", + "pt_PT": "Yevropa portugalchasi", + "yi": "Yiddish", + "dyo": "yola-fonyicha", + "yo": "yorubcha", + "dz": "yovoncha", + "el": "yunoncha", + "hsb": "yuqori sorbcha", + "ar_001": "zamonavij standart arabcha", + "zap": "Zapotec", + "dje": "zarmacha", + "zza": "Zaza", + "zea": "Zeelandic", + "zen": "Zenaga", + "za": "Zhuang", + "ii": "zichuan yicha", + "gbz": "Zoroastrian Dari", + "zu": "zuluancha", + "zun": "Zuni" +} diff --git a/public/intl/messages/ar-SA.json b/public/intl/messages/ar-SA.json index da0109c0..922b7fbc 100644 --- a/public/intl/messages/ar-SA.json +++ b/public/intl/messages/ar-SA.json @@ -1766,7 +1766,7 @@ "message.reset-website-warning": [ { "type": 0, - "value": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تعيير كود التتبع" + "value": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تغيير كود التتبع" } ], "message.saved": [ diff --git a/public/intl/messages/es-ES.json b/public/intl/messages/es-ES.json index 540c9bbd..75c704c1 100644 --- a/public/intl/messages/es-ES.json +++ b/public/intl/messages/es-ES.json @@ -476,7 +476,7 @@ "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "Visto por primera vez" } ], "label.funnel": [ @@ -656,7 +656,7 @@ "label.last-seen": [ { "type": 0, - "value": "Last seen" + "value": "Visto por última vez" } ], "label.leave": [ @@ -789,7 +789,7 @@ "value": [ { "type": 0, - "value": "record" + "value": "registro" } ] }, @@ -797,7 +797,7 @@ "value": [ { "type": 0, - "value": "records" + "value": "registros" } ] } @@ -922,7 +922,7 @@ "label.properties": [ { "type": 0, - "value": "Properties" + "value": "Propiedades" } ], "label.property": [ @@ -1042,19 +1042,19 @@ "label.revenue": [ { "type": 0, - "value": "Revenue" + "value": "Ganancias" } ], "label.revenue-description": [ { "type": 0, - "value": "Look into your revenue across time." + "value": "Analice sus ganancias a lo largo del tiempo." } ], "label.revenue-property": [ { "type": 0, - "value": "Revenue Property" + "value": "Propiedad de ganancias" } ], "label.role": [ @@ -1114,7 +1114,7 @@ "label.session": [ { "type": 0, - "value": "Session" + "value": "Sesión" } ], "label.sessions": [ @@ -1288,7 +1288,7 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "Transacciones" } ], "label.transfer": [ @@ -1330,7 +1330,7 @@ "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "Clientes únicos" } ], "label.unknown": [ @@ -1372,7 +1372,7 @@ "label.user-property": [ { "type": 0, - "value": "User Property" + "value": "Propiedad de usuario" } ], "label.username": [ diff --git a/public/intl/messages/sl-SI.json b/public/intl/messages/sl-SI.json index ae11c067..fdacb887 100644 --- a/public/intl/messages/sl-SI.json +++ b/public/intl/messages/sl-SI.json @@ -32,13 +32,13 @@ "label.add-member": [ { "type": 0, - "value": "Add member" + "value": "Dodaj člana" } ], "label.add-step": [ { "type": 0, - "value": "Add step" + "value": "Dodaj korak" } ], "label.add-website": [ @@ -152,7 +152,7 @@ "label.compare": [ { "type": 0, - "value": "Compare" + "value": "Primerjaj" } ], "label.confirm": [ @@ -182,7 +182,7 @@ "label.count": [ { "type": 0, - "value": "Count" + "value": "Število" } ], "label.countries": [ @@ -200,7 +200,7 @@ "label.create": [ { "type": 0, - "value": "Create" + "value": "Ustvari" } ], "label.create-report": [ @@ -230,13 +230,13 @@ "label.created-by": [ { "type": 0, - "value": "Created By" + "value": "Ustvaril" } ], "label.current": [ { "type": 0, - "value": "Current" + "value": "Trenutno" } ], "label.current-password": [ @@ -296,7 +296,7 @@ "label.delete-report": [ { "type": 0, - "value": "Delete report" + "value": "Izbriši poročilo" } ], "label.delete-team": [ @@ -386,25 +386,25 @@ "label.edit-member": [ { "type": 0, - "value": "Edit member" + "value": "Uredi člana" } ], "label.enable-share-url": [ { "type": 0, - "value": "Uredi povezavo za deljenje" + "value": "Omogoči povezavo za deljenje" } ], "label.end-step": [ { "type": 0, - "value": "End Step" + "value": "Končni korak" } ], "label.entry": [ { "type": 0, - "value": "Entry URL" + "value": "Vstopni URL" } ], "label.event": [ @@ -428,7 +428,7 @@ "label.exit": [ { "type": 0, - "value": "Exit URL" + "value": "Izhodni URL" } ], "label.false": [ @@ -476,7 +476,7 @@ "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "Prvič viden" } ], "label.funnel": [ @@ -488,25 +488,25 @@ "label.funnel-description": [ { "type": 0, - "value": "Understand the conversion and drop-off rate of users." + "value": "Razumite stopnjo konverzije in osipa uporabnikov." } ], "label.goal": [ { "type": 0, - "value": "Goal" + "value": "Cilj" } ], "label.goals": [ { "type": 0, - "value": "Goals" + "value": "Cilji" } ], "label.goals-description": [ { "type": 0, - "value": "Track your goals for pageviews and events." + "value": "Spremljajte svoje cilje za oglede strani in dogodke." } ], "label.greater-than": [ @@ -524,13 +524,13 @@ "label.host": [ { "type": 0, - "value": "Host" + "value": "Gostitelj" } ], "label.hosts": [ { "type": 0, - "value": "Hosts" + "value": "Gostitelji" } ], "label.insights": [ @@ -542,7 +542,7 @@ "label.insights-description": [ { "type": 0, - "value": "Dive deeper into your data by using segments and filters." + "value": "Poglobite se v podatke z uporabo segmentov in filtrov." } ], "label.is": [ @@ -584,13 +584,13 @@ "label.journey": [ { "type": 0, - "value": "Journey" + "value": "Uporabniška pot" } ], "label.journey-description": [ { "type": 0, - "value": "Understand how users navigate through your website." + "value": "Razumite, kako uporabniki krmarijo po vašem spletnem mestu." } ], "label.language": [ @@ -642,7 +642,7 @@ "label.last-months": [ { "type": 0, - "value": "Last " + "value": "Zadnjih " }, { "type": 1, @@ -650,13 +650,13 @@ }, { "type": 0, - "value": " months" + "value": " mesecev" } ], "label.last-seen": [ { "type": 0, - "value": "Last seen" + "value": "Nazadnje viden" } ], "label.leave": [ @@ -698,13 +698,13 @@ "label.manage": [ { "type": 0, - "value": "Manage" + "value": "Upravljaj" } ], "label.manager": [ { "type": 0, - "value": "Manager" + "value": "Upravitelj" } ], "label.max": [ @@ -716,7 +716,7 @@ "label.member": [ { "type": 0, - "value": "Member" + "value": "Član" } ], "label.members": [ @@ -746,7 +746,7 @@ "label.my-account": [ { "type": 0, - "value": "My account" + "value": "Moj račun" } ], "label.my-websites": [ @@ -876,13 +876,13 @@ "label.path": [ { "type": 0, - "value": "Path" + "value": "Pot" } ], "label.paths": [ { "type": 0, - "value": "Paths" + "value": "Poti" } ], "label.powered-by": [ @@ -898,19 +898,19 @@ "label.previous": [ { "type": 0, - "value": "Previous" + "value": "Prejšnji" } ], "label.previous-period": [ { "type": 0, - "value": "Previous period" + "value": "Prejšnje obdobje" } ], "label.previous-year": [ { "type": 0, - "value": "Previous year" + "value": "Prejšnje leto" } ], "label.profile": [ @@ -922,13 +922,13 @@ "label.properties": [ { "type": 0, - "value": "Properties" + "value": "Lastnosti" } ], "label.property": [ { "type": 0, - "value": "Property" + "value": "Lastnost" } ], "label.queries": [ @@ -1000,7 +1000,7 @@ "label.remove-member": [ { "type": 0, - "value": "Remove member" + "value": "Odstrani člana" } ], "label.reports": [ @@ -1036,25 +1036,25 @@ "label.retention-description": [ { "type": 0, - "value": "Measure your website stickiness by tracking how often users return." + "value": "Merite uporabnikovo zadržanost s sledenjem, kako pogosto se vračajo." } ], "label.revenue": [ { "type": 0, - "value": "Revenue" + "value": "Prihodki" } ], "label.revenue-description": [ { "type": 0, - "value": "Look into your revenue across time." + "value": "Preglejte svoje prihodke skozi čas." } ], "label.revenue-property": [ { "type": 0, - "value": "Revenue Property" + "value": "Lastnost prihodkov" } ], "label.role": [ @@ -1084,13 +1084,13 @@ "label.search": [ { "type": 0, - "value": "Search" + "value": "Išči" } ], "label.select": [ { "type": 0, - "value": "Select" + "value": "Izberi" } ], "label.select-date": [ @@ -1102,7 +1102,7 @@ "label.select-role": [ { "type": 0, - "value": "Select role" + "value": "Izberi vlogo" } ], "label.select-website": [ @@ -1114,7 +1114,7 @@ "label.session": [ { "type": 0, - "value": "Session" + "value": "Seja" } ], "label.sessions": [ @@ -1144,13 +1144,13 @@ "label.start-step": [ { "type": 0, - "value": "Start Step" + "value": "Začetni korak" } ], "label.steps": [ { "type": 0, - "value": "Steps" + "value": "Koraki" } ], "label.sum": [ @@ -1180,7 +1180,7 @@ "label.team-manager": [ { "type": 0, - "value": "Team manager" + "value": "Upravitelj ekipe" } ], "label.team-member": [ @@ -1204,7 +1204,7 @@ "label.team-view-only": [ { "type": 0, - "value": "Team view only" + "value": "Ekipa samo za ogled" } ], "label.team-websites": [ @@ -1468,7 +1468,7 @@ "label.websites": [ { "type": 0, - "value": "Spletnih mest" + "value": "Spletna mesta" } ], "label.window": [ @@ -1486,7 +1486,7 @@ "message.action-confirmation": [ { "type": 0, - "value": "Type " + "value": "Za potrditev v spodnje polje vnesite " }, { "type": 1, @@ -1494,7 +1494,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": "." } ], "message.active-users": [ @@ -1534,7 +1534,7 @@ "message.collected-data": [ { "type": 0, - "value": "Collected data" + "value": "Zbrani podatki" } ], "message.confirm-delete": [ @@ -1568,7 +1568,7 @@ "message.confirm-remove": [ { "type": 0, - "value": "Are you sure you want to remove " + "value": "Ali ste prepričani, da želite odstraniti " }, { "type": 1, @@ -1596,7 +1596,7 @@ "message.delete-team-warning": [ { "type": 0, - "value": "Deleting a team will also delete all team websites." + "value": "Brisanje ekipe bo izbrisalo tudi vsa spletna mesta ekipe." } ], "message.delete-website-warning": [ @@ -1792,25 +1792,25 @@ "message.transfer-team-website-to-user": [ { "type": 0, - "value": "Transfer this website to your account?" + "value": "Želite prenesti to spletno mesto v svoj račun?" } ], "message.transfer-user-website-to-team": [ { "type": 0, - "value": "Select the team to transfer this website to." + "value": "Izberite ekipo, na katero želite prenesti to spletno mesto." } ], "message.transfer-website": [ { "type": 0, - "value": "Transfer website ownership to your account or another team." + "value": "Prenesite lastništvo spletnega mesta na svoj račun ali drugo ekipo." } ], "message.triggered-event": [ { "type": 0, - "value": "Triggered event" + "value": "Sprožen dogodek" } ], "message.user-deleted": [ @@ -1822,7 +1822,7 @@ "message.viewed-page": [ { "type": 0, - "value": "Viewed page" + "value": "Ogledana stran" } ], "message.visitor-log": [ @@ -1862,7 +1862,7 @@ "message.visitors-dropped-off": [ { "type": 0, - "value": "Visitors dropped off" + "value": "Osip obiskovalcev" } ] } diff --git a/public/intl/messages/uz-UZ.json b/public/intl/messages/uz-UZ.json new file mode 100644 index 00000000..3697ff1b --- /dev/null +++ b/public/intl/messages/uz-UZ.json @@ -0,0 +1,1858 @@ +{ + "label.access-code": [ + { + "type": 0, + "value": "Kirish kodi" + } + ], + "label.actions": [ + { + "type": 0, + "value": "Amallar" + } + ], + "label.activity": [ + { + "type": 0, + "value": "Faoliyat" + } + ], + "label.add": [ + { + "type": 0, + "value": "Qoʻshish" + } + ], + "label.add-description": [ + { + "type": 0, + "value": "Tavsif qoʻshish" + } + ], + "label.add-member": [ + { + "type": 0, + "value": "A'zo qoʻshish" + } + ], + "label.add-step": [ + { + "type": 0, + "value": "Qadam qoʻshish" + } + ], + "label.add-website": [ + { + "type": 0, + "value": "Veb-sayt qoʻshish" + } + ], + "label.admin": [ + { + "type": 0, + "value": "Administrator" + } + ], + "label.after": [ + { + "type": 0, + "value": "Keyin" + } + ], + "label.all": [ + { + "type": 0, + "value": "Barchasi" + } + ], + "label.all-time": [ + { + "type": 0, + "value": "Barcha vaqtlar" + } + ], + "label.analytics": [ + { + "type": 0, + "value": "Tahlil" + } + ], + "label.average": [ + { + "type": 0, + "value": "Oʻrtacha" + } + ], + "label.back": [ + { + "type": 0, + "value": "Orqaga" + } + ], + "label.before": [ + { + "type": 0, + "value": "Oldin" + } + ], + "label.bounce-rate": [ + { + "type": 0, + "value": "Chiqib ketish darajasi" + } + ], + "label.breakdown": [ + { + "type": 0, + "value": "Tahlil" + } + ], + "label.browser": [ + { + "type": 0, + "value": "Brauzer" + } + ], + "label.browsers": [ + { + "type": 0, + "value": "Brauzerlar" + } + ], + "label.cancel": [ + { + "type": 0, + "value": "Bekor qilish" + } + ], + "label.change-password": [ + { + "type": 0, + "value": "Parolni oʻzgartirish" + } + ], + "label.cities": [ + { + "type": 0, + "value": "Shaharlar" + } + ], + "label.city": [ + { + "type": 0, + "value": "Shahar" + } + ], + "label.clear-all": [ + { + "type": 0, + "value": "Barchasini tozalash" + } + ], + "label.compare": [ + { + "type": 0, + "value": "Taqqoslash" + } + ], + "label.confirm": [ + { + "type": 0, + "value": "Tasdiqlash" + } + ], + "label.confirm-password": [ + { + "type": 0, + "value": "Parolni tasdiqlash" + } + ], + "label.contains": [ + { + "type": 0, + "value": "Oʻz ichiga oladi" + } + ], + "label.continue": [ + { + "type": 0, + "value": "Davom etish" + } + ], + "label.count": [ + { + "type": 0, + "value": "Soni" + } + ], + "label.countries": [ + { + "type": 0, + "value": "Davlatlar" + } + ], + "label.country": [ + { + "type": 0, + "value": "Davlat" + } + ], + "label.create": [ + { + "type": 0, + "value": "Yaratish" + } + ], + "label.create-report": [ + { + "type": 0, + "value": "Hisobot yaratish" + } + ], + "label.create-team": [ + { + "type": 0, + "value": "Jamoa yaratish" + } + ], + "label.create-user": [ + { + "type": 0, + "value": "Foydalanuvchi yaratish" + } + ], + "label.created": [ + { + "type": 0, + "value": "Yaratilgan" + } + ], + "label.created-by": [ + { + "type": 0, + "value": "Kim tomonidan yaratilgan" + } + ], + "label.current": [ + { + "type": 0, + "value": "Joriy" + } + ], + "label.current-password": [ + { + "type": 0, + "value": "Joriy parol" + } + ], + "label.custom-range": [ + { + "type": 0, + "value": "Maxsus oraliq" + } + ], + "label.dashboard": [ + { + "type": 0, + "value": "Boshqaruv paneli" + } + ], + "label.data": [ + { + "type": 0, + "value": "Ma'lumotlar" + } + ], + "label.date": [ + { + "type": 0, + "value": "Sana" + } + ], + "label.date-range": [ + { + "type": 0, + "value": "Sana oraligʻi" + } + ], + "label.day": [ + { + "type": 0, + "value": "Kun" + } + ], + "label.default-date-range": [ + { + "type": 0, + "value": "Standart sana oraligʻi" + } + ], + "label.delete": [ + { + "type": 0, + "value": "Oʻchirish" + } + ], + "label.delete-report": [ + { + "type": 0, + "value": "Hisobotni oʻchirish" + } + ], + "label.delete-team": [ + { + "type": 0, + "value": "Jamoani oʻchirish" + } + ], + "label.delete-user": [ + { + "type": 0, + "value": "Foydalanuvchini oʻchirish" + } + ], + "label.delete-website": [ + { + "type": 0, + "value": "Veb-saytni oʻchirish" + } + ], + "label.description": [ + { + "type": 0, + "value": "Tavsif" + } + ], + "label.desktop": [ + { + "type": 0, + "value": "Ish stoli" + } + ], + "label.details": [ + { + "type": 0, + "value": "Batafsil ma'lumot" + } + ], + "label.device": [ + { + "type": 0, + "value": "Qurilma" + } + ], + "label.devices": [ + { + "type": 0, + "value": "Qurilmalar" + } + ], + "label.dismiss": [ + { + "type": 0, + "value": "Yopish" + } + ], + "label.does-not-contain": [ + { + "type": 0, + "value": "Oʻz ichiga olmaydi" + } + ], + "label.domain": [ + { + "type": 0, + "value": "Domen" + } + ], + "label.dropoff": [ + { + "type": 0, + "value": "Tashlab ketish" + } + ], + "label.edit": [ + { + "type": 0, + "value": "Tahrirlash" + } + ], + "label.edit-dashboard": [ + { + "type": 0, + "value": "Boshqaruv panelini tahrirlash" + } + ], + "label.edit-member": [ + { + "type": 0, + "value": "A'zoni tahrirlash" + } + ], + "label.enable-share-url": [ + { + "type": 0, + "value": "Ulashish URL'ini yoqish" + } + ], + "label.end-step": [ + { + "type": 0, + "value": "Yakuniy qadam" + } + ], + "label.entry": [ + { + "type": 0, + "value": "Kirish yoʻli" + } + ], + "label.event": [ + { + "type": 0, + "value": "Hodisa" + } + ], + "label.event-data": [ + { + "type": 0, + "value": "Hodisa ma'lumotlari" + } + ], + "label.events": [ + { + "type": 0, + "value": "Hodisalar" + } + ], + "label.exit": [ + { + "type": 0, + "value": "Chiqish yoʻli" + } + ], + "label.false": [ + { + "type": 0, + "value": "Yolgʻon" + } + ], + "label.field": [ + { + "type": 0, + "value": "Maydon" + } + ], + "label.fields": [ + { + "type": 0, + "value": "Maydonlar" + } + ], + "label.filter": [ + { + "type": 0, + "value": "Filtr" + } + ], + "label.filter-combined": [ + { + "type": 0, + "value": "Birlashtirilgan" + } + ], + "label.filter-raw": [ + { + "type": 0, + "value": "Xom" + } + ], + "label.filters": [ + { + "type": 0, + "value": "Filtrlar" + } + ], + "label.first-seen": [ + { + "type": 0, + "value": "Birinchi koʻrilgan" + } + ], + "label.funnel": [ + { + "type": 0, + "value": "Voronka" + } + ], + "label.funnel-description": [ + { + "type": 0, + "value": "Foydalanuvchilarning konversiya va tashlab ketish darajasini tushunish." + } + ], + "label.goal": [ + { + "type": 0, + "value": "Maqsad" + } + ], + "label.goals": [ + { + "type": 0, + "value": "Maqsadlar" + } + ], + "label.goals-description": [ + { + "type": 0, + "value": "Sahifa koʻrishlari va hodisalar uchun maqsadlaringizni kuzatib boring." + } + ], + "label.greater-than": [ + { + "type": 0, + "value": "Kattaroq" + } + ], + "label.greater-than-equals": [ + { + "type": 0, + "value": "Kattaroq yoki teng" + } + ], + "label.host": [ + { + "type": 0, + "value": "Xost" + } + ], + "label.hosts": [ + { + "type": 0, + "value": "Xostlar" + } + ], + "label.insights": [ + { + "type": 0, + "value": "Tushunchalar" + } + ], + "label.insights-description": [ + { + "type": 0, + "value": "Segmentlar va filtrlardan foydalanib ma'lumotlaringizga chuqurroq kiring." + } + ], + "label.is": [ + { + "type": 0, + "value": "Teng" + } + ], + "label.is-not": [ + { + "type": 0, + "value": "Teng emas" + } + ], + "label.is-not-set": [ + { + "type": 0, + "value": "Oʻrnatilmagan" + } + ], + "label.is-set": [ + { + "type": 0, + "value": "Oʻrnatilgan" + } + ], + "label.join": [ + { + "type": 0, + "value": "Qoʻshilish" + } + ], + "label.join-team": [ + { + "type": 0, + "value": "Jamoaga qoʻshilish" + } + ], + "label.journey": [ + { + "type": 0, + "value": "Sayohat" + } + ], + "label.journey-description": [ + { + "type": 0, + "value": "Foydalanuvchilar veb-saytingizda qanday harakat qilishlarini tushunish." + } + ], + "label.language": [ + { + "type": 0, + "value": "Til" + } + ], + "label.languages": [ + { + "type": 0, + "value": "Tillar" + } + ], + "label.laptop": [ + { + "type": 0, + "value": "Noutbuk" + } + ], + "label.last-days": [ + { + "type": 0, + "value": "Oxirgi " + }, + { + "type": 1, + "value": "x" + }, + { + "type": 0, + "value": " kun" + } + ], + "label.last-hours": [ + { + "type": 0, + "value": "Oxirgi " + }, + { + "type": 1, + "value": "x" + }, + { + "type": 0, + "value": " soat" + } + ], + "label.last-months": [ + { + "type": 0, + "value": "Oxirgi " + }, + { + "type": 1, + "value": "x" + }, + { + "type": 0, + "value": " oy" + } + ], + "label.last-seen": [ + { + "type": 0, + "value": "Oxirgi koʻrilgan" + } + ], + "label.leave": [ + { + "type": 0, + "value": "Tark etish" + } + ], + "label.leave-team": [ + { + "type": 0, + "value": "Jamoani tark etish" + } + ], + "label.less-than": [ + { + "type": 0, + "value": "Kichikroq" + } + ], + "label.less-than-equals": [ + { + "type": 0, + "value": "Kichikroq yoki teng" + } + ], + "label.login": [ + { + "type": 0, + "value": "Kirish" + } + ], + "label.logout": [ + { + "type": 0, + "value": "Chiqish" + } + ], + "label.manage": [ + { + "type": 0, + "value": "Boshqarish" + } + ], + "label.manager": [ + { + "type": 0, + "value": "Menejer" + } + ], + "label.max": [ + { + "type": 0, + "value": "Maksimal" + } + ], + "label.member": [ + { + "type": 0, + "value": "A'zo" + } + ], + "label.members": [ + { + "type": 0, + "value": "A'zolar" + } + ], + "label.min": [ + { + "type": 0, + "value": "Minimal" + } + ], + "label.mobile": [ + { + "type": 0, + "value": "Mobil" + } + ], + "label.more": [ + { + "type": 0, + "value": "Koʻproq" + } + ], + "label.my-account": [ + { + "type": 0, + "value": "Mening hisobim" + } + ], + "label.my-websites": [ + { + "type": 0, + "value": "Mening veb-saytlarim" + } + ], + "label.name": [ + { + "type": 0, + "value": "Ism" + } + ], + "label.new-password": [ + { + "type": 0, + "value": "Yangi parol" + } + ], + "label.none": [ + { + "type": 0, + "value": "Hech biri" + } + ], + "label.number-of-records": [ + { + "type": 1, + "value": "x" + }, + { + "type": 0, + "value": " yozuv" + } + ], + "label.ok": [ + { + "type": 0, + "value": "OK" + } + ], + "label.os": [ + { + "type": 0, + "value": "OT (Operatsion tizim)" + } + ], + "label.overview": [ + { + "type": 0, + "value": "Umumiy koʻrinish" + } + ], + "label.owner": [ + { + "type": 0, + "value": "Egasi" + } + ], + "label.page-of": [ + { + "type": 0, + "value": "Sahifa " + }, + { + "type": 1, + "value": "current" + }, + { + "type": 0, + "value": " dan " + }, + { + "type": 1, + "value": "total" + } + ], + "label.page-views": [ + { + "type": 0, + "value": "Sahifa koʻrishlari" + } + ], + "label.pageTitle": [ + { + "type": 0, + "value": "Sahifa sarlavhasi" + } + ], + "label.pages": [ + { + "type": 0, + "value": "Sahifalar" + } + ], + "label.password": [ + { + "type": 0, + "value": "Parol" + } + ], + "label.path": [ + { + "type": 0, + "value": "Yoʻl" + } + ], + "label.paths": [ + { + "type": 0, + "value": "Yoʻllar" + } + ], + "label.powered-by": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " tomonidan quvvatlanadi" + } + ], + "label.previous": [ + { + "type": 0, + "value": "Oldingi" + } + ], + "label.previous-period": [ + { + "type": 0, + "value": "Oldingi davr" + } + ], + "label.previous-year": [ + { + "type": 0, + "value": "Oldingi yil" + } + ], + "label.profile": [ + { + "type": 0, + "value": "Profil" + } + ], + "label.properties": [ + { + "type": 0, + "value": "Xususiyatlar" + } + ], + "label.property": [ + { + "type": 0, + "value": "Xususiyat" + } + ], + "label.queries": [ + { + "type": 0, + "value": "Soʻrovlar" + } + ], + "label.query": [ + { + "type": 0, + "value": "Soʻrov" + } + ], + "label.query-parameters": [ + { + "type": 0, + "value": "Soʻrov parametrlari" + } + ], + "label.realtime": [ + { + "type": 0, + "value": "Haqiqiy vaqt" + } + ], + "label.referrer": [ + { + "type": 0, + "value": "Tavsiya etuvchi" + } + ], + "label.referrers": [ + { + "type": 0, + "value": "Tavsiya etuvchilar" + } + ], + "label.refresh": [ + { + "type": 0, + "value": "Yangilash" + } + ], + "label.regenerate": [ + { + "type": 0, + "value": "Qayta yaratish" + } + ], + "label.region": [ + { + "type": 0, + "value": "Viloyat/Mintaqa" + } + ], + "label.regions": [ + { + "type": 0, + "value": "Viloyatlar/Mintaqalar" + } + ], + "label.remove": [ + { + "type": 0, + "value": "Olib tashlash" + } + ], + "label.remove-member": [ + { + "type": 0, + "value": "A'zoni olib tashlash" + } + ], + "label.reports": [ + { + "type": 0, + "value": "Hisobotlar" + } + ], + "label.required": [ + { + "type": 0, + "value": "Majburiy" + } + ], + "label.reset": [ + { + "type": 0, + "value": "Qayta tiklash" + } + ], + "label.reset-website": [ + { + "type": 0, + "value": "Veb-saytni qayta tiklash" + } + ], + "label.retention": [ + { + "type": 0, + "value": "Saqlanish" + } + ], + "label.retention-description": [ + { + "type": 0, + "value": "Foydalanuvchilarning qaytish chastotasini kuzatib, veb-saytingizning jozibadorligini oʻlchang." + } + ], + "label.revenue": [ + { + "type": 0, + "value": "Daromad" + } + ], + "label.revenue-description": [ + { + "type": 0, + "value": "Vaqt oʻtishi bilan daromadingizni tekshiring." + } + ], + "label.revenue-property": [ + { + "type": 0, + "value": "Daromad xususiyati" + } + ], + "label.role": [ + { + "type": 0, + "value": "Rol" + } + ], + "label.run-query": [ + { + "type": 0, + "value": "Soʻrovni ishga tushirish" + } + ], + "label.save": [ + { + "type": 0, + "value": "Saqlash" + } + ], + "label.screens": [ + { + "type": 0, + "value": "Ekranlar" + } + ], + "label.search": [ + { + "type": 0, + "value": "Qidiruv" + } + ], + "label.select": [ + { + "type": 0, + "value": "Tanlash" + } + ], + "label.select-date": [ + { + "type": 0, + "value": "Sanani tanlash" + } + ], + "label.select-role": [ + { + "type": 0, + "value": "Rolni tanlash" + } + ], + "label.select-website": [ + { + "type": 0, + "value": "Veb-saytni tanlash" + } + ], + "label.session": [ + { + "type": 0, + "value": "Sessiya" + } + ], + "label.sessions": [ + { + "type": 0, + "value": "Sessiyalar" + } + ], + "label.settings": [ + { + "type": 0, + "value": "Sozlamalar" + } + ], + "label.share-url": [ + { + "type": 0, + "value": "Ulashish URL'i" + } + ], + "label.single-day": [ + { + "type": 0, + "value": "Bir kun" + } + ], + "label.start-step": [ + { + "type": 0, + "value": "Boshlanish qadami" + } + ], + "label.steps": [ + { + "type": 0, + "value": "Qadamlar" + } + ], + "label.sum": [ + { + "type": 0, + "value": "Yigʻindi" + } + ], + "label.tablet": [ + { + "type": 0, + "value": "Planshet" + } + ], + "label.team": [ + { + "type": 0, + "value": "Jamoa" + } + ], + "label.team-id": [ + { + "type": 0, + "value": "Jamoa ID'si" + } + ], + "label.team-manager": [ + { + "type": 0, + "value": "Jamoa menejeri" + } + ], + "label.team-member": [ + { + "type": 0, + "value": "Jamoa a'zosi" + } + ], + "label.team-name": [ + { + "type": 0, + "value": "Jamoa nomi" + } + ], + "label.team-owner": [ + { + "type": 0, + "value": "Jamoa egasi" + } + ], + "label.team-view-only": [ + { + "type": 0, + "value": "Jamoa faqat koʻrish" + } + ], + "label.team-websites": [ + { + "type": 0, + "value": "Jamoa veb-saytlari" + } + ], + "label.teams": [ + { + "type": 0, + "value": "Jamoalar" + } + ], + "label.theme": [ + { + "type": 0, + "value": "Mavzu" + } + ], + "label.this-month": [ + { + "type": 0, + "value": "Shu oy" + } + ], + "label.this-week": [ + { + "type": 0, + "value": "Shu hafta" + } + ], + "label.this-year": [ + { + "type": 0, + "value": "Shu yil" + } + ], + "label.timezone": [ + { + "type": 0, + "value": "Vaqt zonasi" + } + ], + "label.title": [ + { + "type": 0, + "value": "Sarlavha" + } + ], + "label.today": [ + { + "type": 0, + "value": "Bugun" + } + ], + "label.toggle-charts": [ + { + "type": 0, + "value": "Grafiklarni almashtirish" + } + ], + "label.total": [ + { + "type": 0, + "value": "Jami" + } + ], + "label.total-records": [ + { + "type": 0, + "value": "Jami yozuvlar" + } + ], + "label.tracking-code": [ + { + "type": 0, + "value": "Kuzatuv kodi" + } + ], + "label.transactions": [ + { + "type": 0, + "value": "Tranzaksiyalar" + } + ], + "label.transfer": [ + { + "type": 0, + "value": "Oʻtkazish" + } + ], + "label.transfer-website": [ + { + "type": 0, + "value": "Veb-saytni oʻtkazish" + } + ], + "label.true": [ + { + "type": 0, + "value": "Rost" + } + ], + "label.type": [ + { + "type": 0, + "value": "Tur" + } + ], + "label.unique": [ + { + "type": 0, + "value": "Noyob" + } + ], + "label.unique-visitors": [ + { + "type": 0, + "value": "Noyob tashrif buyuruvchilar" + } + ], + "label.uniqueCustomers": [ + { + "type": 0, + "value": "Noyob mijozlar" + } + ], + "label.unknown": [ + { + "type": 0, + "value": "Noma'lum" + } + ], + "label.untitled": [ + { + "type": 0, + "value": "Sarlavhasiz" + } + ], + "label.update": [ + { + "type": 0, + "value": "Yangilash" + } + ], + "label.url": [ + { + "type": 0, + "value": "URL" + } + ], + "label.urls": [ + { + "type": 0, + "value": "URL'lar" + } + ], + "label.user": [ + { + "type": 0, + "value": "Foydalanuvchi" + } + ], + "label.user-property": [ + { + "type": 0, + "value": "Foydalanuvchi xususiyati" + } + ], + "label.username": [ + { + "type": 0, + "value": "Foydalanuvchi nomi" + } + ], + "label.users": [ + { + "type": 0, + "value": "Foydalanuvchilar" + } + ], + "label.utm": [ + { + "type": 0, + "value": "UTM" + } + ], + "label.utm-description": [ + { + "type": 0, + "value": "UTM parametrlari orqali kampaniyalaringizni kuzatib boring." + } + ], + "label.value": [ + { + "type": 0, + "value": "Qiymat" + } + ], + "label.view": [ + { + "type": 0, + "value": "Koʻrish" + } + ], + "label.view-details": [ + { + "type": 0, + "value": "Batafsil koʻrish" + } + ], + "label.view-only": [ + { + "type": 0, + "value": "Faqat koʻrish" + } + ], + "label.views": [ + { + "type": 0, + "value": "Koʻrishlar" + } + ], + "label.views-per-visit": [ + { + "type": 0, + "value": "Tashrifga koʻrishlar soni" + } + ], + "label.visit-duration": [ + { + "type": 0, + "value": "Tashrif davomiyligi" + } + ], + "label.visitors": [ + { + "type": 0, + "value": "Tashrif buyuruvchilar" + } + ], + "label.visits": [ + { + "type": 0, + "value": "Tashriflar" + } + ], + "label.website": [ + { + "type": 0, + "value": "Veb-sayt" + } + ], + "label.website-id": [ + { + "type": 0, + "value": "Veb-sayt ID'si" + } + ], + "label.websites": [ + { + "type": 0, + "value": "Veb-saytlar" + } + ], + "label.window": [ + { + "type": 0, + "value": "Oyna" + } + ], + "label.yesterday": [ + { + "type": 0, + "value": "Kecha" + } + ], + "message.action-confirmation": [ + { + "type": 0, + "value": "Tasdiqlash uchun pastdagi qutiga **" + }, + { + "type": 1, + "value": "confirmation" + }, + { + "type": 0, + "value": "** yozing." + } + ], + "message.active-users": [ + { + "type": 1, + "value": "x" + }, + { + "type": 0, + "value": " joriy " + }, + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "tashrif buyuruvchi" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "tashrif buyuruvchilar" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "x" + } + ], + "message.collected-data": [ + { + "type": 0, + "value": "Yigʻilgan ma'lumotlar" + } + ], + "message.confirm-delete": [ + { + "type": 0, + "value": "**" + }, + { + "type": 1, + "value": "target" + }, + { + "type": 0, + "value": "** ni oʻchirmoqchi ekanligingizga ishonchingiz komilmi?" + } + ], + "message.confirm-leave": [ + { + "type": 0, + "value": "**" + }, + { + "type": 1, + "value": "target" + }, + { + "type": 0, + "value": "** ni tark etmoqchi ekanligingizga ishonchingiz komilmi?" + } + ], + "message.confirm-remove": [ + { + "type": 0, + "value": "**" + }, + { + "type": 1, + "value": "target" + }, + { + "type": 0, + "value": "** ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?" + } + ], + "message.confirm-reset": [ + { + "type": 0, + "value": "**" + }, + { + "type": 1, + "value": "target" + }, + { + "type": 0, + "value": "** ni qayta tiklamoqchi ekanligingizga ishonchingiz komilmi?" + } + ], + "message.delete-team-warning": [ + { + "type": 0, + "value": "Jamoani oʻchirish, shuningdek, barcha jamoa veb-saytlarini ham oʻchiradi." + } + ], + "message.delete-website-warning": [ + { + "type": 0, + "value": "Barcha veb-sayt ma'lumotlari oʻchiriladi." + } + ], + "message.error": [ + { + "type": 0, + "value": "Nimadir xato ketdi." + } + ], + "message.event-log": [ + { + "type": 0, + "value": "**" + }, + { + "type": 1, + "value": "url" + }, + { + "type": 0, + "value": "** da **" + }, + { + "type": 1, + "value": "event" + }, + { + "type": 0, + "value": "** hodisasi" + } + ], + "message.go-to-settings": [ + { + "type": 0, + "value": "Sozlamalarga oʻtish" + } + ], + "message.incorrect-username-password": [ + { + "type": 0, + "value": "Notoʻgʻri foydalanuvchi nomi va/yoki parol." + } + ], + "message.invalid-domain": [ + { + "type": 0, + "value": "Notoʻgʻri domen. http/https qoʻshmang." + } + ], + "message.min-password-length": [ + { + "type": 0, + "value": "Minimal uzunligi " + }, + { + "type": 1, + "value": "n" + }, + { + "type": 0, + "value": " belgidan" + } + ], + "message.new-version-available": [ + { + "type": 0, + "value": "Umami'ning yangi **" + }, + { + "type": 1, + "value": "version" + }, + { + "type": 0, + "value": "** versiyasi mavjud!" + } + ], + "message.no-data-available": [ + { + "type": 0, + "value": "Ma'lumotlar mavjud emas." + } + ], + "message.no-event-data": [ + { + "type": 0, + "value": "Hodisa ma'lumotlari mavjud emas." + } + ], + "message.no-match-password": [ + { + "type": 0, + "value": "Parollar mos kelmadi." + } + ], + "message.no-results-found": [ + { + "type": 0, + "value": "Hech qanday natija topilmadi." + } + ], + "message.no-team-websites": [ + { + "type": 0, + "value": "Bu jamoada hech qanday veb-sayt yoʻq." + } + ], + "message.no-teams": [ + { + "type": 0, + "value": "Siz hech qanday jamoa yaratmagansiz." + } + ], + "message.no-users": [ + { + "type": 0, + "value": "Hech qanday foydalanuvchi yoʻq." + } + ], + "message.no-websites-configured": [ + { + "type": 0, + "value": "Sizda hech qanday veb-sayt sozlanmagan." + } + ], + "message.page-not-found": [ + { + "type": 0, + "value": "Sahifa topilmadi" + } + ], + "message.reset-website": [ + { + "type": 0, + "value": "Bu veb-saytni qayta tiklash uchun tasdiqlash uchun pastdagi qutiga **" + }, + { + "type": 1, + "value": "confirmation" + }, + { + "type": 0, + "value": "** yozing." + } + ], + "message.reset-website-warning": [ + { + "type": 0, + "value": "Bu veb-sayt uchun barcha statistik ma'lumotlar oʻchiriladi, lekin sozlamalaringiz saqlanib qoladi." + } + ], + "message.saved": [ + { + "type": 0, + "value": "Saqlandi." + } + ], + "message.share-url": [ + { + "type": 0, + "value": "Sizning veb-sayt statistikalaringiz quyidagi URL'da ochiqdir:" + } + ], + "message.team-already-member": [ + { + "type": 0, + "value": "Siz allaqachon jamoa a'zosisiz." + } + ], + "message.team-not-found": [ + { + "type": 0, + "value": "Jamoa topilmadi." + } + ], + "message.team-websites-info": [ + { + "type": 0, + "value": "Veb-saytlarni jamoaning har bir a'zosi koʻrishi mumkin." + } + ], + "message.tracking-code": [ + { + "type": 0, + "value": "Bu veb-sayt uchun statistikani kuzatish uchun quyidagi kodni HTML'ingizdagi **" + }, + { + "children": [ + { + "type": 0, + "value": "..." + } + ], + "type": 8, + "value": "head" + }, + { + "type": 0, + "value": "** qismiga joylashtiring." + } + ], + "message.transfer-team-website-to-user": [ + { + "type": 0, + "value": "Bu veb-saytni oʻz hisobingizga oʻtkazasizmi?" + } + ], + "message.transfer-user-website-to-team": [ + { + "type": 0, + "value": "Bu veb-saytni oʻtkazish uchun jamoani tanlang." + } + ], + "message.transfer-website": [ + { + "type": 0, + "value": "Veb-sayt egaligini oʻz hisobingizga yoki boshqa jamoaga oʻtkazish." + } + ], + "message.triggered-event": [ + { + "type": 0, + "value": "Hodisa ishga tushirildi" + } + ], + "message.user-deleted": [ + { + "type": 0, + "value": "Foydalanuvchi oʻchirildi." + } + ], + "message.viewed-page": [ + { + "type": 0, + "value": "Sahifa koʻrildi" + } + ], + "message.visitor-log": [ + { + "type": 1, + "value": "os" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "device" + }, + { + "type": 0, + "value": " da " + }, + { + "type": 1, + "value": "browser" + }, + { + "type": 0, + "value": " dan foydalanayotgan " + }, + { + "type": 1, + "value": "country" + }, + { + "type": 0, + "value": " dan tashrif buyuruvchi" + } + ], + "message.visitors-dropped-off": [ + { + "type": 0, + "value": "Tashrif buyuruvchilar tashlab ketishdi" + } + ] +} diff --git a/public/intl/messages/vi-VN.json b/public/intl/messages/vi-VN.json index 68a301ae..dab46ca8 100644 --- a/public/intl/messages/vi-VN.json +++ b/public/intl/messages/vi-VN.json @@ -2,7 +2,7 @@ "label.access-code": [ { "type": 0, - "value": "Access code" + "value": "Mã truy cập" } ], "label.actions": [ @@ -14,31 +14,31 @@ "label.activity": [ { "type": 0, - "value": "Activity log" + "value": "Nhật ký hoạt động" } ], "label.add": [ { "type": 0, - "value": "Add" + "value": "Thêm" } ], "label.add-description": [ { "type": 0, - "value": "Add description" + "value": "Thêm mô tả" } ], "label.add-member": [ { "type": 0, - "value": "Add member" + "value": "Thêm thành viên" } ], "label.add-step": [ { "type": 0, - "value": "Add step" + "value": "Thêm bước" } ], "label.add-website": [ @@ -56,7 +56,7 @@ "label.after": [ { "type": 0, - "value": "After" + "value": "Sau đó" } ], "label.all": [ @@ -74,25 +74,25 @@ "label.analytics": [ { "type": 0, - "value": "Analytics" + "value": "Phân tích" } ], "label.average": [ { "type": 0, - "value": "Average" + "value": "Trung bình" } ], "label.back": [ { "type": 0, - "value": "Quay về" + "value": "Quay lại" } ], "label.before": [ { "type": 0, - "value": "Before" + "value": "Trước đó" } ], "label.bounce-rate": [ @@ -104,25 +104,25 @@ "label.breakdown": [ { "type": 0, - "value": "Breakdown" + "value": "Phân tích chi tiết" } ], "label.browser": [ { "type": 0, - "value": "Browser" + "value": "Trình duyệt" } ], "label.browsers": [ { "type": 0, - "value": "Trình duyệt" + "value": "Các trình duyệt" } ], "label.cancel": [ { "type": 0, - "value": "Huỷ bỏ" + "value": "Hủy bỏ" } ], "label.change-password": [ @@ -134,31 +134,31 @@ "label.cities": [ { "type": 0, - "value": "Cities" + "value": "Các thành phố" } ], "label.city": [ { "type": 0, - "value": "City" + "value": "Thành phố" } ], "label.clear-all": [ { "type": 0, - "value": "Clear all" + "value": "Xóa tất cả" } ], "label.compare": [ { "type": 0, - "value": "Compare" + "value": "So sánh" } ], "label.confirm": [ { "type": 0, - "value": "Confirm" + "value": "Xác nhận" } ], "label.confirm-password": [ @@ -170,73 +170,73 @@ "label.contains": [ { "type": 0, - "value": "Contains" + "value": "Chứa" } ], "label.continue": [ { "type": 0, - "value": "Continue" + "value": "Tiếp tục" } ], "label.count": [ { "type": 0, - "value": "Count" + "value": "Số lượng" } ], "label.countries": [ { "type": 0, - "value": "Quốc gia" + "value": "Các quốc gia" } ], "label.country": [ { "type": 0, - "value": "Country" + "value": "Quốc gia" } ], "label.create": [ { "type": 0, - "value": "Create" + "value": "Tạo" } ], "label.create-report": [ { "type": 0, - "value": "Create report" + "value": "Tạo báo cáo" } ], "label.create-team": [ { "type": 0, - "value": "Create team" + "value": "Tạo nhóm" } ], "label.create-user": [ { "type": 0, - "value": "Create user" + "value": "Tạo người dùng" } ], "label.created": [ { "type": 0, - "value": "Created" + "value": "Đã tạo" } ], "label.created-by": [ { "type": 0, - "value": "Created By" + "value": "Được tạo bởi" } ], "label.current": [ { "type": 0, - "value": "Current" + "value": "Hiện tại" } ], "label.current-password": [ @@ -248,7 +248,7 @@ "label.custom-range": [ { "type": 0, - "value": "Phạm vi ngày tuỳ chọn" + "value": "Phạm vi tùy chỉnh" } ], "label.dashboard": [ @@ -260,13 +260,13 @@ "label.data": [ { "type": 0, - "value": "Data" + "value": "Dữ liệu" } ], "label.date": [ { "type": 0, - "value": "Date" + "value": "Ngày" } ], "label.date-range": [ @@ -278,7 +278,7 @@ "label.day": [ { "type": 0, - "value": "Day" + "value": "Ngày" } ], "label.default-date-range": [ @@ -290,25 +290,25 @@ "label.delete": [ { "type": 0, - "value": "Xoá" + "value": "Xóa" } ], "label.delete-report": [ { "type": 0, - "value": "Delete report" + "value": "Xóa báo cáo" } ], "label.delete-team": [ { "type": 0, - "value": "Delete team" + "value": "Xóa nhóm" } ], "label.delete-user": [ { "type": 0, - "value": "Delete user" + "value": "Xóa người dùng" } ], "label.delete-website": [ @@ -320,43 +320,43 @@ "label.description": [ { "type": 0, - "value": "Description" + "value": "Mô tả" } ], "label.desktop": [ { "type": 0, - "value": "Máy bàn" + "value": "Máy tính để bàn" } ], "label.details": [ { "type": 0, - "value": "Details" + "value": "Chi tiết" } ], "label.device": [ { "type": 0, - "value": "Device" + "value": "Thiết bị" } ], "label.devices": [ { "type": 0, - "value": "Thiết bị" + "value": "Các thiết bị" } ], "label.dismiss": [ { "type": 0, - "value": "Loại trừ" + "value": "Bỏ qua" } ], "label.does-not-contain": [ { "type": 0, - "value": "Does not contain" + "value": "Không chứa" } ], "label.domain": [ @@ -368,7 +368,7 @@ "label.dropoff": [ { "type": 0, - "value": "Dropoff" + "value": "Tỷ lệ bỏ qua" } ], "label.edit": [ @@ -380,235 +380,235 @@ "label.edit-dashboard": [ { "type": 0, - "value": "Edit dashboard" + "value": "Chỉnh sửa bảng điều khiển" } ], "label.edit-member": [ { "type": 0, - "value": "Edit member" + "value": "Chỉnh sửa thành viên" } ], "label.enable-share-url": [ { "type": 0, - "value": "Bật khả năng chia sẻ URL" + "value": "Bật chia sẻ URL" } ], "label.end-step": [ { "type": 0, - "value": "End Step" + "value": "Bước kết thúc" } ], "label.entry": [ { "type": 0, - "value": "Entry URL" + "value": "URL truy cập" } ], "label.event": [ { "type": 0, - "value": "Event" + "value": "Sự kiện" } ], "label.event-data": [ { "type": 0, - "value": "Event data" + "value": "Dữ liệu sự kiện" } ], "label.events": [ { "type": 0, - "value": "Sự kiện" + "value": "Các sự kiện" } ], "label.exit": [ { "type": 0, - "value": "Exit URL" + "value": "URL thoát" } ], "label.false": [ { "type": 0, - "value": "False" + "value": "Sai" } ], "label.field": [ { "type": 0, - "value": "Field" + "value": "Trường" } ], "label.fields": [ { "type": 0, - "value": "Fields" + "value": "Các trường" } ], "label.filter": [ { "type": 0, - "value": "Filter" + "value": "Lọc" } ], "label.filter-combined": [ { "type": 0, - "value": "Kết hợp" + "value": "Kết hợp lọc" } ], "label.filter-raw": [ { "type": 0, - "value": "Gốc" + "value": "Lọc thô" } ], "label.filters": [ { "type": 0, - "value": "Filters" + "value": "Bộ lọc" } ], "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "Lần đầu tiên nhìn thấy" } ], "label.funnel": [ { "type": 0, - "value": "Funnel" + "value": "Phễu" } ], "label.funnel-description": [ { "type": 0, - "value": "Understand the conversion and drop-off rate of users." + "value": "Tìm hiểu tỷ lệ chuyển đổi và bỏ qua của người dùng." } ], "label.goal": [ { "type": 0, - "value": "Goal" + "value": "Mục tiêu" } ], "label.goals": [ { "type": 0, - "value": "Goals" + "value": "Các mục tiêu" } ], "label.goals-description": [ { "type": 0, - "value": "Track your goals for pageviews and events." + "value": "Theo dõi các mục tiêu của bạn cho lượt xem trang và sự kiện." } ], "label.greater-than": [ { "type": 0, - "value": "Greater than" + "value": "Lớn hơn" } ], "label.greater-than-equals": [ { "type": 0, - "value": "Greater than or equals" + "value": "Lớn hơn hoặc bằng" } ], "label.host": [ { "type": 0, - "value": "Host" + "value": "Máy chủ" } ], "label.hosts": [ { "type": 0, - "value": "Hosts" + "value": "Các máy chủ" } ], "label.insights": [ { "type": 0, - "value": "Insights" + "value": "Thông tin chi tiết" } ], "label.insights-description": [ { "type": 0, - "value": "Dive deeper into your data by using segments and filters." + "value": "Tìm hiểu sâu hơn về dữ liệu của bạn bằng cách sử dụng phân đoạn và bộ lọc." } ], "label.is": [ { "type": 0, - "value": "Is" + "value": "Là" } ], "label.is-not": [ { "type": 0, - "value": "Is not" + "value": "Không phải là" } ], "label.is-not-set": [ { "type": 0, - "value": "Is not set" + "value": "Chưa được đặt" } ], "label.is-set": [ { "type": 0, - "value": "Is set" + "value": "Đã đặt" } ], "label.join": [ { "type": 0, - "value": "Join" + "value": "Tham gia" } ], "label.join-team": [ { "type": 0, - "value": "Join team" + "value": "Tham gia nhóm" } ], "label.journey": [ { "type": 0, - "value": "Journey" + "value": "Hành trình" } ], "label.journey-description": [ { "type": 0, - "value": "Understand how users navigate through your website." + "value": "Hiểu cách người dùng điều hướng qua website của bạn." } ], "label.language": [ { "type": 0, - "value": "Language" + "value": "Ngôn ngữ" } ], "label.languages": [ { "type": 0, - "value": "Ngôn ngữ" + "value": "Các ngôn ngữ" } ], "label.laptop": [ { "type": 0, - "value": "Laptop" + "value": "Máy tính xách tay" } ], "label.last-days": [ @@ -632,47 +632,43 @@ } ], "label.last-months": [ - { - "type": 0, - "value": "Last " - }, { "type": 1, "value": "x" }, { "type": 0, - "value": " months" + "value": " tháng gần nhất" } ], "label.last-seen": [ { "type": 0, - "value": "Last seen" + "value": "Lần cuối cùng nhìn thấy" } ], "label.leave": [ { "type": 0, - "value": "Leave" + "value": "Rời khỏi" } ], "label.leave-team": [ { "type": 0, - "value": "Leave team" + "value": "Rời nhóm" } ], "label.less-than": [ { "type": 0, - "value": "Less than" + "value": "Nhỏ hơn" } ], "label.less-than-equals": [ { "type": 0, - "value": "Less than or equals" + "value": "Nhỏ hơn hoặc bằng" } ], "label.login": [ @@ -690,37 +686,37 @@ "label.manage": [ { "type": 0, - "value": "Manage" + "value": "Quản lý" } ], "label.manager": [ { "type": 0, - "value": "Manager" + "value": "Quản lý" } ], "label.max": [ { "type": 0, - "value": "Max" + "value": "Tối đa" } ], "label.member": [ { "type": 0, - "value": "Member" + "value": "Thành viên" } ], "label.members": [ { "type": 0, - "value": "Members" + "value": "Các thành viên" } ], "label.min": [ { "type": 0, - "value": "Min" + "value": "Tối thiểu" } ], "label.mobile": [ @@ -738,13 +734,13 @@ "label.my-account": [ { "type": 0, - "value": "My account" + "value": "Tài khoản của tôi" } ], "label.my-websites": [ { "type": 0, - "value": "My websites" + "value": "Các website của tôi" } ], "label.name": [ @@ -762,7 +758,7 @@ "label.none": [ { "type": 0, - "value": "None" + "value": "Không" } ], "label.number-of-records": [ @@ -781,7 +777,7 @@ "value": [ { "type": 0, - "value": "record" + "value": "bản ghi" } ] }, @@ -789,7 +785,7 @@ "value": [ { "type": 0, - "value": "records" + "value": "bản ghi" } ] } @@ -808,13 +804,13 @@ "label.os": [ { "type": 0, - "value": "OS" + "value": "Hệ điều hành" } ], "label.overview": [ { "type": 0, - "value": "Overview" + "value": "Tổng quan" } ], "label.owner": [ @@ -826,7 +822,7 @@ "label.page-of": [ { "type": 0, - "value": "Page " + "value": "Trang " }, { "type": 1, @@ -834,7 +830,7 @@ }, { "type": 0, - "value": " of " + "value": " trên " }, { "type": 1, @@ -844,19 +840,19 @@ "label.page-views": [ { "type": 0, - "value": "Lượt xem" + "value": "Lượt xem trang" } ], "label.pageTitle": [ { "type": 0, - "value": "Page title" + "value": "Tiêu đề trang" } ], "label.pages": [ { "type": 0, - "value": "Trang" + "value": "Các trang" } ], "label.password": [ @@ -868,19 +864,19 @@ "label.path": [ { "type": 0, - "value": "Path" + "value": "Đường dẫn" } ], "label.paths": [ { "type": 0, - "value": "Paths" + "value": "Các đường dẫn" } ], "label.powered-by": [ { "type": 0, - "value": "Bản quyền thuộc về " + "value": "Được cung cấp bởi " }, { "type": 1, @@ -890,19 +886,19 @@ "label.previous": [ { "type": 0, - "value": "Previous" + "value": "Trước" } ], "label.previous-period": [ { "type": 0, - "value": "Previous period" + "value": "Kỳ trước" } ], "label.previous-year": [ { "type": 0, - "value": "Previous year" + "value": "Năm trước" } ], "label.profile": [ @@ -914,31 +910,31 @@ "label.properties": [ { "type": 0, - "value": "Properties" + "value": "Thuộc tính" } ], "label.property": [ { "type": 0, - "value": "Property" + "value": "Thuộc tính" } ], "label.queries": [ { "type": 0, - "value": "Queries" + "value": "Truy vấn" } ], "label.query": [ { "type": 0, - "value": "Query" + "value": "Truy vấn" } ], "label.query-parameters": [ { "type": 0, - "value": "Query parameters" + "value": "Tham số truy vấn" } ], "label.realtime": [ @@ -950,13 +946,13 @@ "label.referrer": [ { "type": 0, - "value": "Referrer" + "value": "Nguồn giới thiệu" } ], "label.referrers": [ { "type": 0, - "value": "Liên kết giới thiệu" + "value": "Các nguồn giới thiệu" } ], "label.refresh": [ @@ -968,37 +964,37 @@ "label.regenerate": [ { "type": 0, - "value": "Regenerate" + "value": "Tạo lại" } ], "label.region": [ { "type": 0, - "value": "Region" + "value": "Vùng" } ], "label.regions": [ { "type": 0, - "value": "Regions" + "value": "Các vùng" } ], "label.remove": [ { "type": 0, - "value": "Remove" + "value": "Xóa" } ], "label.remove-member": [ { "type": 0, - "value": "Remove member" + "value": "Xóa thành viên" } ], "label.reports": [ { "type": 0, - "value": "Reports" + "value": "Báo cáo" } ], "label.required": [ @@ -1010,55 +1006,55 @@ "label.reset": [ { "type": 0, - "value": "Tái thiết lập" + "value": "Đặt lại" } ], "label.reset-website": [ { "type": 0, - "value": "Tái thiết lập thống kê" + "value": "Đặt lại thống kê website" } ], "label.retention": [ { "type": 0, - "value": "Retention" + "value": "Tỷ lệ giữ chân" } ], "label.retention-description": [ { "type": 0, - "value": "Measure your website stickiness by tracking how often users return." + "value": "Đo lường mức độ gắn bó của website bằng cách theo dõi tần suất người dùng quay lại." } ], "label.revenue": [ { "type": 0, - "value": "Revenue" + "value": "Doanh thu" } ], "label.revenue-description": [ { "type": 0, - "value": "Look into your revenue across time." + "value": "Xem xét doanh thu của bạn theo thời gian." } ], "label.revenue-property": [ { "type": 0, - "value": "Revenue Property" + "value": "Thuộc tính doanh thu" } ], "label.role": [ { "type": 0, - "value": "Role" + "value": "Vai trò" } ], "label.run-query": [ { "type": 0, - "value": "Run query" + "value": "Chạy truy vấn" } ], "label.save": [ @@ -1070,49 +1066,49 @@ "label.screens": [ { "type": 0, - "value": "Screens" + "value": "Màn hình" } ], "label.search": [ { "type": 0, - "value": "Search" + "value": "Tìm kiếm" } ], "label.select": [ { "type": 0, - "value": "Select" + "value": "Chọn" } ], "label.select-date": [ { "type": 0, - "value": "Select date" + "value": "Chọn ngày" } ], "label.select-role": [ { "type": 0, - "value": "Select role" + "value": "Chọn vai trò" } ], "label.select-website": [ { "type": 0, - "value": "Select website" + "value": "Chọn website" } ], "label.session": [ { "type": 0, - "value": "Session" + "value": "Phiên" } ], "label.sessions": [ { "type": 0, - "value": "Sessions" + "value": "Các phiên" } ], "label.settings": [ @@ -1130,25 +1126,25 @@ "label.single-day": [ { "type": 0, - "value": "Trong ngày" + "value": "Một ngày" } ], "label.start-step": [ { "type": 0, - "value": "Start Step" + "value": "Bước bắt đầu" } ], "label.steps": [ { "type": 0, - "value": "Steps" + "value": "Các bước" } ], "label.sum": [ { "type": 0, - "value": "Sum" + "value": "Tổng" } ], "label.tablet": [ @@ -1160,61 +1156,61 @@ "label.team": [ { "type": 0, - "value": "Team" + "value": "Nhóm" } ], "label.team-id": [ { "type": 0, - "value": "Team ID" + "value": "ID nhóm" } ], "label.team-manager": [ { "type": 0, - "value": "Team manager" + "value": "Quản lý nhóm" } ], "label.team-member": [ { "type": 0, - "value": "Team member" + "value": "Thành viên nhóm" } ], "label.team-name": [ { "type": 0, - "value": "Team name" + "value": "Tên nhóm" } ], "label.team-owner": [ { "type": 0, - "value": "Team owner" + "value": "Chủ sở hữu nhóm" } ], "label.team-view-only": [ { "type": 0, - "value": "Team view only" + "value": "Chỉ xem nhóm" } ], "label.team-websites": [ { "type": 0, - "value": "Team websites" + "value": "Các website của nhóm" } ], "label.teams": [ { "type": 0, - "value": "Teams" + "value": "Các nhóm" } ], "label.theme": [ { "type": 0, - "value": "Giao diện" + "value": "Chủ đề" } ], "label.this-month": [ @@ -1244,7 +1240,7 @@ "label.title": [ { "type": 0, - "value": "Title" + "value": "Tiêu đề" } ], "label.today": [ @@ -1262,13 +1258,13 @@ "label.total": [ { "type": 0, - "value": "Total" + "value": "Tổng" } ], "label.total-records": [ { "type": 0, - "value": "Total records" + "value": "Tổng số bản ghi" } ], "label.tracking-code": [ @@ -1280,49 +1276,49 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "Giao dịch" } ], "label.transfer": [ { "type": 0, - "value": "Transfer" + "value": "Chuyển giao" } ], "label.transfer-website": [ { "type": 0, - "value": "Transfer website" + "value": "Chuyển giao website" } ], "label.true": [ { "type": 0, - "value": "True" + "value": "Đúng" } ], "label.type": [ { "type": 0, - "value": "Type" + "value": "Loại" } ], "label.unique": [ { "type": 0, - "value": "Unique" + "value": "Duy nhất" } ], "label.unique-visitors": [ { "type": 0, - "value": "Khách truy cập một lần" + "value": "Khách truy cập duy nhất" } ], "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "Khách hàng duy nhất" } ], "label.unknown": [ @@ -1334,13 +1330,13 @@ "label.untitled": [ { "type": 0, - "value": "Untitled" + "value": "Không có tiêu đề" } ], "label.update": [ { "type": 0, - "value": "Update" + "value": "Cập nhật" } ], "label.url": [ @@ -1352,19 +1348,19 @@ "label.urls": [ { "type": 0, - "value": "URLs" + "value": "Các URL" } ], "label.user": [ { "type": 0, - "value": "User" + "value": "Người dùng" } ], "label.user-property": [ { "type": 0, - "value": "User Property" + "value": "Thuộc tính người dùng" } ], "label.username": [ @@ -1376,7 +1372,7 @@ "label.users": [ { "type": 0, - "value": "Users" + "value": "Người dùng" } ], "label.utm": [ @@ -1388,19 +1384,19 @@ "label.utm-description": [ { "type": 0, - "value": "Track your campaigns through UTM parameters." + "value": "Theo dõi các chiến dịch của bạn thông qua các tham số UTM." } ], "label.value": [ { "type": 0, - "value": "Value" + "value": "Giá trị" } ], "label.view": [ { "type": 0, - "value": "View" + "value": "Xem" } ], "label.view-details": [ @@ -1412,37 +1408,37 @@ "label.view-only": [ { "type": 0, - "value": "View only" + "value": "Chỉ xem" } ], "label.views": [ { "type": 0, - "value": "Xem" + "value": "Lượt xem" } ], "label.views-per-visit": [ { "type": 0, - "value": "Views per visit" + "value": "Lượt xem trên mỗi lượt truy cập" } ], "label.visit-duration": [ { "type": 0, - "value": "Thời gian truy cập trung bình" + "value": "Thời lượng truy cập" } ], "label.visitors": [ { "type": 0, - "value": "Khách" + "value": "Khách truy cập" } ], "label.visits": [ { "type": 0, - "value": "Visits" + "value": "Lượt truy cập" } ], "label.website": [ @@ -1454,31 +1450,31 @@ "label.website-id": [ { "type": 0, - "value": "Website ID" + "value": "ID website" } ], "label.websites": [ { "type": 0, - "value": "Websites" + "value": "Các website" } ], "label.window": [ { "type": 0, - "value": "Window" + "value": "Cửa sổ" } ], "label.yesterday": [ { "type": 0, - "value": "Yesterday" + "value": "Hôm qua" } ], "message.action-confirmation": [ { "type": 0, - "value": "Type " + "value": "Nhập " }, { "type": 1, @@ -1486,7 +1482,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " vào ô bên dưới để xác nhận." } ], "message.active-users": [ @@ -1496,7 +1492,7 @@ }, { "type": 0, - "value": " hiện tại " + "value": " " }, { "offset": 0, @@ -1505,7 +1501,7 @@ "value": [ { "type": 0, - "value": "một" + "value": "người dùng" } ] }, @@ -1513,7 +1509,7 @@ "value": [ { "type": 0, - "value": "trên" + "value": "người dùng" } ] } @@ -1521,18 +1517,22 @@ "pluralType": "cardinal", "type": 6, "value": "x" + }, + { + "type": 0, + "value": " đang hoạt động" } ], "message.collected-data": [ { "type": 0, - "value": "Collected data" + "value": "Dữ liệu đã thu thập" } ], "message.confirm-delete": [ { "type": 0, - "value": "Bạn có chắc chắn muốn xoá " + "value": "Bạn có chắc chắn muốn xóa " }, { "type": 1, @@ -1546,7 +1546,7 @@ "message.confirm-leave": [ { "type": 0, - "value": "Are you sure you want to leave " + "value": "Bạn có chắc chắn muốn rời " }, { "type": 1, @@ -1560,7 +1560,7 @@ "message.confirm-remove": [ { "type": 0, - "value": "Are you sure you want to remove " + "value": "Bạn có chắc chắn muốn xóa " }, { "type": 1, @@ -1574,7 +1574,7 @@ "message.confirm-reset": [ { "type": 0, - "value": "Bạn có chắc chắn muốn tái thiết lập thống kê " + "value": "Bạn có chắc chắn muốn đặt lại thống kê " }, { "type": 1, @@ -1588,13 +1588,13 @@ "message.delete-team-warning": [ { "type": 0, - "value": "Deleting a team will also delete all team websites." + "value": "Việc xóa một nhóm cũng sẽ xóa tất cả các website của nhóm." } ], "message.delete-website-warning": [ { "type": 0, - "value": "Tất cả các dữ liệu liên quan cũng sẽ bị xoá." + "value": "Tất cả dữ liệu liên quan cũng sẽ bị xóa." } ], "message.error": [ @@ -1610,7 +1610,7 @@ }, { "type": 0, - "value": " on " + "value": " trên " }, { "type": 1, @@ -1620,7 +1620,7 @@ "message.go-to-settings": [ { "type": 0, - "value": "Chuyển tới cài đặt" + "value": "Chuyển đến cài đặt" } ], "message.incorrect-username-password": [ @@ -1638,7 +1638,7 @@ "message.min-password-length": [ { "type": 0, - "value": "Minimum length of " + "value": "Độ dài tối thiểu " }, { "type": 1, @@ -1646,13 +1646,13 @@ }, { "type": 0, - "value": " characters" + "value": " ký tự" } ], "message.new-version-available": [ { "type": 0, - "value": "A new version of Umami " + "value": "Có phiên bản mới của Umami " }, { "type": 1, @@ -1660,7 +1660,7 @@ }, { "type": 0, - "value": " is available!" + "value": "!" } ], "message.no-data-available": [ @@ -1672,55 +1672,55 @@ "message.no-event-data": [ { "type": 0, - "value": "No event data is available." + "value": "Không có dữ liệu sự kiện." } ], "message.no-match-password": [ { "type": 0, - "value": "Mật khẩu không đồng nhất" + "value": "Mật khẩu không khớp" } ], "message.no-results-found": [ { "type": 0, - "value": "No results were found." + "value": "Không tìm thấy kết quả nào." } ], "message.no-team-websites": [ { "type": 0, - "value": "This team does not have any websites." + "value": "Nhóm này không có bất kỳ website nào." } ], "message.no-teams": [ { "type": 0, - "value": "You have not created any teams." + "value": "Bạn chưa tạo nhóm nào." } ], "message.no-users": [ { "type": 0, - "value": "There are no users." + "value": "Không có người dùng nào." } ], "message.no-websites-configured": [ { "type": 0, - "value": "Bạn chưa có bất cứ website nào." + "value": "Bạn chưa cấu hình bất kỳ website nào." } ], "message.page-not-found": [ { "type": 0, - "value": "Trang không tìm thấy." + "value": "Không tìm thấy trang." } ], "message.reset-website": [ { "type": 0, - "value": "To reset this website, type " + "value": "Để đặt lại website này, nhập " }, { "type": 1, @@ -1728,13 +1728,13 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " vào ô bên dưới để xác nhận." } ], "message.reset-website-warning": [ { "type": 0, - "value": "Tất cả số liệu thống kê của website này sẽ bị xoá, nhưng mã theo dõi sẽ vẫn giữ nguyên." + "value": "Tất cả số liệu thống kê của website này sẽ bị xóa, nhưng mã theo dõi sẽ vẫn giữ nguyên." } ], "message.saved": [ @@ -1760,19 +1760,19 @@ "message.team-already-member": [ { "type": 0, - "value": "You are already a member of the team." + "value": "Bạn đã là thành viên của nhóm." } ], "message.team-not-found": [ { "type": 0, - "value": "Team not found." + "value": "Không tìm thấy nhóm." } ], "message.team-websites-info": [ { "type": 0, - "value": "Websites can be viewed by anyone on the team." + "value": "Bất kỳ ai trong nhóm đều có thể xem các website." } ], "message.tracking-code": [ @@ -1784,37 +1784,37 @@ "message.transfer-team-website-to-user": [ { "type": 0, - "value": "Transfer this website to your account?" + "value": "Chuyển website này sang tài khoản của bạn?" } ], "message.transfer-user-website-to-team": [ { "type": 0, - "value": "Select the team to transfer this website to." + "value": "Chọn nhóm để chuyển website này đến." } ], "message.transfer-website": [ { "type": 0, - "value": "Transfer website ownership to your account or another team." + "value": "Chuyển quyền sở hữu website sang tài khoản của bạn hoặc một nhóm khác." } ], "message.triggered-event": [ { "type": 0, - "value": "Triggered event" + "value": "Sự kiện được kích hoạt" } ], "message.user-deleted": [ { "type": 0, - "value": "User deleted." + "value": "Người dùng đã bị xóa." } ], "message.viewed-page": [ { "type": 0, - "value": "Viewed page" + "value": "Đã xem trang" } ], "message.visitor-log": [ @@ -1828,7 +1828,7 @@ }, { "type": 0, - "value": " đang dùng " + "value": " đang sử dụng " }, { "type": 1, @@ -1854,7 +1854,7 @@ "message.visitors-dropped-off": [ { "type": 0, - "value": "Visitors dropped off" + "value": "Khách truy cập đã rời đi" } ] } diff --git a/src/app/api/websites/[websiteId]/route.ts b/src/app/api/websites/[websiteId]/route.ts index 346e5856..4f8763b5 100644 --- a/src/app/api/websites/[websiteId]/route.ts +++ b/src/app/api/websites/[websiteId]/route.ts @@ -31,8 +31,8 @@ export async function POST( { params }: { params: Promise<{ websiteId: string }> }, ) { const schema = z.object({ - name: z.string(), - domain: z.string(), + name: z.string().optional(), + domain: z.string().optional(), shareId: z.string().regex(SHARE_ID_REGEX).nullable().optional(), }); diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json index 5f930be7..9bcfab50 100644 --- a/src/lang/es-ES.json +++ b/src/lang/es-ES.json @@ -78,7 +78,7 @@ "label.filter-combined": "Combinado", "label.filter-raw": "En crudo", "label.filters": "Filtros", - "label.first-seen": "First seen", + "label.first-seen": "Visto por primera vez", "label.funnel": "Embudo", "label.funnel-description": "Comprender conversión y abandono de usuarios.", "label.goal": "Objetivo", @@ -104,7 +104,7 @@ "label.last-days": "Últimos {x} días", "label.last-hours": "Últimas {x} horas", "label.last-months": "Últimos {x} meses", - "label.last-seen": "Last seen", + "label.last-seen": "Visto por última vez", "label.leave": "Abandonar", "label.leave-team": "Abandonar equipo", "label.less-than": "Menor que", @@ -124,7 +124,7 @@ "label.name": "Nombre", "label.new-password": "Nueva contraseña", "label.none": "Ninguno", - "label.number-of-records": "{x} {x, plural, one {record} other {records}}", + "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", "label.ok": "OK", "label.os": "Sistema", "label.overview": "Resumen", @@ -141,7 +141,7 @@ "label.previous-period": "Periodo anterior", "label.previous-year": "Año anterior", "label.profile": "Perfil", - "label.properties": "Properties", + "label.properties": "Propiedades", "label.property": "Propiedad", "label.queries": "Consultas", "label.query": "Consulta", @@ -161,9 +161,9 @@ "label.reset-website": "Reiniciar analíticas", "label.retention": "Retención", "label.retention-description": "Medir la frecuencia con la que los usuarios vuelven a tu sitio web.", - "label.revenue": "Revenue", - "label.revenue-description": "Look into your revenue across time.", - "label.revenue-property": "Revenue Property", + "label.revenue": "Ganancias", + "label.revenue-description": "Analice sus ganancias a lo largo del tiempo.", + "label.revenue-property": "Propiedad de ganancias", "label.role": "Rol", "label.run-query": "Ejecutar consulta", "label.save": "Guardar", @@ -173,7 +173,7 @@ "label.select-date": "Seleccionar fecha", "label.select-role": "Seleccionar rol", "label.select-website": "Seleccionar sitio web", - "label.session": "Session", + "label.session": "Sesión", "label.sessions": "Sesiones", "label.settings": "Ajustes", "label.share-url": "Compartir URL", @@ -202,21 +202,21 @@ "label.total": "Total", "label.total-records": "Total de registros", "label.tracking-code": "Código de rastreo", - "label.transactions": "Transactions", + "label.transactions": "Transacciones", "label.transfer": "Transferir", "label.transfer-website": "Transferir sitio web", "label.true": "Verdadero", "label.type": "Tipo", "label.unique": "Único", "label.unique-visitors": "Visitantes únicos", - "label.uniqueCustomers": "Unique Customers", + "label.uniqueCustomers": "Clientes únicos", "label.unknown": "Desconocida", "label.untitled": "Sin título", "label.update": "Actualizar", "label.url": "URL", "label.urls": "URLs", "label.user": "Usuario", - "label.user-property": "User Property", + "label.user-property": "Propiedad de usuario", "label.username": "Nombre de usuario", "label.users": "Usuarios", "label.utm": "UTM", diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json index bd180bfb..9113aa45 100644 --- a/src/lang/sl-SI.json +++ b/src/lang/sl-SI.json @@ -4,8 +4,8 @@ "label.activity": "Dnevnik dejavnosti", "label.add": "Dodaj", "label.add-description": "Dodaj opis", - "label.add-member": "Add member", - "label.add-step": "Add step", + "label.add-member": "Dodaj člana", + "label.add-step": "Dodaj korak", "label.add-website": "Dodaj spletno mesto", "label.admin": "Administrator", "label.after": "Po", @@ -24,21 +24,21 @@ "label.cities": "Mesta", "label.city": "Mesto", "label.clear-all": "Počisti vse", - "label.compare": "Compare", + "label.compare": "Primerjaj", "label.confirm": "Potrdi", "label.confirm-password": "Potrdi geslo", "label.contains": "Vsebuje", "label.continue": "Nadaljuj", - "label.count": "Count", + "label.count": "Število", "label.countries": "Države", "label.country": "Država", - "label.create": "Create", + "label.create": "Ustvari", "label.create-report": "Ustvari poročilo", "label.create-team": "Ustvari ekipo", "label.create-user": "Ustvari uporabnika", "label.created": "Ustvarjeno", - "label.created-by": "Created By", - "label.current": "Current", + "label.created-by": "Ustvaril", + "label.current": "Trenutno", "label.current-password": "Trenutno geslo", "label.custom-range": "Obdobje po meri", "label.dashboard": "Nadzorna plošča", @@ -48,7 +48,7 @@ "label.day": "Dan", "label.default-date-range": "Privzeto časovno obdobje", "label.delete": "Izbriši", - "label.delete-report": "Delete report", + "label.delete-report": "Izbriši poročilo", "label.delete-team": "Izbriši ekipo", "label.delete-user": "Izbriši uporabnika", "label.delete-website": "Izbriši spletno mesto", @@ -63,14 +63,14 @@ "label.dropoff": "Zapustitev", "label.edit": "Uredi", "label.edit-dashboard": "Uredi nadzorno ploščo", - "label.edit-member": "Edit member", - "label.enable-share-url": "Uredi povezavo za deljenje", - "label.end-step": "End Step", - "label.entry": "Entry URL", + "label.edit-member": "Uredi člana", + "label.enable-share-url": "Omogoči povezavo za deljenje", + "label.end-step": "Končni korak", + "label.entry": "Vstopni URL", "label.event": "Dogodek", "label.event-data": "Podatki dogodka", "label.events": "Dogodki", - "label.exit": "Exit URL", + "label.exit": "Izhodni URL", "label.false": "Napačno", "label.field": "Polje", "label.fields": "Polja", @@ -78,48 +78,48 @@ "label.filter-combined": "Skupaj", "label.filter-raw": "Neobdelano", "label.filters": "Filtri", - "label.first-seen": "First seen", + "label.first-seen": "Prvič viden", "label.funnel": "Prodajni lijak", - "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.funnel-description": "Razumite stopnjo konverzije in osipa uporabnikov.", + "label.goal": "Cilj", + "label.goals": "Cilji", + "label.goals-description": "Spremljajte svoje cilje za oglede strani in dogodke.", "label.greater-than": "Večje od", "label.greater-than-equals": "Večje ali enako kot", - "label.host": "Host", - "label.hosts": "Hosts", + "label.host": "Gostitelj", + "label.hosts": "Gostitelji", "label.insights": "Vpogled", - "label.insights-description": "Dive deeper into your data by using segments and filters.", + "label.insights-description": "Poglobite se v podatke z uporabo segmentov in filtrov.", "label.is": "Je", "label.is-not": "Ni", "label.is-not-set": "Ni nastavljeno", "label.is-set": "Je nastavljeno", "label.join": "Pridruži se", "label.join-team": "Pridruži se ekipi", - "label.journey": "Journey", - "label.journey-description": "Understand how users navigate through your website.", + "label.journey": "Uporabniška pot", + "label.journey-description": "Razumite, kako uporabniki krmarijo po vašem spletnem mestu.", "label.language": "Jezik", "label.languages": "Jeziki", "label.laptop": "Prenosni računalnik", "label.last-days": "Zadnjih {x} dni", "label.last-hours": "Zadnjih {x} ur", - "label.last-months": "Last {x} months", - "label.last-seen": "Last seen", + "label.last-months": "Zadnjih {x} mesecev", + "label.last-seen": "Nazadnje viden", "label.leave": "Zapusti", "label.leave-team": "Zapusti ekipo", "label.less-than": "Manjše kot", "label.less-than-equals": "Manjše ali enako kot", "label.login": "Prijava", "label.logout": "Odjava", - "label.manage": "Manage", - "label.manager": "Manager", + "label.manage": "Upravljaj", + "label.manager": "Upravitelj", "label.max": "Največ", - "label.member": "Member", + "label.member": "Član", "label.members": "Člani", "label.min": "Najmanj", "label.mobile": "Mobilne naprave", "label.more": "Več", - "label.my-account": "My account", + "label.my-account": "Moj račun", "label.my-websites": "Moja spletna mesta", "label.name": "Ime", "label.new-password": "Novo geslo", @@ -134,15 +134,15 @@ "label.pageTitle": "Naslov strani", "label.pages": "Strani", "label.password": "Geslo", - "label.path": "Path", - "label.paths": "Paths", + "label.path": "Pot", + "label.paths": "Poti", "label.powered-by": "Poganja {name}", - "label.previous": "Previous", - "label.previous-period": "Previous period", - "label.previous-year": "Previous year", + "label.previous": "Prejšnji", + "label.previous-period": "Prejšnje obdobje", + "label.previous-year": "Prejšnje leto", "label.profile": "Profil", - "label.properties": "Properties", - "label.property": "Property", + "label.properties": "Lastnosti", + "label.property": "Lastnost", "label.queries": "Poizvedbe", "label.query": "Poizvedba", "label.query-parameters": "Parametri poizvedbe", @@ -154,41 +154,41 @@ "label.region": "Regija", "label.regions": "Regije", "label.remove": "Odstrani", - "label.remove-member": "Remove member", + "label.remove-member": "Odstrani člana", "label.reports": "Poročila", "label.required": "Zahtevano", "label.reset": "Ponastavi", "label.reset-website": "Ponastavi statistiko", "label.retention": "Ohranjanje uporabnikov", - "label.retention-description": "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": "Merite uporabnikovo zadržanost s sledenjem, kako pogosto se vračajo.", + "label.revenue": "Prihodki", + "label.revenue-description": "Preglejte svoje prihodke skozi čas.", + "label.revenue-property": "Lastnost prihodkov", "label.role": "Vloga", "label.run-query": "Izvedi poizvedbo", "label.save": "Shrani", "label.screens": "Zasloni", - "label.search": "Search", - "label.select": "Select", + "label.search": "Išči", + "label.select": "Izberi", "label.select-date": "Izberi datum", - "label.select-role": "Select role", + "label.select-role": "Izberi vlogo", "label.select-website": "Izberi spletno mesto", - "label.session": "Session", + "label.session": "Seja", "label.sessions": "Seje", "label.settings": "Nastavitve", "label.share-url": "Deli povezavo", "label.single-day": "En dan", - "label.start-step": "Start Step", - "label.steps": "Steps", + "label.start-step": "Začetni korak", + "label.steps": "Koraki", "label.sum": "Seštevek", "label.tablet": "Tablični računalnik", "label.team": "Ekipa", "label.team-id": "ID ekipe", - "label.team-manager": "Team manager", + "label.team-manager": "Upravitelj ekipe", "label.team-member": "Član ekipe", "label.team-name": "Ime ekipe", "label.team-owner": "Lastnik ekipe", - "label.team-view-only": "Team view only", + "label.team-view-only": "Ekipa samo za ogled", "label.team-websites": "Spletna mesta ekipe", "label.teams": "Ekipe", "label.theme": "Tema", @@ -232,17 +232,17 @@ "label.visits": "Visits", "label.website": "Spletno mesto", "label.website-id": "ID spletnega mesta", - "label.websites": "Spletnih mest", + "label.websites": "Spletna mesta", "label.window": "Okno", "label.yesterday": "Včeraj", - "message.action-confirmation": "Type {confirmation} in the box below to confirm.", + "message.action-confirmation": "Za potrditev v spodnje polje vnesite {confirmation}.", "message.active-users": "{x} trenutni {x, plural, one {obiskovalec} other {obiskovalcev}}", - "message.collected-data": "Collected data", + "message.collected-data": "Zbrani podatki", "message.confirm-delete": "Ste prepričani, da želite izbrisati {target}?", "message.confirm-leave": "Ste prepričani, da želite zapustiti {target}?", - "message.confirm-remove": "Are you sure you want to remove {target}?", + "message.confirm-remove": "Ali ste prepričani, da želite odstraniti {target}?", "message.confirm-reset": "Ste prepričani, da želite ponastaviti statistiko {target}?", - "message.delete-team-warning": "Deleting a team will also delete all team websites.", + "message.delete-team-warning": "Brisanje ekipe bo izbrisalo tudi vsa spletna mesta ekipe.", "message.delete-website-warning": "Izbrisani bodo tudi vsi pripadajoči podatki.", "message.error": "Nekaj je šlo narobe.", "message.event-log": "{event} na {url}", @@ -268,12 +268,12 @@ "message.team-not-found": "Ekipa ni bila najdena.", "message.team-websites-info": "Spletne strani si lahko ogleda vsak član ekipe.", "message.tracking-code": "Koda za sledenje", - "message.transfer-team-website-to-user": "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": "Želite prenesti to spletno mesto v svoj račun?", + "message.transfer-user-website-to-team": "Izberite ekipo, na katero želite prenesti to spletno mesto.", + "message.transfer-website": "Prenesite lastništvo spletnega mesta na svoj račun ali drugo ekipo.", + "message.triggered-event": "Sprožen dogodek", "message.user-deleted": "Uporabnik je izbrisan.", - "message.viewed-page": "Viewed page", + "message.viewed-page": "Ogledana stran", "message.visitor-log": "Obiskovalec iz {country} uporablja {browser} na {os} {device}", - "message.visitors-dropped-off": "Visitors dropped off" + "message.visitors-dropped-off": "Osip obiskovalcev" } diff --git a/src/lang/uz-UZ.json b/src/lang/uz-UZ.json new file mode 100644 index 00000000..e8a574c7 --- /dev/null +++ b/src/lang/uz-UZ.json @@ -0,0 +1,279 @@ +{ + "label.access-code": "Kirish kodi", + "label.actions": "Amallar", + "label.activity": "Faoliyat", + "label.add": "Qoʻshish", + "label.add-description": "Tavsif qoʻshish", + "label.add-member": "A'zo qoʻshish", + "label.add-step": "Qadam qoʻshish", + "label.add-website": "Veb-sayt qoʻshish", + "label.admin": "Administrator", + "label.after": "Keyin", + "label.all": "Barchasi", + "label.all-time": "Barcha vaqtlar", + "label.analytics": "Tahlil", + "label.average": "Oʻrtacha", + "label.back": "Orqaga", + "label.before": "Oldin", + "label.bounce-rate": "Chiqib ketish darajasi", + "label.breakdown": "Tahlil", + "label.browser": "Brauzer", + "label.browsers": "Brauzerlar", + "label.cancel": "Bekor qilish", + "label.change-password": "Parolni oʻzgartirish", + "label.cities": "Shaharlar", + "label.city": "Shahar", + "label.clear-all": "Barchasini tozalash", + "label.compare": "Taqqoslash", + "label.confirm": "Tasdiqlash", + "label.confirm-password": "Parolni tasdiqlash", + "label.contains": "Oʻz ichiga oladi", + "label.continue": "Davom etish", + "label.count": "Soni", + "label.countries": "Davlatlar", + "label.country": "Davlat", + "label.create": "Yaratish", + "label.create-report": "Hisobot yaratish", + "label.create-team": "Jamoa yaratish", + "label.create-user": "Foydalanuvchi yaratish", + "label.created": "Yaratilgan", + "label.created-by": "Kim tomonidan yaratilgan", + "label.current": "Joriy", + "label.current-password": "Joriy parol", + "label.custom-range": "Maxsus oraliq", + "label.dashboard": "Boshqaruv paneli", + "label.data": "Ma'lumotlar", + "label.date": "Sana", + "label.date-range": "Sana oraligʻi", + "label.day": "Kun", + "label.default-date-range": "Standart sana oraligʻi", + "label.delete": "Oʻchirish", + "label.delete-report": "Hisobotni oʻchirish", + "label.delete-team": "Jamoani oʻchirish", + "label.delete-user": "Foydalanuvchini oʻchirish", + "label.delete-website": "Veb-saytni oʻchirish", + "label.description": "Tavsif", + "label.desktop": "Ish stoli", + "label.details": "Batafsil ma'lumot", + "label.device": "Qurilma", + "label.devices": "Qurilmalar", + "label.dismiss": "Yopish", + "label.does-not-contain": "Oʻz ichiga olmaydi", + "label.domain": "Domen", + "label.dropoff": "Tashlab ketish", + "label.edit": "Tahrirlash", + "label.edit-dashboard": "Boshqaruv panelini tahrirlash", + "label.edit-member": "A'zoni tahrirlash", + "label.enable-share-url": "Ulashish URL'ini yoqish", + "label.end-step": "Yakuniy qadam", + "label.entry": "Kirish yoʻli", + "label.event": "Hodisa", + "label.event-data": "Hodisa ma'lumotlari", + "label.events": "Hodisalar", + "label.exit": "Chiqish yoʻli", + "label.false": "Yolgʻon", + "label.field": "Maydon", + "label.fields": "Maydonlar", + "label.filter": "Filtr", + "label.filter-combined": "Birlashtirilgan", + "label.filter-raw": "Xom", + "label.filters": "Filtrlar", + "label.first-seen": "Birinchi koʻrilgan", + "label.funnel": "Voronka", + "label.funnel-description": "Foydalanuvchilarning konversiya va tashlab ketish darajasini tushunish.", + "label.goal": "Maqsad", + "label.goals": "Maqsadlar", + "label.goals-description": "Sahifa koʻrishlari va hodisalar uchun maqsadlaringizni kuzatib boring.", + "label.greater-than": "Kattaroq", + "label.greater-than-equals": "Kattaroq yoki teng", + "label.host": "Xost", + "label.hosts": "Xostlar", + "label.insights": "Tushunchalar", + "label.insights-description": "Segmentlar va filtrlardan foydalanib ma'lumotlaringizga chuqurroq kiring.", + "label.is": "Teng", + "label.is-not": "Teng emas", + "label.is-not-set": "Oʻrnatilmagan", + "label.is-set": "Oʻrnatilgan", + "label.join": "Qoʻshilish", + "label.join-team": "Jamoaga qoʻshilish", + "label.journey": "Sayohat", + "label.journey-description": "Foydalanuvchilar veb-saytingizda qanday harakat qilishlarini tushunish.", + "label.language": "Til", + "label.languages": "Tillar", + "label.laptop": "Noutbuk", + "label.last-days": "Oxirgi {x} kun", + "label.last-hours": "Oxirgi {x} soat", + "label.last-months": "Oxirgi {x} oy", + "label.last-seen": "Oxirgi koʻrilgan", + "label.leave": "Tark etish", + "label.leave-team": "Jamoani tark etish", + "label.less-than": "Kichikroq", + "label.less-than-equals": "Kichikroq yoki teng", + "label.login": "Kirish", + "label.logout": "Chiqish", + "label.manage": "Boshqarish", + "label.manager": "Menejer", + "label.max": "Maksimal", + "label.member": "A'zo", + "label.members": "A'zolar", + "label.min": "Minimal", + "label.mobile": "Mobil", + "label.more": "Koʻproq", + "label.my-account": "Mening hisobim", + "label.my-websites": "Mening veb-saytlarim", + "label.name": "Ism", + "label.new-password": "Yangi parol", + "label.none": "Hech biri", + "label.number-of-records": "{x} yozuv", + "label.ok": "OK", + "label.os": "OT (Operatsion tizim)", + "label.overview": "Umumiy koʻrinish", + "label.owner": "Egasi", + "label.page-of": "Sahifa {current} dan {total}", + "label.page-views": "Sahifa koʻrishlari", + "label.pageTitle": "Sahifa sarlavhasi", + "label.pages": "Sahifalar", + "label.password": "Parol", + "label.path": "Yoʻl", + "label.paths": "Yoʻllar", + "label.powered-by": "{name} tomonidan quvvatlanadi", + "label.previous": "Oldingi", + "label.previous-period": "Oldingi davr", + "label.previous-year": "Oldingi yil", + "label.profile": "Profil", + "label.properties": "Xususiyatlar", + "label.property": "Xususiyat", + "label.queries": "Soʻrovlar", + "label.query": "Soʻrov", + "label.query-parameters": "Soʻrov parametrlari", + "label.realtime": "Haqiqiy vaqt", + "label.referrer": "Tavsiya etuvchi", + "label.referrers": "Tavsiya etuvchilar", + "label.refresh": "Yangilash", + "label.regenerate": "Qayta yaratish", + "label.region": "Viloyat/Mintaqa", + "label.regions": "Viloyatlar/Mintaqalar", + "label.remove": "Olib tashlash", + "label.remove-member": "A'zoni olib tashlash", + "label.reports": "Hisobotlar", + "label.required": "Majburiy", + "label.reset": "Qayta tiklash", + "label.reset-website": "Veb-saytni qayta tiklash", + "label.retention": "Saqlanish", + "label.retention-description": "Foydalanuvchilarning qaytish chastotasini kuzatib, veb-saytingizning jozibadorligini oʻlchang.", + "label.revenue": "Daromad", + "label.revenue-description": "Vaqt oʻtishi bilan daromadingizni tekshiring.", + "label.revenue-property": "Daromad xususiyati", + "label.role": "Rol", + "label.run-query": "Soʻrovni ishga tushirish", + "label.save": "Saqlash", + "label.screens": "Ekranlar", + "label.search": "Qidiruv", + "label.select": "Tanlash", + "label.select-date": "Sanani tanlash", + "label.select-role": "Rolni tanlash", + "label.select-website": "Veb-saytni tanlash", + "label.session": "Sessiya", + "label.sessions": "Sessiyalar", + "label.settings": "Sozlamalar", + "label.share-url": "Ulashish URL'i", + "label.single-day": "Bir kun", + "label.start-step": "Boshlanish qadami", + "label.steps": "Qadamlar", + "label.sum": "Yigʻindi", + "label.tablet": "Planshet", + "label.team": "Jamoa", + "label.team-id": "Jamoa ID'si", + "label.team-manager": "Jamoa menejeri", + "label.team-member": "Jamoa a'zosi", + "label.team-name": "Jamoa nomi", + "label.team-owner": "Jamoa egasi", + "label.team-view-only": "Jamoa faqat koʻrish", + "label.team-websites": "Jamoa veb-saytlari", + "label.teams": "Jamoalar", + "label.theme": "Mavzu", + "label.this-month": "Shu oy", + "label.this-week": "Shu hafta", + "label.this-year": "Shu yil", + "label.timezone": "Vaqt zonasi", + "label.title": "Sarlavha", + "label.today": "Bugun", + "label.toggle-charts": "Grafiklarni almashtirish", + "label.total": "Jami", + "label.total-records": "Jami yozuvlar", + "label.tracking-code": "Kuzatuv kodi", + "label.transactions": "Tranzaksiyalar", + "label.transfer": "Oʻtkazish", + "label.transfer-website": "Veb-saytni oʻtkazish", + "label.true": "Rost", + "label.type": "Tur", + "label.unique": "Noyob", + "label.unique-visitors": "Noyob tashrif buyuruvchilar", + "label.uniqueCustomers": "Noyob mijozlar", + "label.unknown": "Noma'lum", + "label.untitled": "Sarlavhasiz", + "label.update": "Yangilash", + "label.url": "URL", + "label.urls": "URL'lar", + "label.user": "Foydalanuvchi", + "label.user-property": "Foydalanuvchi xususiyati", + "label.username": "Foydalanuvchi nomi", + "label.users": "Foydalanuvchilar", + "label.utm": "UTM", + "label.utm-description": "UTM parametrlari orqali kampaniyalaringizni kuzatib boring.", + "label.value": "Qiymat", + "label.view": "Koʻrish", + "label.view-details": "Batafsil koʻrish", + "label.view-only": "Faqat koʻrish", + "label.views": "Koʻrishlar", + "label.views-per-visit": "Tashrifga koʻrishlar soni", + "label.visit-duration": "Tashrif davomiyligi", + "label.visitors": "Tashrif buyuruvchilar", + "label.visits": "Tashriflar", + "label.website": "Veb-sayt", + "label.website-id": "Veb-sayt ID'si", + "label.websites": "Veb-saytlar", + "label.window": "Oyna", + "label.yesterday": "Kecha", + "message.action-confirmation": "Tasdiqlash uchun pastdagi qutiga **{confirmation}** yozing.", + "message.active-users": "{x} joriy {x, plural, one {tashrif buyuruvchi} other {tashrif buyuruvchilar}}", + "message.collected-data": "Yigʻilgan ma'lumotlar", + "message.confirm-delete": "**{target}** ni oʻchirmoqchi ekanligingizga ishonchingiz komilmi?", + "message.confirm-leave": "**{target}** ni tark etmoqchi ekanligingizga ishonchingiz komilmi?", + "message.confirm-remove": "**{target}** ni olib tashlamoqchi ekanligingizga ishonchingiz komilmi?", + "message.confirm-reset": "**{target}** ni qayta tiklamoqchi ekanligingizga ishonchingiz komilmi?", + "message.delete-team-warning": "Jamoani oʻchirish, shuningdek, barcha jamoa veb-saytlarini ham oʻchiradi.", + "message.delete-website-warning": "Barcha veb-sayt ma'lumotlari oʻchiriladi.", + "message.error": "Nimadir xato ketdi.", + "message.event-log": "**{url}** da **{event}** hodisasi", + "message.go-to-settings": "Sozlamalarga oʻtish", + "message.incorrect-username-password": "Notoʻgʻri foydalanuvchi nomi va/yoki parol.", + "message.invalid-domain": "Notoʻgʻri domen. http/https qoʻshmang.", + "message.min-password-length": "Minimal uzunligi {n} belgidan", + "message.new-version-available": "Umami'ning yangi **{version}** versiyasi mavjud!", + "message.no-data-available": "Ma'lumotlar mavjud emas.", + "message.no-event-data": "Hodisa ma'lumotlari mavjud emas.", + "message.no-match-password": "Parollar mos kelmadi.", + "message.no-results-found": "Hech qanday natija topilmadi.", + "message.no-team-websites": "Bu jamoada hech qanday veb-sayt yoʻq.", + "message.no-teams": "Siz hech qanday jamoa yaratmagansiz.", + "message.no-users": "Hech qanday foydalanuvchi yoʻq.", + "message.no-websites-configured": "Sizda hech qanday veb-sayt sozlanmagan.", + "message.page-not-found": "Sahifa topilmadi", + "message.reset-website": "Bu veb-saytni qayta tiklash uchun tasdiqlash uchun pastdagi qutiga **{confirmation}** yozing.", + "message.reset-website-warning": "Bu veb-sayt uchun barcha statistik ma'lumotlar oʻchiriladi, lekin sozlamalaringiz saqlanib qoladi.", + "message.saved": "Saqlandi.", + "message.share-url": "Sizning veb-sayt statistikalaringiz quyidagi URL'da ochiqdir:", + "message.team-already-member": "Siz allaqachon jamoa a'zosisiz.", + "message.team-not-found": "Jamoa topilmadi.", + "message.team-websites-info": "Veb-saytlarni jamoaning har bir a'zosi koʻrishi mumkin.", + "message.tracking-code": "Bu veb-sayt uchun statistikani kuzatish uchun quyidagi kodni HTML'ingizdagi **...** qismiga joylashtiring.", + "message.transfer-team-website-to-user": "Bu veb-saytni oʻz hisobingizga oʻtkazasizmi?", + "message.transfer-user-website-to-team": "Bu veb-saytni oʻtkazish uchun jamoani tanlang.", + "message.transfer-website": "Veb-sayt egaligini oʻz hisobingizga yoki boshqa jamoaga oʻtkazish.", + "message.triggered-event": "Hodisa ishga tushirildi", + "message.user-deleted": "Foydalanuvchi oʻchirildi.", + "message.viewed-page": "Sahifa koʻrildi", + "message.visitor-log": "{os} {device} da {browser} dan foydalanayotgan {country} dan tashrif buyuruvchi", + "message.visitors-dropped-off": "Tashrif buyuruvchilar tashlab ketishdi" +} diff --git a/src/lib/__tests__/detect.test.ts b/src/lib/__tests__/detect.test.ts index 1cb558ad..0ee34572 100644 --- a/src/lib/__tests__/detect.test.ts +++ b/src/lib/__tests__/detect.test.ts @@ -2,6 +2,7 @@ import * as detect from '../detect'; import { expect } from '@jest/globals'; const IP = '127.0.0.1'; +const BAD_IP = '127.127.127.127'; test('getIpAddress: Custom header', () => { process.env.CLIENT_IP_HEADER = 'x-custom-ip-header'; @@ -17,6 +18,12 @@ test('getIpAddress: Standard header', () => { expect(detect.getIpAddress(new Headers({ 'x-forwarded-for': IP }))).toEqual(IP); }); +test('getIpAddress: CloudFlare header is lower priority than standard header', () => { + expect( + detect.getIpAddress(new Headers({ 'cf-connecting-ip': BAD_IP, 'x-forwarded-for': IP })), + ).toEqual(IP); +}); + test('getIpAddress: No header', () => { expect(detect.getIpAddress(new Headers())).toEqual(null); }); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 7ac1d2ab..e13ca381 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -154,12 +154,12 @@ export const KAFKA_TOPIC = { export const ROLES = { admin: 'admin', - user: 'user', - viewOnly: 'view-only', - teamOwner: 'team-owner', teamManager: 'team-manager', teamMember: 'team-member', + teamOwner: 'team-owner', teamViewOnly: 'team-view-only', + user: 'user', + viewOnly: 'view-only', } as const; export const PERMISSIONS = { @@ -267,7 +267,7 @@ export const URL_LENGTH = 500; export const PAGE_TITLE_LENGTH = 500; export const EVENT_NAME_LENGTH = 50; -export const UTM_PARAMS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; +export const UTM_PARAMS = ['utm_campaign', 'utm_content', 'utm_medium', 'utm_source', 'utm_term']; export const DESKTOP_OS = [ 'BeOS', @@ -305,8 +305,8 @@ export const OS_NAMES = { export const BROWSERS = { android: 'Android', aol: 'AOL', - beaker: 'Beaker', bb10: 'BlackBerry 10', + beaker: 'Beaker', chrome: 'Chrome', 'chromium-webview': 'Chrome (webview)', crios: 'Chrome (iOS)', @@ -328,15 +328,17 @@ export const BROWSERS = { phantomjs: 'PhantomJS', safari: 'Safari', samsung: 'Samsung', - silk: 'Silk', searchbot: 'Searchbot', + silk: 'Silk', yandexbrowser: 'Yandex', }; +// The order here is important and influences how IPs are detected by lib/detect.ts +// Please do not change the order unless you know exactly what you're doing - read https://developers.cloudflare.com/fundamentals/reference/http-headers/ export const IP_ADDRESS_HEADERS = [ - 'cf-connecting-ip', 'x-client-ip', 'x-forwarded-for', + 'cf-connecting-ip', // This should be *after* x-forwarded-for, so that x-forwarded-for is respected if present 'do-connecting-ip', 'fastly-client-ip', 'true-client-ip', @@ -345,349 +347,348 @@ export const IP_ADDRESS_HEADERS = [ 'x-forwarded', 'forwarded', 'x-appengine-user-ip', + 'x-nf-client-connection-ip', + 'x-real-ip', ]; export const SOCIAL_DOMAINS = [ + 'bsky.app', 'facebook.com', 'fb.com', - 'instagram.com', 'ig.com', - 'twitter.com', - 't.co', - 'x.com', + 'instagram.com', 'linkedin.', - 'tiktok.', - 'reddit.', - 'threads.net', - 'bsky.app', 'news.ycombinator.com', - 'snapchat.', 'pinterest.', + 'reddit.', + 'snapchat.', + 't.co', + 'threads.net', + 'tiktok.', + 'twitter.com', + 'x.com', ]; export const SEARCH_DOMAINS = [ - 'google.', + 'baidu.com', 'bing.com', - 'msn.com', + 'chatgpt.com', 'duckduckgo.com', + 'ecosia.org', + 'google.', + 'msn.com', + 'perplexity.ai', 'search.brave.com', 'yandex.', - 'baidu.com', - 'ecosia.org', - 'chatgpt.com', - 'perplexity.ai', ]; export const SHOPPING_DOMAINS = [ - 'amazon.', - 'ebay.com', - 'walmart.com', - 'alibab.com', + 'alibaba.com', 'aliexpress.com', - 'etsy.com', + 'amazon.', 'bestbuy.com', - 'target.com', + 'ebay.com', + 'etsy.com', 'newegg.com', + 'target.com', + 'walmart.com', ]; export const EMAIL_DOMAINS = [ 'gmail.', + 'hotmail.', 'mail.yahoo.', 'outlook.', - 'hotmail.', - 'protonmail.', 'proton.me', + 'protonmail.', ]; -export const VIDEO_DOMAINS = ['youtube.', 'twitch.']; +export const VIDEO_DOMAINS = ['twitch.', 'youtube.']; export const PAID_AD_PARAMS = [ - 'utm_source=google', - 'gclid=', - 'fbclid=', - 'msclkid=', - 'dclid=', - 'twclid=', - 'li_fat_id=', - 'epik=', - 'ttclid=', - 'scid=', - 'aid=', - 'pc_id=', 'ad_id=', - 'rdt_cid=', + 'aid=', + 'dclid=', + 'epik=', + 'fbclid=', + 'gclid=', + 'li_fat_id=', + 'msclkid=', 'ob_click_id=', + 'pc_id=', + 'rdt_cid=', + 'scid=', + 'ttclid=', + 'twclid=', 'utm_medium=cpc', 'utm_medium=paid', 'utm_medium=paid_social', + 'utm_source=google', ]; export const GROUPED_DOMAINS = [ - { name: 'Google', domain: 'google.com', match: 'google.' }, - { name: 'Facebook', domain: 'facebook.com', match: 'facebook.' }, - { name: 'Reddit', domain: 'reddit.com', match: 'reddit.' }, - { name: 'LinkedIn', domain: 'linkedin.com', match: 'linkedin.' }, - { name: 'GitHub', domain: 'github.com', match: 'github.' }, - { name: 'Hacker News', domain: 'news.ycombinator.com', match: 'news.ycombinator.com' }, { name: 'Bing', domain: 'bing.com', match: 'bing.' }, { name: 'Brave', domain: 'brave.com', match: 'brave.' }, - { name: 'DuckDuckGo', domain: 'duckduckgo.com', match: 'duckduckgo.' }, - { name: 'Twitter', domain: 'twitter.com', match: ['twitter.', 't.co', 'x.com'] }, - { name: 'Instagram', domain: 'instagram.com', match: ['instagram.', 'ig.com'] }, - { name: 'Snapchat', domain: 'snapchat.com', match: 'snapchat.' }, - { name: 'Pinterest', domain: 'pinterest.com', match: 'pinterest.' }, { name: 'ChatGPT', domain: 'chatgpt.com', match: 'chatgpt.' }, + { name: 'DuckDuckGo', domain: 'duckduckgo.com', match: 'duckduckgo.' }, + { name: 'Facebook', domain: 'facebook.com', match: 'facebook.' }, + { name: 'GitHub', domain: 'github.com', match: 'github.' }, + { name: 'Google', domain: 'google.com', match: 'google.' }, + { name: 'Hacker News', domain: 'news.ycombinator.com', match: 'news.ycombinator.com' }, + { name: 'Instagram', domain: 'instagram.com', match: ['instagram.', 'ig.com'] }, + { name: 'LinkedIn', domain: 'linkedin.com', match: 'linkedin.' }, + { name: 'Pinterest', domain: 'pinterest.com', match: 'pinterest.' }, + { name: 'Reddit', domain: 'reddit.com', match: 'reddit.' }, + { name: 'Snapchat', domain: 'snapchat.com', match: 'snapchat.' }, + { name: 'Twitter', domain: 'twitter.com', match: ['twitter.', 't.co', 'x.com'] }, ]; export const MAP_FILE = '/datamaps.world.json'; export const ISO_COUNTRIES = { + ABW: 'AW', AFG: 'AF', - ALA: 'AX', - ALB: 'AL', - DZA: 'DZ', - ASM: 'AS', - AND: 'AD', AGO: 'AO', AIA: 'AI', - ATA: 'AQ', - ATG: 'AG', + ALA: 'AX', + ALB: 'AL', + AND: 'AD', + ANT: 'AN', + ARE: 'AE', ARG: 'AR', ARM: 'AM', - ABW: 'AW', + ASM: 'AS', + ATF: 'TF', + ATG: 'AG', AUS: 'AU', AUT: 'AT', AZE: 'AZ', - BHS: 'BS', - BHR: 'BH', - BGD: 'BD', - BRB: 'BB', - BLR: 'BY', - BEL: 'BE', - BLZ: 'BZ', - BEN: 'BJ', - BMU: 'BM', - BTN: 'BT', - BOL: 'BO', - BIH: 'BA', - BWA: 'BW', - BVT: 'BV', - BRA: 'BR', - VGB: 'VG', - IOT: 'IO', - BRN: 'BN', - BGR: 'BG', - BFA: 'BF', BDI: 'BI', - KHM: 'KH', - CMR: 'CM', - CAN: 'CA', - CPV: 'CV', - CYM: 'KY', + BEL: 'BE', + BEN: 'BJ', + BFA: 'BF', + BGD: 'BD', + BGR: 'BG', + BHR: 'BH', + BHS: 'BS', + BIH: 'BA', + BLR: 'BY', + BLZ: 'BZ', + BLM: 'BL', + BMU: 'BM', + BOL: 'BO', + BRA: 'BR', + BRB: 'BB', + BRN: 'BN', + BTN: 'BT', + BVT: 'BV', + BWA: 'BW', CAF: 'CF', - TCD: 'TD', + CAN: 'CA', + CCK: 'CC', + CHE: 'CH', CHL: 'CL', CHN: 'CN', - HKG: 'HK', - MAC: 'MO', - CXR: 'CX', - CCK: 'CC', + CIV: 'CI', + CMR: 'CM', + COD: 'CD', + COG: 'CG', + COK: 'CK', COL: 'CO', COM: 'KM', - COG: 'CG', - COD: 'CD', - COK: 'CK', + CPV: 'CV', CRI: 'CR', - CIV: 'CI', - HRV: 'HR', CUB: 'CU', + CXR: 'CX', + CYM: 'KY', CYP: 'CY', CZE: 'CZ', - DNK: 'DK', + DEU: 'DE', DJI: 'DJ', DMA: 'DM', + DNK: 'DK', DOM: 'DO', + DZA: 'DZ', ECU: 'EC', EGY: 'EG', - SLV: 'SV', - GNQ: 'GQ', ERI: 'ER', + ESH: 'EH', + ESP: 'ES', EST: 'EE', ETH: 'ET', - FLK: 'FK', - FRO: 'FO', - FJI: 'FJ', FIN: 'FI', + FJI: 'FJ', + FLK: 'FK', FRA: 'FR', - GUF: 'GF', - PYF: 'PF', - ATF: 'TF', + FRO: 'FO', + FSM: 'FM', GAB: 'GA', - GMB: 'GM', + GBR: 'GB', GEO: 'GE', - DEU: 'DE', + GGY: 'GG', GHA: 'GH', GIB: 'GI', - GRC: 'GR', - GRL: 'GL', - GRD: 'GD', - GLP: 'GP', - GUM: 'GU', - GTM: 'GT', - GGY: 'GG', GIN: 'GN', + GLP: 'GP', + GMB: 'GM', GNB: 'GW', + GNQ: 'GQ', + GRC: 'GR', + GRD: 'GD', + GRL: 'GL', + GTM: 'GT', + GUF: 'GF', + GUM: 'GU', GUY: 'GY', - HTI: 'HT', + HKG: 'HK', HMD: 'HM', - VAT: 'VA', HND: 'HN', + HRV: 'HR', + HTI: 'HT', HUN: 'HU', - ISL: 'IS', - IND: 'IN', IDN: 'ID', + IMN: 'IM', + IND: 'IN', + IOT: 'IO', + IRL: 'IE', IRN: 'IR', IRQ: 'IQ', - IRL: 'IE', - IMN: 'IM', + ISL: 'IS', ISR: 'IL', ITA: 'IT', JAM: 'JM', - JPN: 'JP', JEY: 'JE', JOR: 'JO', + JPN: 'JP', KAZ: 'KZ', KEN: 'KE', + KGZ: 'KG', + KHM: 'KH', KIR: 'KI', - PRK: 'KP', + KNA: 'KN', KOR: 'KR', KWT: 'KW', - KGZ: 'KG', LAO: 'LA', - LVA: 'LV', LBN: 'LB', - LSO: 'LS', LBR: 'LR', LBY: 'LY', + LCA: 'LC', LIE: 'LI', + LKA: 'LK', + LSO: 'LS', LTU: 'LT', LUX: 'LU', - MKD: 'MK', + LVA: 'LV', + MAF: 'MF', + MAR: 'MA', + MCO: 'MC', + MDA: 'MD', MDG: 'MG', - MWI: 'MW', - MYS: 'MY', MDV: 'MV', + MEX: 'MX', + MHL: 'MH', + MKD: 'MK', MLI: 'ML', MLT: 'MT', - MHL: 'MH', - MTQ: 'MQ', - MRT: 'MR', - MUS: 'MU', - MYT: 'YT', - MEX: 'MX', - FSM: 'FM', - MDA: 'MD', - MCO: 'MC', - MNG: 'MN', - MNE: 'ME', - MSR: 'MS', - MAR: 'MA', - MOZ: 'MZ', MMR: 'MM', - NAM: 'NA', - NRU: 'NR', - NPL: 'NP', - NLD: 'NL', - ANT: 'AN', - NCL: 'NC', - NZL: 'NZ', - NIC: 'NI', - NER: 'NE', - NGA: 'NG', - NIU: 'NU', - NFK: 'NF', + MNE: 'ME', + MNG: 'MN', MNP: 'MP', + MOZ: 'MZ', + MRT: 'MR', + MSR: 'MS', + MTQ: 'MQ', + MUS: 'MU', + MWI: 'MW', + MYS: 'MY', + MYT: 'YT', + NAM: 'NA', + NCL: 'NC', + NER: 'NE', + NFK: 'NF', + NGA: 'NG', + NIC: 'NI', + NIU: 'NU', + NLD: 'NL', NOR: 'NO', + NPL: 'NP', + NRU: 'NR', + NZL: 'NZ', OMN: 'OM', PAK: 'PK', - PLW: 'PW', - PSE: 'PS', PAN: 'PA', - PNG: 'PG', - PRY: 'PY', + PCN: 'PN', PER: 'PE', PHL: 'PH', - PCN: 'PN', + PLW: 'PW', + PNG: 'PG', POL: 'PL', - PRT: 'PT', PRI: 'PR', + PRK: 'KP', + PRT: 'PT', + PRY: 'PY', + PSE: 'PS', + PYF: 'PF', QAT: 'QA', REU: 'RE', ROU: 'RO', RUS: 'RU', RWA: 'RW', - BLM: 'BL', - SHN: 'SH', - KNA: 'KN', - LCA: 'LC', - MAF: 'MF', - SPM: 'PM', - VCT: 'VC', - WSM: 'WS', - SMR: 'SM', - STP: 'ST', SAU: 'SA', + SDN: 'SD', SEN: 'SN', - SRB: 'RS', - SYC: 'SC', - SLE: 'SL', SGP: 'SG', + SGS: 'GS', + SHN: 'SH', + SJM: 'SJ', + SLB: 'SB', + SLE: 'SL', + SLV: 'SV', + SMR: 'SM', + SOM: 'SO', + SPM: 'PM', + SRB: 'RS', + SUR: 'SR', + STP: 'ST', SVK: 'SK', SVN: 'SI', - SLB: 'SB', - SOM: 'SO', - ZAF: 'ZA', - SGS: 'GS', - SSD: 'SS', - ESP: 'ES', - LKA: 'LK', - SDN: 'SD', - SUR: 'SR', - SJM: 'SJ', - SWZ: 'SZ', SWE: 'SE', - CHE: 'CH', + SWZ: 'SZ', + SYC: 'SC', SYR: 'SY', - TWN: 'TW', - TJK: 'TJ', - TZA: 'TZ', - THA: 'TH', - TLS: 'TL', + TCA: 'TC', + TCD: 'TD', TGO: 'TG', + THA: 'TH', + TJK: 'TJ', TKL: 'TK', + TKM: 'TM', + TLS: 'TL', TON: 'TO', TTO: 'TT', TUN: 'TN', TUR: 'TR', - TKM: 'TM', - TCA: 'TC', TUV: 'TV', + TWN: 'TW', + TZA: 'TZ', UGA: 'UG', UKR: 'UA', - ARE: 'AE', - GBR: 'GB', - USA: 'US', UMI: 'UM', URY: 'UY', + USA: 'US', UZB: 'UZ', - VUT: 'VU', + VAT: 'VA', + VCT: 'VC', VEN: 'VE', - VNM: 'VN', + VGB: 'VG', VIR: 'VI', + VNM: 'VN', + VUT: 'VU', WLF: 'WF', - ESH: 'EH', + WSM: 'WS', + XKX: 'XK', YEM: 'YE', + ZAF: 'ZA', ZMB: 'ZM', ZWE: 'ZW', - XKX: 'XK', }; diff --git a/src/lib/date.ts b/src/lib/date.ts index 96135845..85f64f25 100644 --- a/src/lib/date.ts +++ b/src/lib/date.ts @@ -104,9 +104,18 @@ const DATE_FUNCTIONS = { }, }; +const TIMEZONE_MAPPINGS: Record = { + 'Asia/Calcutta': 'Asia/Kolkata', +}; + +export function normalizeTimezone(timezone: string): string { + return TIMEZONE_MAPPINGS[timezone] || timezone; +} + export function isValidTimezone(timezone: string) { try { - Intl.DateTimeFormat(undefined, { timeZone: timezone }); + const normalizedTimezone = normalizeTimezone(timezone); + Intl.DateTimeFormat(undefined, { timeZone: normalizedTimezone }); return true; } catch (error) { return false; diff --git a/src/lib/detect.ts b/src/lib/detect.ts index 2e6a067d..17fb574c 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -15,6 +15,27 @@ import { safeDecodeURIComponent } from '@/lib/url'; const MAXMIND = 'maxmind'; +const PROVIDER_HEADERS = [ + // Cloudflare headers + { + countryHeader: 'cf-ipcountry', + regionHeader: 'cf-region-code', + cityHeader: 'cf-ipcity', + }, + // Vercel headers + { + countryHeader: 'x-vercel-ip-country', + regionHeader: 'x-vercel-ip-country-region', + cityHeader: 'x-vercel-ip-city', + }, + // CloudFront headers + { + countryHeader: 'cloudfront-viewer-country', + regionHeader: 'cloudfront-viewer-country-region', + cityHeader: 'cloudfront-viewer-city', + }, +]; + export function getIpAddress(headers: Headers) { const customHeader = process.env.CLIENT_IP_HEADER; @@ -87,6 +108,14 @@ function decodeHeader(s: string | undefined | null): string | undefined | null { return Buffer.from(s, 'latin1').toString('utf-8'); } +function removePortFromIP(ip: string = "") { + const split = ip.split(":"); + + // Assuming ip is a valid IPv4/IPv6 address, 3 colons is the minumum for IPv6 + const ipv4 = split.length - 1 < 3; + return ipv4 ? split[0] : ip; +} + export async function getLocation(ip: string = '', headers: Headers, hasPayloadIP: boolean) { // Ignore local ips if (await isLocalhost(ip)) { @@ -94,30 +123,19 @@ export async function getLocation(ip: string = '', headers: Headers, hasPayloadI } if (!hasPayloadIP && !process.env.SKIP_LOCATION_HEADERS) { - // Cloudflare headers - if (headers.get('cf-ipcountry')) { - const country = decodeHeader(headers.get('cf-ipcountry')); - const region = decodeHeader(headers.get('cf-region-code')); - const city = decodeHeader(headers.get('cf-ipcity')); + for (const provider of PROVIDER_HEADERS) { + const countryHeader = headers.get(provider.countryHeader); + if (countryHeader) { + const country = decodeHeader(countryHeader); + const region = decodeHeader(headers.get(provider.regionHeader)); + const city = decodeHeader(headers.get(provider.cityHeader)); - return { - country, - region: getRegionCode(country, region), - city, - }; - } - - // Vercel headers - if (headers.get('x-vercel-ip-country')) { - const country = decodeHeader(headers.get('x-vercel-ip-country')); - const region = decodeHeader(headers.get('x-vercel-ip-country-region')); - const city = decodeHeader(headers.get('x-vercel-ip-city')); - - return { - country, - region: getRegionCode(country, region), - city, - }; + return { + country, + region: getRegionCode(country, region), + city, + }; + } } } @@ -131,7 +149,7 @@ export async function getLocation(ip: string = '', headers: Headers, hasPayloadI } // When the client IP is extracted from headers, sometimes the value includes a port - const cleanIp = ip?.split(':')[0]; + const cleanIp = removePortFromIP(ip); const result = global[MAXMIND].get(cleanIp); if (result) { diff --git a/src/lib/lang.ts b/src/lib/lang.ts index 48176d0a..96acc369 100644 --- a/src/lib/lang.ts +++ b/src/lib/lang.ts @@ -44,6 +44,7 @@ import { ca, hu, vi, + uz, } from 'date-fns/locale'; export const languages = { @@ -95,6 +96,7 @@ export const languages = { 'tr-TR': { label: 'Türkçe', dateLocale: tr }, 'uk-UA': { label: 'українська', dateLocale: uk }, 'ur-PK': { label: 'Urdu (Pakistan)', dateLocale: uk, dir: 'rtl' }, + 'uz-UZ': { label: 'O‘zbekcha', dateLocale: uz }, 'vi-VN': { label: 'Tiếng Việt', dateLocale: vi }, 'zh-CN': { label: '中文', dateLocale: zhCN }, 'zh-TW': { label: '中文(繁體)', dateLocale: zhTW }, diff --git a/src/lib/schema.ts b/src/lib/schema.ts index 47be0fb0..51a95748 100644 --- a/src/lib/schema.ts +++ b/src/lib/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { isValidTimezone } from '@/lib/date'; +import { isValidTimezone, normalizeTimezone } from '@/lib/date'; import { UNIT_TYPES } from './constants'; export const filterParams = { @@ -28,9 +28,9 @@ export const pagingParams = { search: z.string().optional(), }; -export const timezoneParam = z.string().refine(value => isValidTimezone(value), { +export const timezoneParam = z.string().refine((value: string) => isValidTimezone(value), { message: 'Invalid timezone', -}); +}).transform((value: string) => normalizeTimezone(value)); export const unitParam = z.string().refine(value => UNIT_TYPES.includes(value), { message: 'Invalid unit', diff --git a/src/tracker/index.js b/src/tracker/index.js index 76d29a1d..b05d9085 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -38,6 +38,18 @@ /* Helper functions */ + const normalize = raw => { + if (!raw) return raw; + try { + const u = new URL(raw, location.href); + if (excludeSearch) u.search = ''; + if (excludeHash) u.hash = ''; + return u.toString(); + } catch (e) { + return raw; + } + }; + const getPayload = () => ({ website, screen, @@ -61,11 +73,7 @@ if (!url) return; currentRef = currentUrl; - currentUrl = new URL(url, location.href); - - if (excludeSearch) currentUrl.search = ''; - if (excludeHash) currentUrl.hash = ''; - currentUrl = currentUrl.toString(); + currentUrl = normalize(new URL(url, location.href).toString()); if (currentUrl !== currentRef) { setTimeout(track, delayDuration); @@ -210,8 +218,9 @@ }; } - let currentUrl = href; - let currentRef = referrer.startsWith(origin) ? '' : referrer; + let currentUrl = normalize(href); + let currentRef = normalize(referrer.startsWith(origin) ? '' : referrer); + let initialized = false; let disabled = false; let cache;