diff --git a/Dockerfile b/Dockerfile index 43e127e35..ddde77fc5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,7 +42,7 @@ RUN set -x \ && apk add --no-cache curl # Script dependencies -RUN pnpm add npm-run-all dotenv chalk semver prisma@6.16.0 @prisma/adapter-pg@6.16.0 +RUN pnpm add npm-run-all dotenv chalk semver prisma@6.16.3 @prisma/adapter-pg@6.16.3 # Permissions for prisma RUN chown -R nextjs:nodejs node_modules/.pnpm/ diff --git a/docker/middleware.ts b/docker/middleware.ts index ae143140d..3fd7f20e3 100644 --- a/docker/middleware.ts +++ b/docker/middleware.ts @@ -4,8 +4,9 @@ export const config = { matcher: '/:path*', }; -const TRACKER_NAME = '/script.js'; -const COLLECT_ENDPOINT = '/api/send'; +const TRACKER_PATH = '/script.js'; +const COLLECT_PATH = '/api/send'; +const LOGIN_PATH = '/login'; const apiHeaders = { 'Access-Control-Allow-Origin': '*', @@ -27,7 +28,7 @@ function customCollectEndpoint(request: NextRequest) { const url = request.nextUrl.clone(); if (url.pathname.endsWith(collectEndpoint)) { - url.pathname = COLLECT_ENDPOINT; + url.pathname = COLLECT_PATH; return NextResponse.rewrite(url, { headers: apiHeaders }); } } @@ -41,7 +42,7 @@ function customScriptName(request: NextRequest) { const names = scriptName.split(',').map(name => name.trim().replace(/^\/+/, '')); if (names.find(name => url.pathname.endsWith(name))) { - url.pathname = TRACKER_NAME; + url.pathname = TRACKER_PATH; return NextResponse.rewrite(url, { headers: trackerHeaders }); } } @@ -50,13 +51,21 @@ function customScriptName(request: NextRequest) { function customScriptUrl(request: NextRequest) { const scriptUrl = process.env.TRACKER_SCRIPT_URL; - if (scriptUrl && request.nextUrl.pathname.endsWith(TRACKER_NAME)) { + if (scriptUrl && request.nextUrl.pathname.endsWith(TRACKER_PATH)) { return NextResponse.rewrite(scriptUrl, { headers: trackerHeaders }); } } +function disableLogin(request: NextRequest) { + const loginDisabled = process.env.DISABLE_LOGIN; + + if (loginDisabled && request.nextUrl.pathname.endsWith(LOGIN_PATH)) { + return new NextResponse('Access denied', { status: 403 }); + } +} + export default function middleware(req: NextRequest) { - const fns = [customCollectEndpoint, customScriptName, customScriptUrl]; + const fns = [customCollectEndpoint, customScriptName, customScriptUrl, disableLogin]; for (const fn of fns) { const res = fn(req); diff --git a/next.config.ts b/next.config.ts index 6fac599e4..e4fe228cf 100644 --- a/next.config.ts +++ b/next.config.ts @@ -19,7 +19,7 @@ const contentSecurityPolicy = ` img-src 'self' https: data:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; - connect-src *; + connect-src 'self' https:; frame-ancestors 'self' ${frameAncestors}; `; diff --git a/package.json b/package.json index d2325de54..b0487d69a 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", - "prisma": "6.16.0", + "prisma": "6.16.3", "pure-rand": "^7.0.1", "react": "^19.1.1", "react-dom": "^19.1.1", @@ -148,7 +148,6 @@ "@types/react-window": "^1.8.8", "@typescript-eslint/eslint-plugin": "^8.45.0", "@typescript-eslint/parser": "^8.45.0", - "@umami/prisma-client": "^0.20.0", "babel-plugin-react-compiler": "19.1.0-rc.2", "cross-env": "^10.1.0", "cypress": "^13.6.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35dc881a4..a5f094e3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,10 +31,10 @@ importers: version: 6.16.3 '@prisma/client': specifier: ^6.16.3 - version: 6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3) + version: 6.16.3(prisma@6.16.3(typescript@5.9.3))(typescript@5.9.3) '@prisma/extension-read-replicas': specifier: ^0.4.1 - version: 0.4.1(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3)) + version: 0.4.1(@prisma/client@6.16.3(prisma@6.16.3(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 version: 10.0.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -150,8 +150,8 @@ importers: specifier: ^8.16.3 version: 8.16.3 prisma: - specifier: 6.16.0 - version: 6.16.0(typescript@5.9.3) + specifier: 6.16.3 + version: 6.16.3(typescript@5.9.3) pure-rand: specifier: ^7.0.1 version: 7.0.1 @@ -249,9 +249,6 @@ importers: '@typescript-eslint/parser': specifier: ^8.45.0 version: 8.45.0(eslint@8.57.1)(typescript@5.9.3) - '@umami/prisma-client': - specifier: ^0.20.0 - version: 0.20.0(@prisma/adapter-pg@6.16.3)(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3))(@prisma/extension-read-replicas@0.4.1(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3))) babel-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2 @@ -362,49 +359,12 @@ importers: version: 10.9.2(@types/node@24.6.0)(typescript@5.9.3) tsup: specifier: ^8.5.0 - version: 8.5.0(jiti@2.5.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) typescript: specifier: ^5.9.3 version: 5.9.3 - dist: - dependencies: - chart.js: - specifier: ^4.5.0 - version: 4.5.0 - chartjs-adapter-date-fns: - specifier: ^3.0.0 - version: 3.0.0(chart.js@4.5.0)(date-fns@2.30.0) - colord: - specifier: ^2.9.2 - version: 2.9.3 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.1.1) - pure-rand: - specifier: ^7.0.1 - version: 7.0.1 - react-simple-maps: - specifier: ^2.3.0 - version: 2.3.0(prop-types@15.8.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-use-measure: - specifier: ^2.0.4 - version: 2.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-window: - specifier: ^1.8.6 - version: 1.8.11(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - serialize-error: - specifier: ^12.0.0 - version: 12.0.0 - thenby: - specifier: ^1.3.4 - version: 1.3.4 - uuid: - specifier: ^11.1.0 - version: 11.1.0 + dist: {} packages: @@ -1559,11 +1519,8 @@ packages: typescript: optional: true - '@prisma/config@6.16.0': - resolution: {integrity: sha512-Q9TgfnllVehvQziY9lJwRJLGmziX0OimZUEQ/MhCUBoJMSScj2VivCjw/Of2vlO1FfyaHXxrvjZAr7ASl7DVcw==} - - '@prisma/debug@6.16.0': - resolution: {integrity: sha512-bxzro5vbVqAPkWyDs2A6GpQtRZunD8tyrLmSAchx9u0b+gWCDY6eV+oh5A0YtYT9245dIxQBswckayHuJG4u3w==} + '@prisma/config@6.16.3': + resolution: {integrity: sha512-VlsLnG4oOuKGGMToEeVaRhoTBZu5H3q51jTQXb/diRags3WV0+BQK5MolJTtP6G7COlzoXmWeS11rNBtvg+qFQ==} '@prisma/debug@6.16.3': resolution: {integrity: sha512-89DdqWtdKd7qoc9/qJCKLTazj3W3zPEiz0hc7HfZdpjzm21c7orOUB5oHWJsG+4KbV4cWU5pefq3CuDVYF9vgA==} @@ -1571,22 +1528,22 @@ packages: '@prisma/driver-adapter-utils@6.16.3': resolution: {integrity: sha512-FliuxCf08NTsV0lexYe5YuT7rlwdb0yofd3fROONnEUuo60Tu4DMe2URoVpkDScOaCDtWi/2VFyAhOMQNgIeHw==} - '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': - resolution: {integrity: sha512-ThvlDaKIVrnrv97ujNFDYiQbeMQpLa0O86HFA2mNoip4mtFqM7U5GSz2ie1i2xByZtvPztJlNRgPsXGeM/kqAA==} + '@prisma/engines-version@6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a': + resolution: {integrity: sha512-fftRmosBex48Ph1v2ll1FrPpirwtPZpNkE5CDCY1Lw2SD2ctyrLlVlHiuxDAAlALwWBOkPbAll4+EaqdGuMhJw==} - '@prisma/engines@6.16.0': - resolution: {integrity: sha512-RHJGCH/zi017W4CWYWqg0Sv1pquGGFVo8T3auJ9sodDNaiRzbeNldydjaQzszVS8nscdtcvLuJzy7e65C3puqQ==} + '@prisma/engines@6.16.3': + resolution: {integrity: sha512-b+Rl4nzQDcoqe6RIpSHv8f5lLnwdDGvXhHjGDiokObguAAv/O1KaX1Oc69mBW/GFWKQpCkOraobLjU6s1h8HGg==} '@prisma/extension-read-replicas@0.4.1': resolution: {integrity: sha512-mCMDloqUKUwx2o5uedTs1FHX3Nxdt1GdRMoeyp1JggjiwOALmIYWhxfIN08M2BZ0w8SKwvJqicJZMjkQYkkijw==} peerDependencies: '@prisma/client': ^6.5.0 - '@prisma/fetch-engine@6.16.0': - resolution: {integrity: sha512-Mx5rml0XRIDizhB9eZxSP8c0nMoXYVITTiJJwxlWn9rNCel8mG8NAqIw+vJlN3gPR+kt3IBkP1SQVsplPPpYrA==} + '@prisma/fetch-engine@6.16.3': + resolution: {integrity: sha512-bUoRIkVaI+CCaVGrSfcKev0/Mk4ateubqWqGZvQ9uCqFv2ENwWIR3OeNuGin96nZn5+SkebcD7RGgKr/+mJelw==} - '@prisma/get-platform@6.16.0': - resolution: {integrity: sha512-eaJOOvAoGslSUTjiQrtE9E0hoBdfL43j8SymOGD6LbdrKRNtIoiy6qiBaEr2fNYD+R/Qns7QOwPhl7SVHJayKA==} + '@prisma/get-platform@6.16.3': + resolution: {integrity: sha512-X1LxiFXinJ4iQehrodGp0f66Dv6cDL0GbRlcCoLtSu6f4Wi+hgo7eND/afIs5029GQLgNWKZ46vn8hjyXTsHLA==} '@react-aria/autocomplete@3.0.0-rc.2': resolution: {integrity: sha512-55KVj5FePFTHk8nWfUUNN8m7rBL+aSRE0CxHI2t8JG3uam3nY7jyuAJy34RBuDEdTsVlMO9Fri/1JragePC2dg==} @@ -2787,13 +2744,6 @@ packages: resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@umami/prisma-client@0.20.0': - resolution: {integrity: sha512-zcLzdSq+NJa/s4xZkzktreuuxmbAET7GAizO0LU+AVg3k9k4stEulvWUfBg48fC/iBRjz0AfOnHsuXDIHKN5Xw==} - peerDependencies: - '@prisma/adapter-pg': ^6.1.0 - '@prisma/client': ^6.1.0 - '@prisma/extension-read-replicas': ^0.4.1 - '@umami/react-zen@0.187.0': resolution: {integrity: sha512-CiTGBqEvN/dcZ1Tq4R+mj9ynN1opZF81iukUzElChJ5XF/Ec9HhPR+KM2r8PXt+uWeVVe1aZtjyVOdwUR/ndXg==} @@ -5021,8 +4971,8 @@ packages: node-notifier: optional: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true joycon@3.1.1: @@ -5298,11 +5248,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.542.0: - resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.543.0: resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: @@ -5563,8 +5508,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nypm@0.6.1: - resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -6300,8 +6245,8 @@ packages: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@6.16.0: - resolution: {integrity: sha512-TTh+H1Kw8N68KN9cDzdAyMroqMOvdCO/Z+kS2wKEVYR1nuR21qH5Q/Db/bZHsAgw7l/TPHtM/veG5VABcdwPDw==} + prisma@6.16.3: + resolution: {integrity: sha512-4tJq3KB9WRshH5+QmzOLV54YMkNlKOtLKaSdvraI5kC/axF47HuOw6zDM8xrxJ6s9o2WodY654On4XKkrobQdQ==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -8689,12 +8634,12 @@ snapshots: transitivePeerDependencies: - pg-native - '@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@6.16.3(prisma@6.16.3(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 6.16.0(typescript@5.9.3) + prisma: 6.16.3(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@6.16.0': + '@prisma/config@6.16.3': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -8703,36 +8648,34 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.16.0': {} - '@prisma/debug@6.16.3': {} '@prisma/driver-adapter-utils@6.16.3': dependencies: '@prisma/debug': 6.16.3 - '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': {} + '@prisma/engines-version@6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a': {} - '@prisma/engines@6.16.0': + '@prisma/engines@6.16.3': dependencies: - '@prisma/debug': 6.16.0 - '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 - '@prisma/fetch-engine': 6.16.0 - '@prisma/get-platform': 6.16.0 + '@prisma/debug': 6.16.3 + '@prisma/engines-version': 6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a + '@prisma/fetch-engine': 6.16.3 + '@prisma/get-platform': 6.16.3 - '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3))': + '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.16.3(prisma@6.16.3(typescript@5.9.3))(typescript@5.9.3))': dependencies: - '@prisma/client': 6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 6.16.3(prisma@6.16.3(typescript@5.9.3))(typescript@5.9.3) - '@prisma/fetch-engine@6.16.0': + '@prisma/fetch-engine@6.16.3': dependencies: - '@prisma/debug': 6.16.0 - '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 - '@prisma/get-platform': 6.16.0 + '@prisma/debug': 6.16.3 + '@prisma/engines-version': 6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a + '@prisma/get-platform': 6.16.3 - '@prisma/get-platform@6.16.0': + '@prisma/get-platform@6.16.3': dependencies: - '@prisma/debug': 6.16.0 + '@prisma/debug': 6.16.3 '@react-aria/autocomplete@3.0.0-rc.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: @@ -10403,16 +10346,6 @@ snapshots: '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 - '@umami/prisma-client@0.20.0(@prisma/adapter-pg@6.16.3)(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3))(@prisma/extension-read-replicas@0.4.1(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3)))': - dependencies: - '@prisma/adapter-pg': 6.16.3 - '@prisma/client': 6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3) - '@prisma/extension-read-replicas': 0.4.1(@prisma/client@6.16.3(prisma@6.16.0(typescript@5.9.3))(typescript@5.9.3)) - chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@umami/react-zen@0.187.0(@babel/core@7.28.3)(@types/react@19.1.16)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.1.3)(use-sync-external-store@1.5.0(react@19.1.1))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 @@ -10900,7 +10833,7 @@ snapshots: dotenv: 16.6.1 exsolve: 1.0.7 giget: 2.0.0 - jiti: 2.5.1 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -12314,7 +12247,7 @@ snapshots: consola: 3.4.2 defu: 6.1.4 node-fetch-native: 1.6.7 - nypm: 0.6.1 + nypm: 0.6.2 pathe: 2.0.3 glob-parent@5.1.2: @@ -13156,7 +13089,7 @@ snapshots: - supports-color - ts-node - jiti@2.5.1: {} + jiti@2.6.1: {} joycon@3.1.1: {} @@ -13439,10 +13372,6 @@ snapshots: dependencies: react: 19.1.1 - lucide-react@0.542.0(react@19.1.1): - dependencies: - react: 19.1.1 - lucide-react@0.543.0(react@19.1.1): dependencies: react: 19.1.1 @@ -13701,7 +13630,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nypm@0.6.1: + nypm@0.6.2: dependencies: citty: 0.1.6 consola: 3.4.2 @@ -14085,11 +14014,11 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@24.6.0)(typescript@5.9.3) - postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 postcss: 8.5.6 yaml: 2.8.1 @@ -14406,10 +14335,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@6.16.0(typescript@5.9.3): + prisma@6.16.3(typescript@5.9.3): dependencies: - '@prisma/config': 6.16.0 - '@prisma/engines': 6.16.0 + '@prisma/config': 6.16.3 + '@prisma/engines': 6.16.3 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -15541,7 +15470,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(jiti@2.5.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): + tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15552,7 +15481,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) resolve-from: 5.0.0 rollup: 4.52.3 source-map: 0.8.0-beta.0 diff --git a/public/intl/country/uz-UZ.json b/public/intl/country/uz-UZ.json new file mode 100644 index 000000000..0105597f7 --- /dev/null +++ b/public/intl/country/uz-UZ.json @@ -0,0 +1,251 @@ +{ + "AF": "Afg\u02bboniston", + "AX": "Aland orollari", + "AL": "Albaniya", + "US": "Amerika Qo\u2018shma Shtatlari", + "AS": "Amerika Samoasi", + "AD": "Andorra", + "AI": "Angilya", + "AO": "Angola", + "AQ": "Antarktida", + "AG": "Antigua va Barbuda", + "VI": "AQSH Virgin orollari", + "UM": "AQSH yondosh orollari", + "AR": "Argentina", + "AM": "Armaniston", + "AW": "Aruba", + "AU": "Avstraliya", + "AT": "Avstriya", + "BS": "Bagama orollari", + "BH": "Bahrayn", + "BD": "Bangladesh", + "BB": "Barbados", + "BY": "Belarus", + "BE": "Belgiya", + "BZ": "Beliz", + "BJ": "Benin", + "BM": "Bermuda orollari", + "AE": "Birlashgan Arab Amirliklari", + "BG": "Bolgariya", + "BO": "Boliviya", + "BQ": "Boneyr, Sint-Estatius va Saba", + "BA": "Bosniya va Gertsegovina", + "BW": "Botsvana", + "BR": "Braziliya", + "VG": "Britaniya Virgin orollari", + "IO": "Britaniyaning Hind okeanidagi hududi", + "BN": "Bruney", + "BF": "Burkina-Faso", + "BI": "Burundi", + "BT": "Butan", + "BV": "Buve oroli", + "GB": "Buyuk Britaniya", + "DK": "Daniya", + "DM": "Dominika", + "DO": "Dominikan Respublikasi", + "ET": "Efiopiya", + "EC": "Ekvador", + "GQ": "Ekvatorial Gvineya", + "ER": "Eritreya", + "IR": "Eron", + "EE": "Estoniya", + "PS": "Falastin hududlari", + "FO": "Farer orollari", + "FJ": "Fiji", + "PH": "Filippin", + "FI": "Finlandiya", + "FK": "Folklend orollari", + "FR": "Fransiya", + "GF": "Fransuz Gvianasi", + "TF": "Fransuz Janubiy hududlari", + "PF": "Fransuz Polineziyasi", + "GA": "Gabon", + "HT": "Gaiti", + "GM": "Gambiya", + "GH": "Gana", + "GY": "Gayana", + "DE": "Germaniya", + "GG": "Gernsi", + "GI": "Gibraltar", + "HN": "Gonduras", + "HK": "Gonkong (Xitoy MMH)", + "GD": "Grenada", + "GL": "Grenlandiya", + "GR": "Gretsiya", + "GE": "Gruziya", + "GU": "Guam", + "GP": "Gvadelupe", + "GT": "Gvatemala", + "GN": "Gvineya", + "GW": "Gvineya-Bisau", + "IN": "Hindiston", + "ID": "Indoneziya", + "JO": "Iordaniya", + "IE": "Irlandiya", + "IQ": "Iroq", + "IS": "Islandiya", + "ES": "Ispaniya", + "IL": "Isroil", + "IT": "Italiya", + "ZA": "Janubiy Afrika Respublikasi", + "GS": "Janubiy Georgiya va Janubiy Sendvich orollari", + "KR": "Janubiy Koreya", + "SS": "Janubiy Sudan", + "DZ": "Jazoir", + "JE": "Jersi", + "DJ": "Jibuti", + "CV": "Kabo-Verde", + "KH": "Kambodja", + "CM": "Kamerun", + "CA": "Kanada", + "KY": "Kayman orollari", + "KE": "Keniya", + "CY": "Kipr", + "KI": "Kiribati", + "CC": "Kokos (Kiling) orollari", + "CO": "Kolumbiya", + "KM": "Komor orollari", + "CG": "Kongo \u2013 Brazzavil", + "CD": "Kongo \u2013 Kinshasa", + "CR": "Kosta-Rika", + "CI": "Kot-d\u2019Ivuar", + "CU": "Kuba", + "CK": "Kuk orollari", + "CW": "Kyurasao", + "LA": "Laos", + "LV": "Latviya", + "LS": "Lesoto", + "LR": "Liberiya", + "LT": "Litva", + "LB": "Livan", + "LY": "Liviya", + "LI": "Lixtenshteyn", + "LU": "Lyuksemburg", + "MG": "Madagaskar", + "MO": "Makao (Xitoy MMH)", + "MW": "Malavi", + "MY": "Malayziya", + "MV": "Maldiv orollari", + "ML": "Mali", + "MT": "Malta", + "CF": "Markaziy Afrika Respublikasi", + "MA": "Marokash", + "MQ": "Martinika", + "MH": "Marshall orollari", + "MU": "Mavrikiy", + "MR": "Mavritaniya", + "YT": "Mayotta", + "MX": "Meksika", + "IM": "Men oroli", + "FM": "Mikroneziya", + "EG": "Misr", + "MD": "Moldova", + "MC": "Monako", + "MN": "Mongoliya", + "MS": "Montserrat", + "MZ": "Mozambik", + "SH": "Muqaddas Yelena oroli", + "MM": "Myanma (Birma)", + "NA": "Namibiya", + "NR": "Nauru", + "NP": "Nepal", + "NL": "Niderlandiya", + "NE": "Niger", + "NG": "Nigeriya", + "NI": "Nikaragua", + "NU": "Niue", + "NF": "Norfolk oroli", + "NO": "Norvegiya", + "AZ": "Ozarbayjon", + "PW": "Palau", + "PA": "Panama", + "PG": "Papua \u2013 Yangi Gvineya", + "PY": "Paragvay", + "PE": "Peru", + "PN": "Pitkern orollari", + "PK": "Pokiston", + "PL": "Polsha", + "PT": "Portugaliya", + "PR": "Puerto-Riko", + "QA": "Qatar", + "KG": "Qirg\u02bbiziston", + "KZ": "Qozog\u02bbiston", + "KW": "Quvayt", + "RE": "Reyunion", + "CX": "Rojdestvo oroli", + "RU": "Rossiya", + "RW": "Ruanda", + "RO": "Ruminiya", + "SV": "Salvador", + "WS": "Samoa", + "SM": "San-Marino", + "ST": "San-Tome va Prinsipi", + "SA": "Saudiya Arabistoni", + "BL": "Sen-Bartelemi", + "PM": "Sen-Pyer va Mikelon", + "SN": "Senegal", + "KN": "Sent-Kits va Nevis", + "LC": "Sent-Lyusiya", + "MF": "Sent-Martin", + "VC": "Sent-Vinsent va Grenadin", + "RS": "Serbiya", + "SC": "Seyshel orollari", + "SG": "Singapur", + "SX": "Sint-Marten", + "SK": "Slovakiya", + "SI": "Sloveniya", + "SB": "Solomon orollari", + "SO": "Somali", + "SD": "Sudan", + "SR": "Surinam", + "SY": "Suriya", + "SZ": "Svazilend", + "SL": "Syerra-Leone", + "TH": "Tailand", + "TZ": "Tanzaniya", + "TW": "Tayvan", + "TL": "Timor-Leste", + "TG": "Togo", + "TJ": "Tojikiston", + "TK": "Tokelau", + "TO": "Tonga", + "TT": "Trinidad va Tobago", + "TN": "Tunis", + "TR": "Turkiya", + "TM": "Turkmaniston", + "TC": "Turks va Kaykos orollari", + "TV": "Tuvalu", + "UG": "Uganda", + "UA": "Ukraina", + "OM": "Ummon", + "WF": "Uollis va Futuna", + "UY": "Urugvay", + "VU": "Vanuatu", + "VA": "Vatikan", + "VE": "Venesuela", + "HU": "Vengriya", + "VN": "Vyetnam", + "HM": "Xerd va Makdonald orollari", + "CN": "Xitoy", + "HR": "Xorvatiya", + "YE": "Yaman", + "JM": "Yamayka", + "NC": "Yangi Kaledoniya", + "NZ": "Yangi Zelandiya", + "JP": "Yaponiya", + "ZM": "Zambiya", + "ZW": "Zimbabve", + "UZ": "O\u02bbzbekiston", + "EH": "G\u2018arbiy Sahroi Kabir", + "KP": "Shimoliy Koreya", + "MK": "Shimoliy Makedoniya", + "MP": "Shimoliy Mariana orollari", + "SJ": "Shpitsbergen va Yan-Mayen", + "LK": "Shri-Lanka", + "SE": "Shvetsiya", + "CH": "Shveytsariya", + "TD": "Chad", + "ME": "Chernogoriya", + "CZ": "Chexiya", + "CL": "Chili" +} diff --git a/public/intl/language/uz-UZ.json b/public/intl/language/uz-UZ.json new file mode 100644 index 000000000..daacab88b --- /dev/null +++ b/public/intl/language/uz-UZ.json @@ -0,0 +1,611 @@ +{ + "ab": "abxazcha", + "ace": "Achinese", + "ach": "Acoli", + "ada": "Adangme", + "ady": "Adyghe", + "aa": "Afar", + "afh": "Afrihili", + "af": "afrikancha", + "agq": "ag\u2018emcha", + "ain": "Ainu", + "ak": "akancha", + "akk": "Akkadian", + "bss": "Akoose", + "akz": "Alabama", + "sq": "albancha", + "ale": "Aleut", + "arq": "Algerian Arabic", + "en_US": "American English", + "ase": "American Sign Language", + "am": "amxarcha", + "egy": "Ancient Egyptian", + "grc": "Ancient Greek", + "anp": "Angika", + "zh_Hant": "an\u02bcanaviy xitoycha", + "njo": "Ao Naga", + "ar": "arabcha", + "an": "Aragonese", + "arc": "Aramaic", + "aro": "Araona", + "arp": "Arapaho", + "arw": "Arawak", + "hy": "armancha", + "rup": "Aromanian", + "frp": "Arpitan", + "as": "assamcha", + "ast": "Asturian", + "asa": "asucha", + "cch": "Atsam", + "av": "Avaric", + "ae": "Avestan", + "en_AU": "Avstraliya inglizchasi", + "de_AT": "Avstriya olmonchasi", + "awa": "Awadhi", + "ay": "Aymara", + "bfq": "Badaga", + "ksf": "bafiycha", + "bfd": "Bafut", + "bqi": "Bakhtiari", + "ban": "Balinese", + "bal": "Baluchi", + "bm": "bambarcha", + "bax": "Bamun", + "bjn": "Banjar", + "bas": "Basaa", + "eu": "baskcha", + "bbc": "Batak Toba", + "bar": "Bavarian", + "bej": "Beja", + "be": "belaruscha", + "bem": "bembacha", + "bez": "benacha", + "bn": "bengalcha", + "bew": "Betawi", + "bho": "Bhojpuri", + "bik": "Bikol", + "bin": "Bini", + "my": "birmancha", + "bpy": "Bishnupriya", + "bi": "Bislama", + "byn": "Blin", + "zbl": "Blissymbols", + "brx": "bodocha", + "bg": "bolgarcha", + "ba": "boshqircha", + "bs": "bosniycha", + "brh": "Brahui", + "bra": "Braj", + "pt_BR": "Braziliya portugalchasi", + "br": "bretoncha", + "en_GB": "Britaniya inglizchasi", + "bug": "Buginese", + "bum": "Bulu", + "bua": "Buriat", + "cad": "Caddo", + "frc": "Cajun French", + "yue": "Cantonese", + "cps": "Capiznon", + "car": "Carib", + "cay": "Cayuga", + "ceb": "Cebuano", + "dtp": "Central Dusun", + "esu": "Central Yupik", + "shu": "Chadian Arabic", + "chg": "Chagatai", + "ch": "Chamorro", + "ce": "Chechen", + "chr": "cherokcha", + "cs": "chexcha", + "chy": "Cheyenne", + "chb": "Chibcha", + "cgg": "chigcha", + "qug": "Chimborazo Highland Quichua", + "chn": "Chinook Jargon", + "chp": "Chipewyan", + "cho": "Choctaw", + "cu": "Church Slavic", + "chk": "Chuukese", + "cv": "Chuvash", + "nwc": "Classical Newari", + "syc": "Classical Syriac", + "ksh": "Colognian", + "swb": "Comorian", + "cop": "Coptic", + "cr": "Cree", + "mus": "Creek", + "crh": "Crimean Turkish", + "dak": "Dakota", + "dar": "Dargwa", + "da": "datcha", + "dzg": "Dazaga", + "del": "Delaware", + "din": "Dinka", + "dv": "Divehi", + "doi": "Dogri", + "dgr": "Dogrib", + "dua": "dualcha", + "dyu": "Dyula", + "frs": "Eastern Frisian", + "efi": "Efik", + "arz": "Egyptian Arabic", + "eka": "Ekajuk", + "elx": "Elamite", + "ebu": "embucha", + "egl": "Emilian", + "myv": "Erzya", + "eo": "esperantocha", + "et": "estoncha", + "ewo": "Ewondo", + "ext": "Extremaduran", + "fan": "Fang", + "fat": "Fanti", + "fo": "farercha", + "fj": "fijcha", + "hif": "Fiji Hindi", + "fil": "filipincha", + "fi": "fincha", + "nl_BE": "flamandcha", + "fon": "Fon", + "fa": "forscha", + "gur": "Frafra", + "fr": "fransuzcha", + "fur": "Friulian", + "ff": "Fulah", + "gaa": "Ga", + "gag": "gagozcha", + "ht": "gaitcha", + "gl": "galitsiycha", + "gan": "Gan Chinese", + "lg": "gandcha", + "haw": "gavaycha", + "gay": "Gayo", + "gba": "Gbaya", + "gez": "Geez", + "aln": "Gheg Albanian", + "bbj": "Ghomala", + "fy": "g\u02bbarbiy friziancha", + "glk": "Gilaki", + "gil": "Gilbertese", + "gom": "Goan Konkani", + "nl": "gollandcha", + "gon": "Gondi", + "gn": "gorancha", + "gor": "Gorontalo", + "got": "Gothic", + "grb": "Grebo", + "ka": "gruzincha", + "gu": "gujoratcha", + "guz": "guzcha", + "gwi": "Gwich\u02bcin", + "hai": "Haida", + "hak": "Hakka Chinese", + "hz": "Herero", + "hil": "Hiligaynon", + "hi": "hindcha", + "ho": "Hiri Motu", + "hit": "Hittite", + "hmn": "Hmong", + "hup": "Hupa", + "iba": "Iban", + "ibb": "Ibibio", + "he": "ibroniy", + "io": "Ido", + "ig": "igbocha", + "ilo": "Iloko", + "smn": "inari semiycha", + "id": "indoneyzcha", + "en": "inglizcha", + "izh": "Ingrian", + "inh": "Ingush", + "ia": "Interlingua", + "ie": "Interlingue", + "iu": "inuktitutcha", + "ik": "Inupiaq", + "ga": "irlandcha", + "is": "islandcha", + "es": "ispancha", + "it": "italyancha", + "ee": "ivicha", + "jam": "Jamaican Creole English", + "sma": "janubiy semiycha", + "kaj": "Jju", + "jrb": "Judeo-Arabic", + "jpr": "Judeo-Persian", + "jut": "Jutish", + "kbd": "Kabardian", + "kea": "kabuverdiancha", + "kac": "Kachin", + "kgp": "Kaingang", + "kkj": "Kako", + "kl": "kalallisutcha", + "kln": "kalenjincha", + "xal": "Kalmyk", + "kam": "kambcha", + "fr_CA": "Kanada fransuzchasi", + "en_CA": "Kanada inglizchasi", + "kbl": "Kanembu", + "kn": "kannadcha", + "kr": "Kanuri", + "kaa": "Kara-Kalpak", + "krc": "Karachay-Balkar", + "krl": "Karelian", + "ks": "kashmircha", + "csb": "Kashubian", + "ca": "katalancha", + "kaw": "Kawi", + "ken": "Kenyang", + "kha": "Khasi", + "kho": "Khotanese", + "khw": "Khowar", + "ki": "kikuycha", + "kmb": "Kimbundu", + "krj": "Kinaray-a", + "rw": "kinyarvandcha", + "kiu": "Kirmanjki", + "tlh": "Klingon", + "bkm": "Kom", + "kv": "Komi", + "koi": "komi-permyakcha", + "kg": "Kongo", + "swc": "kongo svahiliycha", + "kok": "konkancha", + "ko": "koreyscha", + "kw": "kornishcha", + "kfo": "Koro", + "co": "korsiancha", + "ses": "koryaboro senniycha", + "kos": "Kosraean", + "avk": "Kotava", + "kpe": "Kpelle", + "kri": "Krio", + "kj": "Kuanyama", + "kum": "Kumyk", + "ku": "kurdcha", + "kru": "Kurukh", + "kut": "Kutenai", + "nmg": "kvaziycha", + "lad": "Ladino", + "lah": "Lahnda", + "lkt": "lakotcha", + "lam": "Lamba", + "lag": "langcha", + "lo": "laoscha", + "ltg": "Latgalian", + "lv": "latishcha", + "lzz": "Laz", + "lez": "Lezghian", + "lij": "Ligurian", + "li": "Limburgish", + "ln": "lingalcha", + "lfn": "Lingua Franca Nova", + "lzh": "Literary Chinese", + "lt": "litovcha", + "liv": "Livonian", + "jbo": "Lojban", + "lmo": "Lombard", + "es_419": "Lotin Amerika ispanchasi", + "la": "lotincha", + "nds": "Low German", + "sli": "Lower Silesian", + "loz": "Lozi", + "lu": "luba-katangcha", + "lua": "Luba-Lulua", + "lui": "Luiseno", + "smj": "luli semiycha", + "lun": "Lunda", + "luo": "luocha", + "luy": "luycha", + "lb": "lyuksemburgcha", + "mde": "Maba", + "jmc": "machamcha", + "mad": "Madurese", + "maf": "Mafa", + "mag": "Magahi", + "vmf": "Main-Franconian", + "mai": "Maithili", + "mak": "Makasar", + "mk": "makedoncha", + "mgh": "makuva-mittocha", + "mg": "malagasiycha", + "ml": "malayamcha", + "ms": "malaycha", + "mt": "maltacha", + "mnc": "Manchu", + "mdr": "Mandar", + "man": "Mandingo", + "mni": "Manipuri", + "mi": "maoriycha", + "arn": "mapuchiycha", + "kde": "maqondiy", + "mr": "maratcha", + "chm": "Mari", + "tzm": "markaziy atlas vaqt zonasi", + "mh": "Marshallese", + "mwr": "Marwari", + "mas": "masaycha", + "mzn": "Mazanderani", + "byv": "Medumba", + "es_MX": "Meksika ispanchasi", + "gv": "mencha", + "men": "Mende", + "mwv": "Mentawai", + "mer": "merucha", + "mgo": "metacha", + "mic": "Micmac", + "dum": "Middle Dutch", + "enm": "Middle English", + "frm": "Middle French", + "gmh": "Middle High German", + "mga": "Middle Irish", + "nan": "Min Nan Chinese", + "min": "Minangkabau", + "xmf": "Mingrelian", + "mwl": "Mirandese", + "lus": "Mizo", + "mn": "mo\u2018g\u2018ulcha", + "moh": "mohaukcha", + "mdf": "Moksha", + "ro_MD": "moldovan rumincha", + "lol": "Mongo", + "mfe": "morisyencha", + "ary": "Moroccan Arabic", + "mos": "Mossi", + "mul": "Multiple Languages", + "mua": "mundangcha", + "ttt": "Muslim Tat", + "mye": "Myene", + "naq": "namacha", + "na": "Nauru", + "nv": "Navajo", + "ng": "Ndonga", + "nap": "Neapolitan", + "de": "nemischa", + "ne": "nepalcha", + "new": "Newari", + "sba": "Ngambay", + "nnh": "Ngiemboon", + "jgo": "ngombcha", + "yrl": "Nheengatu", + "nia": "Nias", + "niu": "Niuean", + "nog": "Nogai", + "und": "noma\u02bclum til", + "frr": "Northern Frisian", + "nso": "Northern Sotho", + "nb": "norvegcha bokmal", + "nn": "norvegcha ninorsk", + "no": "Norwegian", + "nov": "Novial", + "nus": "noyrcha", + "nqo": "nqoancha", + "nym": "Nyamwezi", + "ny": "Nyanja", + "nyn": "nyankolcha", + "tog": "Nyasa Tonga", + "nyo": "Nyoro", + "nzi": "Nzima", + "oc": "Occitan", + "uz": "o\u02bbzbekcha", + "oj": "Ojibwa", + "ang": "Old English", + "fro": "Old French", + "goh": "Old High German", + "sga": "Old Irish", + "non": "Old Norse", + "peo": "Old Persian", + "pro": "Old Proven\u00e7al", + "or": "oriycha", + "om": "oromocha", + "osa": "Osage", + "os": "Ossetic", + "ota": "Ottoman Turkish", + "az": "ozarbayjoncha", + "pal": "Pahlavi", + "pfl": "Palatine German", + "pau": "Palauan", + "pi": "Pali", + "pam": "Pampanga", + "pag": "Pangasinan", + "pa": "panjobcha", + "pap": "Papiamento", + "pdc": "Pennsylvania German", + "phn": "Phoenician", + "pcd": "Picard", + "pms": "Piedmontese", + "pdt": "Plautdietsch", + "pon": "Pohnpeian", + "pl": "polyakcha", + "pnt": "Pontic", + "pt": "portugalcha", + "prg": "Prussian", + "ps": "pushtu tili", + "quc": "qichiancha", + "ky": "qirg\u02bbizcha", + "kab": "qobilcha", + "khq": "qoyra-chincha", + "kk": "qozoqcha", + "dsb": "quyi sorbcha", + "qu": "qvechuancha", + "raj": "Rajasthani", + "rap": "Rapanui", + "rar": "Rarotongan", + "rif": "Riffian", + "rgn": "Romagnol", + "rm": "romancha", + "rom": "Romany", + "rof": "rombacha", + "root": "Root", + "rtm": "Rotuman", + "rug": "Roviana", + "rwk": "ruandcha", + "ro": "rumincha", + "rn": "rundcha", + "ru": "ruscha", + "rue": "Rusyn", + "ssy": "Saho", + "sah": "Sakha", + "sam": "Samaritan Aramaic", + "saq": "samburcha", + "sm": "Samoan", + "sgs": "Samogitian", + "sad": "Sandawe", + "sg": "sangoancha", + "sbp": "sanguancha", + "sa": "sanskritcha", + "sat": "Santali", + "sc": "Sardinian", + "sas": "Sasak", + "sdc": "Sassarese Sardinian", + "stq": "Saterland Frisian", + "saz": "Saurashtra", + "sco": "Scots", + "gd": "Scottish Gaelic", + "sly": "Selayar", + "sel": "Selkup", + "see": "Seneca", + "seh": "seniycha", + "sr": "serbcha", + "sh": "Serbo-Croatian", + "srr": "Serer", + "sei": "Seri", + "ksb": "shambalacha", + "shn": "Shan", + "nd": "shimoliy ndebelcha", + "se": "shimoliy semiycha", + "sms": "shkolt semiycha", + "sn": "shoniycha", + "sv": "shvedcha", + "fr_CH": "Shvesariya fransuzchasi", + "de_CH": "Shvesariya olmonchasi", + "gsw": "shveysariya nemischasi", + "scn": "Sicilian", + "sid": "Sidamo", + "bla": "Siksika", + "szl": "Silesian", + "sd": "sindxiycha", + "si": "sinholcha", + "den": "Slave", + "sk": "slovakcha", + "sl": "slovencha", + "zh_Hans": "soddalashtirilgan xitoycha", + "xog": "sogancha", + "sog": "Sogdien", + "so": "somalicha", + "snk": "Soninke", + "ckb": "sorani kurd tili", + "azb": "South Azerbaijani", + "nr": "South Ndebele", + "alt": "Southern Altai", + "st": "Southern Sotho", + "srn": "Sranan Tongo", + "zgh": "standart marokash tamazit", + "suk": "Sukuma", + "sux": "Sumerian", + "su": "sundancha", + "sus": "Susu", + "sw": "svahilcha", + "ss": "Swati", + "syr": "Syriac", + "shi": "tachilgitcha", + "tl": "Tagalog", + "ty": "Tahitian", + "dav": "taitcha", + "tly": "Talysh", + "tmh": "Tamashek", + "ta": "tamilcha", + "trv": "Taroko", + "tt": "tatarcha", + "th": "taycha", + "te": "telugvancha", + "ter": "Tereno", + "teo": "tesoancha", + "tet": "Tetum", + "bo": "tibetcha", + "tig": "Tigre", + "ti": "tigrincha", + "zxx": "til tarkibi yo\u02bbq", + "tem": "Timne", + "tiv": "Tiv", + "tli": "Tlingit", + "tg": "tojikcha", + "tpi": "Tok Pisin", + "tkl": "Tokelau", + "to": "tongocha", + "fit": "Tornedalen Finnish", + "twq": "tosovoqcha", + "tkr": "Tsakhur", + "tsd": "Tsakonian", + "tsi": "Tsimshian", + "ts": "Tsonga", + "tn": "Tswana", + "tcy": "Tulu", + "tum": "Tumbuka", + "aeb": "Tunisian Arabic", + "tr": "turkcha", + "tk": "turkmancha", + "tru": "Turoyo", + "tvl": "Tuvalu", + "tyv": "Tuvinian", + "tw": "Twi", + "kcg": "Tyap", + "udm": "Udmurt", + "cy": "uelscha", + "uga": "Ugaritic", + "uk": "ukraincha", + "umb": "Umbundu", + "ur": "urducha", + "ug": "uyg\u02bburcha", + "vai": "vayancha", + "ve": "Venda", + "vec": "Venetian", + "hu": "vengrcha", + "vep": "Veps", + "vo": "Volap\u00fck", + "wo": "volofcha", + "vro": "V\u00f5ro", + "vot": "Votic", + "vun": "vunjoancha", + "vi": "vyetnamcha", + "wa": "Walloon", + "wae": "Walser", + "war": "Waray", + "wbp": "Warlpiri", + "was": "Washo", + "guc": "Wayuu", + "vls": "West Flemish", + "mrj": "Western Mari", + "wal": "Wolaytta", + "wuu": "Wu Chinese", + "ha": "xauscha", + "hsn": "Xiang Chinese", + "zh": "xitoycha", + "km": "xmercha", + "hr": "xorvatcha", + "xh": "xosancha", + "yav": "Yangben", + "yao": "Yao", + "yap": "Yapese", + "ja": "yaponcha", + "jv": "yavancha", + "ybb": "Yemba", + "es_ES": "Yevropa ispanchasi", + "pt_PT": "Yevropa portugalchasi", + "yi": "Yiddish", + "dyo": "yola-fonyicha", + "yo": "yorubcha", + "dz": "yovoncha", + "el": "yunoncha", + "hsb": "yuqori sorbcha", + "ar_001": "zamonavij standart arabcha", + "zap": "Zapotec", + "dje": "zarmacha", + "zza": "Zaza", + "zea": "Zeelandic", + "zen": "Zenaga", + "za": "Zhuang", + "ii": "zichuan yicha", + "gbz": "Zoroastrian Dari", + "zu": "zuluancha", + "zun": "Zuni" +} diff --git a/public/intl/messages/en-US.json b/public/intl/messages/en-US.json index 5cc8c37ee..cdb78cd4e 100644 --- a/public/intl/messages/en-US.json +++ b/public/intl/messages/en-US.json @@ -524,7 +524,7 @@ "label.entry": [ { "type": 0, - "value": "Entry path" + "value": "Entry page" } ], "label.event": [ @@ -560,7 +560,7 @@ "label.exit": [ { "type": 0, - "value": "Exit path" + "value": "Exit page" } ], "label.false": [ diff --git a/public/intl/messages/es-ES.json b/public/intl/messages/es-ES.json index 151ab5f46..cde98b243 100644 --- a/public/intl/messages/es-ES.json +++ b/public/intl/messages/es-ES.json @@ -836,7 +836,7 @@ "label.last-seen": [ { "type": 0, - "value": "Última vez visto" + "value": "Visto por última vez" } ], "label.leave": [ @@ -1336,13 +1336,19 @@ "label.revenue": [ { "type": 0, - "value": "Ingresos" + "value": "Ganancias" } ], "label.revenue-description": [ { "type": 0, - "value": "Consulte sus ingresos a lo largo del tiempo." + "value": "Analice sus ganancias a lo largo del tiempo." + } + ], + "label.revenue-property": [ + { + "type": 0, + "value": "Propiedad de ganancias" } ], "label.role": [ @@ -1411,12 +1417,6 @@ "value": "Sesión" } ], - "label.session-data": [ - { - "type": 0, - "value": "Datos de sesión" - } - ], "label.sessions": [ { "type": 0, @@ -1630,7 +1630,7 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "Transacciones" } ], "label.transfer": [ @@ -1672,7 +1672,7 @@ "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "Clientes únicos" } ], "label.unknown": [ @@ -1699,6 +1699,12 @@ "value": "Usuario" } ], + "label.user-property": [ + { + "type": 0, + "value": "Propiedad de usuario" + } + ], "label.username": [ { "type": 0, diff --git a/public/intl/messages/sl-SI.json b/public/intl/messages/sl-SI.json index 73532727e..9f168f486 100644 --- a/public/intl/messages/sl-SI.json +++ b/public/intl/messages/sl-SI.json @@ -197,24 +197,12 @@ "value": "Počisti vse" } ], - "label.cohort": [ - { - "type": 0, - "value": "Kohorta" - } - ], "label.compare": [ { "type": 0, "value": "Primerjaj" } ], - "label.compare-dates": [ - { - "type": 0, - "value": "Primerjaj datume" - } - ], "label.confirm": [ { "type": 0, @@ -245,28 +233,10 @@ "value": "Nadaljuj" } ], - "label.conversion": [ - { - "type": 0, - "value": "Konverzija" - } - ], - "label.conversion-rate": [ - { - "type": 0, - "value": "Stopnja konverzije" - } - ], - "label.conversion-step": [ - { - "type": 0, - "value": "Korak konverzije" - } - ], "label.count": [ { "type": 0, - "value": "Števec" + "value": "Število" } ], "label.countries": [ @@ -284,7 +254,7 @@ "label.create": [ { "type": 0, - "value": "Create" + "value": "Ustvari" } ], "label.create-report": [ @@ -317,12 +287,6 @@ "value": "Ustvaril" } ], - "label.currency": [ - { - "type": 0, - "value": "Valuta" - } - ], "label.current": [ { "type": 0, @@ -503,16 +467,10 @@ "value": "Uredi člana" } ], - "label.email": [ - { - "type": 0, - "value": "Email" - } - ], "label.enable-share-url": [ { "type": 0, - "value": "Uredi povezavo za deljenje" + "value": "Omogoči povezavo za deljenje" } ], "label.end-step": [ @@ -524,7 +482,7 @@ "label.entry": [ { "type": 0, - "value": "Vhodni URL" + "value": "Vstopni URL" } ], "label.event": [ @@ -551,16 +509,10 @@ "value": "Dogodki" } ], - "label.exists": [ - { - "type": 0, - "value": "Obstaja" - } - ], "label.exit": [ { "type": 0, - "value": "Exit URL" + "value": "Izhodni URL" } ], "label.false": [ @@ -605,16 +557,10 @@ "value": "Filtri" } ], - "label.first-click": [ - { - "type": 0, - "value": "Prvi klik" - } - ], "label.first-seen": [ { "type": 0, - "value": "First seen" + "value": "Prvič viden" } ], "label.funnel": [ @@ -626,13 +572,7 @@ "label.funnel-description": [ { "type": 0, - "value": "Understand the conversion and drop-off rate of users." - } - ], - "label.funnels": [ - { - "type": 0, - "value": "Lijaki" + "value": "Razumite stopnjo konverzije in osipa uporabnikov." } ], "label.goal": [ @@ -665,28 +605,16 @@ "value": "Večje ali enako kot" } ], - "label.grouped": [ + "label.host": [ { "type": 0, - "value": "Združeno" + "value": "Gostitelj" } ], - "label.hostname": [ + "label.hosts": [ { "type": 0, - "value": "Ime gostitelja" - } - ], - "label.includes": [ - { - "type": 0, - "value": "Vključuje" - } - ], - "label.insight": [ - { - "type": 0, - "value": "Vpogled" + "value": "Gostitelji" } ], "label.insights": [ @@ -698,7 +626,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": [ @@ -752,7 +680,7 @@ "label.journey": [ { "type": 0, - "value": "Potovanje" + "value": "Uporabniška pot" } ], "label.journey-description": [ @@ -761,12 +689,6 @@ "value": "Razumite, kako uporabniki krmarijo po vašem spletnem mestu." } ], - "label.journeys": [ - { - "type": 0, - "value": "Potovanja" - } - ], "label.language": [ { "type": 0, @@ -836,7 +758,7 @@ "label.last-seen": [ { "type": 0, - "value": "Zadnjič videno" + "value": "Nazadnje viden" } ], "label.leave": [ @@ -884,13 +806,13 @@ "label.manage": [ { "type": 0, - "value": "Manage" + "value": "Upravljaj" } ], "label.manager": [ { "type": 0, - "value": "Manager" + "value": "Upravitelj" } ], "label.max": [ @@ -899,18 +821,6 @@ "value": "Največ" } ], - "label.maximize": [ - { - "type": 0, - "value": "Razširi" - } - ], - "label.medium": [ - { - "type": 0, - "value": "Srednje" - } - ], "label.member": [ { "type": 0, @@ -1161,12 +1071,6 @@ "value": "Poti" } ], - "label.pixels": [ - { - "type": 0, - "value": "Pikslov" - } - ], "label.powered-by": [ { "type": 0, @@ -1294,7 +1198,7 @@ "label.remove-member": [ { "type": 0, - "value": "Remove member" + "value": "Odstrani člana" } ], "label.reports": [ @@ -1330,19 +1234,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": "Prihodek" + "value": "Prihodki" } ], "label.revenue-description": [ { "type": 0, - "value": "Oglejte si svoj prihodek skozi čas." + "value": "Preglejte svoje prihodke skozi čas." + } + ], + "label.revenue-property": [ + { + "type": 0, + "value": "Lastnost prihodkov" } ], "label.role": [ @@ -1372,13 +1282,13 @@ "label.search": [ { "type": 0, - "value": "Search" + "value": "Išči" } ], "label.select": [ { "type": 0, - "value": "Select" + "value": "Izberi" } ], "label.select-date": [ @@ -1387,16 +1297,10 @@ "value": "Izberi datum" } ], - "label.select-filter": [ - { - "type": 0, - "value": "Izberi filter" - } - ], "label.select-role": [ { "type": 0, - "value": "Select role" + "value": "Izberi vlogo" } ], "label.select-website": [ @@ -1411,12 +1315,6 @@ "value": "Seja" } ], - "label.session-data": [ - { - "type": 0, - "value": "Podatki seje" - } - ], "label.sessions": [ { "type": 0, @@ -1447,28 +1345,16 @@ "value": "En dan" } ], - "label.sms": [ - { - "type": 0, - "value": "SMS" - } - ], - "label.sources": [ - { - "type": 0, - "value": "Viri" - } - ], "label.start-step": [ { "type": 0, - "value": "Start Step" + "value": "Začetni korak" } ], "label.steps": [ { "type": 0, - "value": "Steps" + "value": "Koraki" } ], "label.sum": [ @@ -1510,7 +1396,7 @@ "label.team-manager": [ { "type": 0, - "value": "Vodja ekipe" + "value": "Upravitelj ekipe" } ], "label.team-member": [ @@ -1531,16 +1417,10 @@ "value": "Lastnik ekipe" } ], - "label.team-settings": [ - { - "type": 0, - "value": "Nastavitve ekipe" - } - ], "label.team-view-only": [ { "type": 0, - "value": "Team view only" + "value": "Ekipa samo za ogled" } ], "label.team-websites": [ @@ -1792,7 +1672,7 @@ "label.websites": [ { "type": 0, - "value": "Spletnih mest" + "value": "Spletna mesta" } ], "label.window": [ @@ -1810,7 +1690,7 @@ "message.action-confirmation": [ { "type": 0, - "value": "Type " + "value": "Za potrditev v spodnje polje vnesite " }, { "type": 1, @@ -1818,7 +1698,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": "." } ], "message.active-users": [ @@ -1855,16 +1735,10 @@ "value": "x" } ], - "message.bad-request": [ - { - "type": 0, - "value": "Bad request" - } - ], "message.collected-data": [ { "type": 0, - "value": "Collected data" + "value": "Zbrani podatki" } ], "message.confirm-delete": [ @@ -1898,7 +1772,7 @@ "message.confirm-remove": [ { "type": 0, - "value": "Are you sure you want to remove " + "value": "Ali ste prepričani, da želite odstraniti " }, { "type": 1, @@ -1926,7 +1800,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": [ @@ -2146,31 +2020,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" - } - ], - "message.unauthorized": [ - { - "type": 0, - "value": "Unauthorized" + "value": "Sprožen dogodek" } ], "message.user-deleted": [ @@ -2182,7 +2050,7 @@ "message.viewed-page": [ { "type": 0, - "value": "Viewed page" + "value": "Ogledana stran" } ], "message.visitor-log": [ @@ -2218,5 +2086,11 @@ "type": 1, "value": "device" } + ], + "message.visitors-dropped-off": [ + { + "type": 0, + "value": "Osip obiskovalcev" + } ] } diff --git a/public/intl/messages/uz-UZ.json b/public/intl/messages/uz-UZ.json new file mode 100644 index 000000000..3697ff1be --- /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/scripts/format-lang.js b/scripts/format-lang.js index 0230bda35..ad18d82d6 100644 --- a/scripts/format-lang.js +++ b/scripts/format-lang.js @@ -1,7 +1,6 @@ import path from 'node:path'; import fs from 'fs-extra'; import del from 'del'; -import prettier from 'prettier'; import { createRequire } from 'module'; const require = createRequire(import.meta.url); @@ -27,7 +26,7 @@ async function run() { return obj; }, {}); - const json = prettier.format(JSON.stringify(formatted), { parser: 'json' }); + const json = JSON.stringify(formatted, null, 2); fs.writeFileSync(path.resolve(dest, file), json); }); diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 1e8563382..3e5699889 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -1,5 +1,4 @@ import { z } from 'zod'; -import debug from 'debug'; import { isbot } from 'isbot'; import { startOfHour, startOfMonth } from 'date-fns'; import clickhouse from '@/lib/clickhouse'; @@ -13,8 +12,7 @@ import { COLLECTION_TYPE, EVENT_TYPE } from '@/lib/constants'; import { anyObjectParam, urlOrPathParam } from '@/lib/schema'; import { safeDecodeURI, safeDecodeURIComponent } from '@/lib/url'; import { createSession, saveEvent, saveSessionData } from '@/queries/sql'; - -const log = debug('umami:send'); +import { serializeError } from 'serialize-error'; interface Cache { websiteId: string; @@ -270,7 +268,8 @@ export async function POST(request: Request) { return json({ cache: token, sessionId, visitId }); } catch (e) { - log.error(e); - return serverError(e); + const error = serializeError(e); + + return serverError({ errorObject: error }); } } diff --git a/src/lang/uz-UZ.json b/src/lang/uz-UZ.json new file mode 100644 index 000000000..e8a574c77 --- /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/lang.ts b/src/lib/lang.ts index 48176d0a9..96acc3698 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/prisma.ts b/src/lib/prisma.ts index cf7306e94..220987c79 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -1,6 +1,7 @@ import debug from 'debug'; +import { PrismaPg } from '@prisma/adapter-pg'; +import { readReplicas } from '@prisma/extension-read-replicas'; import { PrismaClient } from '@/generated/prisma/client'; -import { UmamiPrismaClient } from '@umami/prisma-client'; import { SESSION_COLUMNS, OPERATORS, DEFAULT_PAGE_SIZE, FILTER_COLUMNS } from './constants'; import { QueryOptions, QueryFilters, Operator } from './types'; import { filtersObjectToArray } from './params'; @@ -9,6 +10,15 @@ const log = debug('umami:prisma'); const PRISMA = 'prisma'; +const PRISMA_LOG_OPTIONS = { + log: [ + { + emit: 'event' as const, + level: 'query' as const, + }, + ], +}; + const DATE_FORMATS = { minute: 'YYYY-MM-DD HH24:MI:00', hour: 'YYYY-MM-DD HH24:00:00', @@ -281,18 +291,47 @@ function getClient() { return null; } - const prisma = new UmamiPrismaClient({ - url: process.env.DATABASE_URL, - prismaClient: PrismaClient, - logQuery: !!process.env.LOG_QUERY, - replicaUrl: process.env.DATABASE_REPLICA_URL, + const url = process.env.DATABASE_URL; + const replicaUrl = process.env.DATABASE_REPLICA_URL; + const logQuery = process.env.LOG_QUERY; + + const connectionUrl = new URL(url); + const schema = connectionUrl.searchParams.get('schema') ?? undefined; + + const adapter = new PrismaPg({ connectionString: url.toString() }, { schema }); + + const prisma = new PrismaClient({ + adapter, + errorFormat: 'pretty', + ...(logQuery ? PRISMA_LOG_OPTIONS : {}), }); - if (!globalThis[PRISMA]) { - globalThis[PRISMA] = prisma.client; + if (replicaUrl) { + const replicaAdapter = new PrismaPg({ connectionString: replicaUrl.toString() }, { schema }); + + const replicaClient = new PrismaClient({ + adapter: replicaAdapter, + ...(logQuery ? PRISMA_LOG_OPTIONS : {}), + }); + + prisma.$extends( + readReplicas({ + replicas: [replicaClient], + }), + ); } - return prisma.client; + if (logQuery) { + prisma.$on('query' as never, log); + } + + log('Prisma initialized'); + + if (!globalThis[PRISMA]) { + globalThis[PRISMA] = prisma; + } + + return prisma; } const client: PrismaClient = globalThis[PRISMA] || getClient();