diff --git a/package.json b/package.json index cc10fda02c5..6c56e90a415 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@commitlint/cli": "20.5.2", "@commitlint/config-conventional": "20.5.0", - "@hoppscotch/ui": "0.2.5", + "@hoppscotch/ui": "0.2.6", "@types/node": "24.10.1", "cross-env": "10.1.0", "http-server": "14.1.1", @@ -40,15 +40,15 @@ "body-parser": "2.2.1", "cross-spawn": "7.0.6", "execa@<2.0.0": "2.0.0", - "fast-uri@<=3.1.1": "3.1.2", - "form-data": "4.0.4", + "form-data@>=4.0.0 <4.0.6": "4.0.6", "glob@>=11.0.0 <11.1.0": "11.1.0", - "lodash": "4.18.1", + "hono@<4.12.25": "4.12.25", + "liquidjs@<10.26.0": "10.26.0", "minimatch@>=4.0.0 <4.2.5": "4.2.5", + "multer@2.1.1": "2.2.0", "serialize-javascript@<7.0.3": "7.0.3", - "subscriptions-transport-ws>ws": "7.5.10", - "vue": "3.5.34", - "ws": "8.17.1" + "vue": "3.5.38", + "ws": "8.21.0" }, "onlyBuiltDependencies": [ "@apollo/protobufjs", diff --git a/packages/codemirror-lang-graphql/package.json b/packages/codemirror-lang-graphql/package.json index fb1c0b9a9c5..6f144921ccf 100644 --- a/packages/codemirror-lang-graphql/package.json +++ b/packages/codemirror-lang-graphql/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@lezer/generator": "1.8.0", "@rollup/plugin-typescript": "12.1.4", - "mocha": "11.7.5", + "mocha": "11.7.6", "rollup": "4.59.0", "typescript": "5.9.3" } diff --git a/packages/hoppscotch-agent/package.json b/packages/hoppscotch-agent/package.json index abbc2fcc2ff..5c9dd6f2200 100644 --- a/packages/hoppscotch-agent/package.json +++ b/packages/hoppscotch-agent/package.json @@ -17,31 +17,31 @@ "do-lintfix": "pnpm run lintfix" }, "dependencies": { - "@hoppscotch/ui": "0.2.5", + "@hoppscotch/ui": "0.2.6", "@tauri-apps/api": "2.1.1", "@tauri-apps/plugin-shell": "2.3.3", - "@vueuse/core": "14.2.1", - "axios": "1.15.2", + "@vueuse/core": "14.3.0", + "axios": "1.18.0", "fp-ts": "2.16.11", "lodash-es": "4.18.1", - "vue": "3.5.34" + "vue": "3.5.38" }, "devDependencies": { - "@iconify-json/lucide": "1.2.104", + "@iconify-json/lucide": "1.2.114", "@tauri-apps/cli": "2.9.3", "@types/lodash-es": "4.17.12", "@types/node": "24.10.1", - "@typescript-eslint/eslint-plugin": "8.59.0", - "@typescript-eslint/parser": "8.59.0", - "@vitejs/plugin-vue": "6.0.6", - "@vue/eslint-config-typescript": "14.7.0", + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@vitejs/plugin-vue": "6.0.7", + "@vue/eslint-config-typescript": "14.8.0", "autoprefixer": "10.5.0", "cross-env": "10.1.0", "eslint": "9.39.2", - "eslint-plugin-prettier": "5.5.5", - "eslint-plugin-vue": "10.9.0", + "eslint-plugin-prettier": "5.5.6", + "eslint-plugin-vue": "10.9.2", "globals": "16.5.0", - "postcss": "8.5.10", + "postcss": "8.5.15", "tailwindcss": "3.4.16", "typescript": "5.9.3", "unplugin-icons": "22.5.0", diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index 8d0f7c1e69a..42e60d880b1 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -1,6 +1,6 @@ { "name": "hoppscotch-backend", - "version": "2026.5.0", + "version": "2026.6.0", "description": "", "author": "", "private": true, @@ -33,17 +33,17 @@ "dependencies": { "@apollo/server": "5.5.1", "@as-integrations/express5": "1.1.2", - "@nestjs-modules/mailer": "2.3.5", - "@nestjs/apollo": "13.4.0", - "@nestjs/common": "11.1.21", + "@nestjs-modules/mailer": "2.3.7", + "@nestjs/apollo": "13.4.2", + "@nestjs/common": "11.1.27", "@nestjs/config": "4.0.4", - "@nestjs/core": "11.1.21", - "@nestjs/graphql": "13.4.0", + "@nestjs/core": "11.1.27", + "@nestjs/graphql": "13.4.2", "@nestjs/jwt": "11.0.2", "@nestjs/passport": "11.0.0", - "@nestjs/platform-express": "11.1.21", + "@nestjs/platform-express": "11.1.27", "@nestjs/schedule": "6.1.3", - "@nestjs/swagger": "11.4.3", + "@nestjs/swagger": "11.4.4", "@nestjs/terminus": "11.1.1", "@nestjs/throttler": "6.5.0", "@prisma/adapter-pg": "7.8.0", @@ -58,21 +58,21 @@ "express": "5.2.1", "fp-ts": "2.16.11", "graphql": "16.14.0", - "graphql-query-complexity": "1.1.0", + "graphql-query-complexity": "1.1.1", "graphql-redis-subscriptions": "2.7.0", "graphql-subscriptions": "3.0.0", "handlebars": "4.7.9", "io-ts": "2.2.22", - "morgan": "1.10.1", - "nodemailer": "8.0.7", + "morgan": "1.11.0", + "nodemailer": "9.0.1", "passport": "0.7.0", "passport-github2": "0.1.12", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.1", "passport-local": "1.0.0", "passport-microsoft": "2.1.0", - "pg": "8.21.0", - "posthog-node": "5.34.6", + "pg": "8.22.0", + "posthog-node": "5.38.2", "prisma": "7.8.0", "reflect-metadata": "0.2.2", "rimraf": "6.1.3", @@ -81,35 +81,35 @@ "devDependencies": { "@eslint/eslintrc": "3.3.5", "@eslint/js": "10.0.1", - "@nestjs/cli": "11.0.21", + "@nestjs/cli": "11.0.23", "@nestjs/schematics": "11.1.0", - "@nestjs/testing": "11.1.21", + "@nestjs/testing": "11.1.27", "@relmify/jest-fp-ts": "2.1.1", "@types/bcrypt": "6.0.0", "@types/cookie-parser": "1.4.10", "@types/express": "5.0.6", "@types/jest": "30.0.0", - "@types/node": "25.9.0", - "@types/nodemailer": "8.0.0", + "@types/node": "25.9.3", + "@types/nodemailer": "8.0.1", "@types/passport-github2": "1.2.9", "@types/passport-google-oauth20": "2.0.17", "@types/passport-jwt": "4.0.1", "@types/passport-microsoft": "2.1.1", "@types/supertest": "7.2.0", - "@typescript-eslint/eslint-plugin": "8.59.4", - "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", "cross-env": "10.1.0", - "eslint": "10.4.0", + "eslint": "10.5.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-prettier": "5.5.5", + "eslint-plugin-prettier": "5.5.6", "globals": "17.6.0", "jest": "30.4.2", "jest-mock-extended": "4.0.1", - "prettier": "3.8.3", + "prettier": "3.8.4", "source-map-support": "0.5.21", "supertest": "7.2.2", - "ts-jest": "29.4.10", - "ts-loader": "9.5.7", + "ts-jest": "29.4.11", + "ts-loader": "9.6.1", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.9.3" diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index 56bcbfbec83..fac3473880b 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -424,8 +424,8 @@ export const USER_SETTINGS_NULL_SETTINGS = * Global environment doesn't exist for the user * (UserEnvironmentsService) */ -export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS = - 'user_environment/global_env_does_not_exists' as const; +export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST = + 'user_environment/global_env_does_not_exist' as const; /** * Global environment already exists for the user @@ -438,8 +438,8 @@ export const USER_ENVIRONMENT_GLOBAL_ENV_EXISTS = * User environment doesn't exist for the user * (UserEnvironmentsService) */ -export const USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS = - 'user_environment/user_env_does_not_exists' as const; +export const USER_ENVIRONMENT_ENV_DOES_NOT_EXIST = + 'user_environment/user_env_does_not_exist' as const; /** * Cannot delete the global user environment diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts index e53a76aa4dc..787c33645a4 100644 --- a/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts @@ -179,8 +179,8 @@ export class CreateMockServerInput { @IsOptional() @Field({ nullable: true, - defaultValue: true, - description: 'Whether the mock server is publicly accessible', + description: + 'Whether the mock server is publicly accessible (defaults to false/private if omitted)', }) isPublic?: boolean; } diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts index 423e814e6c6..cba6f308170 100644 --- a/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts @@ -48,8 +48,8 @@ export class MockServerResolver { if (E.isLeft(creator)) throwErr(creator.left); return { ...creator.right, - currentGQLSession: JSON.stringify(creator.right.currentGQLSession), - currentRESTSession: JSON.stringify(creator.right.currentRESTSession), + currentGQLSession: null, + currentRESTSession: null, }; } diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts index 646f15f57eb..4f6ba1a7755 100644 --- a/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts @@ -151,6 +151,123 @@ describe('MockServerService', () => { }); }); + describe('cast - server URL generation', () => { + test('should not append /backend to serverUrlDomainBased when ENABLE_SUBPATH_BASED_ACCESS is not set', async () => { + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBe( + 'http://test-subdomain.mock.hopp.io', + ); + }); + + test('should not append /backend to serverUrlDomainBased when ENABLE_SUBPATH_BASED_ACCESS is "false"', async () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'http://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') + return '*.mock.hopp.io'; + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'false'; + if (key === 'ENABLE_SUBPATH_BASED_ACCESS') return 'false'; + return undefined; + }); + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBe( + 'http://test-subdomain.mock.hopp.io', + ); + }); + + test('should append /backend to serverUrlDomainBased when ENABLE_SUBPATH_BASED_ACCESS is "true"', async () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'http://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') + return '*.mock.hopp.io'; + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'false'; + if (key === 'ENABLE_SUBPATH_BASED_ACCESS') return 'true'; + return undefined; + }); + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBe( + 'http://test-subdomain.mock.hopp.io/backend', + ); + }); + + test('should use https protocol and append /backend when secure cookies and subpath access are enabled', async () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'https://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') + return '*.mock.hopp.io'; + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'true'; + if (key === 'ENABLE_SUBPATH_BASED_ACCESS') return 'true'; + return undefined; + }); + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBe( + 'https://test-subdomain.mock.hopp.io/backend', + ); + }); + + test('should leave serverUrlDomainBased null and not append /backend when wildcard domain is not configured', async () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'http://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') return undefined; + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'false'; + if (key === 'ENABLE_SUBPATH_BASED_ACCESS') return 'true'; + return undefined; + }); + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBeNull(); + }); + + test('should strip trailing slashes from wildcard domain before appending subpath suffix', async () => { + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'http://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') + return '*.mock.hopp.io/'; // Domain with trailing slash + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'false'; + if (key === 'ENABLE_SUBPATH_BASED_ACCESS') return 'true'; + return undefined; + }); + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result[0].serverUrlDomainBased).toBe( + 'http://test-subdomain.mock.hopp.io/backend', + ); + }); + }); + describe('getTeamMockServers', () => { test('should return team mock servers with pagination', async () => { const teamMockServer = { @@ -389,6 +506,73 @@ describe('MockServerService', () => { ); }); + // Regression: GHSA-c68f-wr5p-j6jf — isPublic from input must be persisted, + // and must default to private (false) when omitted. + test('should persist isPublic: false when input requests a private server', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + mockPrisma.mockServer.create.mockResolvedValue({ + ...dbMockServer, + isPublic: false, + }); + + const result = await mockServerService.createMockServer(user, { + ...createInput, + isPublic: false, + }); + + expect(mockPrisma.mockServer.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ isPublic: false }), + }), + ); + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).isPublic).toBe(false); + } + }); + + test('should persist isPublic: true when input requests a public server', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + mockPrisma.mockServer.create.mockResolvedValue({ + ...dbMockServer, + isPublic: true, + }); + + const result = await mockServerService.createMockServer(user, { + ...createInput, + isPublic: true, + }); + + expect(mockPrisma.mockServer.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ isPublic: true }), + }), + ); + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).isPublic).toBe(true); + } + }); + + test('should default to private (isPublic: false) when input omits isPublic', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + mockPrisma.mockServer.create.mockResolvedValue({ + ...dbMockServer, + isPublic: false, + }); + + await mockServerService.createMockServer(user, createInput); + + expect(mockPrisma.mockServer.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ isPublic: false }), + }), + ); + }); + test('should create team mock server successfully', async () => { const teamInput: CreateMockServerInput = { name: 'Team Mock Server', diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts index 07980e85e18..6efbb8a4e15 100644 --- a/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts @@ -64,8 +64,20 @@ export class MockServerService { const isSecure = this.configService.get('INFRA.ALLOW_SECURE_COOKIES') === 'true'; const protocol = isSecure ? 'https://' : 'http://'; - const serverUrlDomainBased = wildcardDomain - ? protocol + dbMockServer.subdomain + wildcardDomain.substring(1) + + // ENABLE_SUBPATH_BASED_ACCESS is a flat config key (no INFRA. prefix) to support flexible deployment strategies + const SUBPATH_BACKEND_SUFFIX = '/backend'; + const subpathSuffix = + this.configService.get('ENABLE_SUBPATH_BASED_ACCESS') === 'true' + ? SUBPATH_BACKEND_SUFFIX + : ''; + + const domainPart = wildcardDomain + ? dbMockServer.subdomain + wildcardDomain.substring(1) + : null; + + const serverUrlDomainBased = domainPart + ? `${protocol}${domainPart.replace(/\/+$/, '')}${subpathSuffix}` : null; return { @@ -421,6 +433,7 @@ export class MockServerService { ? input.workspaceID : user.uid, delayInMs: input.delayInMs, + isPublic: input.isPublic ?? false, }, }); this.mockServerAnalyticsService.recordActivity( diff --git a/packages/hoppscotch-backend/src/published-docs/published-docs.service.spec.ts b/packages/hoppscotch-backend/src/published-docs/published-docs.service.spec.ts index 1b1680235fb..3b43b6fe125 100644 --- a/packages/hoppscotch-backend/src/published-docs/published-docs.service.spec.ts +++ b/packages/hoppscotch-backend/src/published-docs/published-docs.service.spec.ts @@ -856,8 +856,8 @@ describe('getPublishedDocsCreator', () => { const expectedUser = { ...user, - currentGQLSession: JSON.stringify(user.currentGQLSession), - currentRESTSession: JSON.stringify(user.currentRESTSession), + currentGQLSession: null, + currentRESTSession: null, }; expect(result).toEqualRight(expectedUser); diff --git a/packages/hoppscotch-backend/src/published-docs/published-docs.service.ts b/packages/hoppscotch-backend/src/published-docs/published-docs.service.ts index d84e2399b7b..14b1da51b8e 100644 --- a/packages/hoppscotch-backend/src/published-docs/published-docs.service.ts +++ b/packages/hoppscotch-backend/src/published-docs/published-docs.service.ts @@ -253,8 +253,8 @@ export class PublishedDocsService { const creator = user ? { ...user, - currentGQLSession: JSON.stringify(user.currentGQLSession), - currentRESTSession: JSON.stringify(user.currentRESTSession), + currentGQLSession: null, + currentRESTSession: null, } : null; diff --git a/packages/hoppscotch-backend/src/team-invitation/team-invitation.resolver.ts b/packages/hoppscotch-backend/src/team-invitation/team-invitation.resolver.ts index b9f21a8b232..5520cec8809 100644 --- a/packages/hoppscotch-backend/src/team-invitation/team-invitation.resolver.ts +++ b/packages/hoppscotch-backend/src/team-invitation/team-invitation.resolver.ts @@ -65,8 +65,8 @@ export class TeamInvitationResolver { return { ...user.value, - currentGQLSession: JSON.stringify(user.value.currentGQLSession), - currentRESTSession: JSON.stringify(user.value.currentRESTSession), + currentGQLSession: null, + currentRESTSession: null, }; } diff --git a/packages/hoppscotch-backend/src/team/team-member.resolver.ts b/packages/hoppscotch-backend/src/team/team-member.resolver.ts index c8b9b22070f..595c9de801f 100644 --- a/packages/hoppscotch-backend/src/team/team-member.resolver.ts +++ b/packages/hoppscotch-backend/src/team/team-member.resolver.ts @@ -17,8 +17,8 @@ export class TeamMemberResolver { return { ...member.value, - currentRESTSession: JSON.stringify(member.value.currentRESTSession), - currentGQLSession: JSON.stringify(member.value.currentGQLSession), + currentRESTSession: null, + currentGQLSession: null, }; } } diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts index e3870d9a803..0bc8d9250f9 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts @@ -417,7 +417,7 @@ export class UserCollectionResolver { return updatedUserCollection.right; } - @Mutation(() => Boolean, { + @Mutation(() => UserCollectionExportJSONData, { description: 'Duplicate a User Collection', }) @UseGuards(GqlAuthGuard) diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts index 87b180f73c1..85212be4b78 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts @@ -1287,7 +1287,7 @@ export class UserCollectionService { * Duplicate a User Collection * * @param collectionID The Collection ID - * @returns Boolean of duplication status + * @returns An Either of the duplicated UserCollectionExportJSONData */ async duplicateUserCollection( collectionID: string, @@ -1321,7 +1321,7 @@ export class UserCollectionService { ); if (E.isLeft(result)) return E.left(result.left as string); - return E.right(true); + return E.right(result.right); } /** diff --git a/packages/hoppscotch-backend/src/user-environment/user-environments.service.spec.ts b/packages/hoppscotch-backend/src/user-environment/user-environments.service.spec.ts index d98981b8174..6ac16e98c1a 100644 --- a/packages/hoppscotch-backend/src/user-environment/user-environments.service.spec.ts +++ b/packages/hoppscotch-backend/src/user-environment/user-environments.service.spec.ts @@ -3,8 +3,9 @@ import { mockDeep, mockReset } from 'jest-mock-extended'; import { PrismaService } from '../prisma/prisma.service'; import { UserEnvironmentsService } from './user-environments.service'; import { - USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS, + USER_ENVIRONMENT_ENV_DOES_NOT_EXIST, USER_ENVIRONMENT_GLOBAL_ENV_DELETION_FAILED, + USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST, USER_ENVIRONMENT_GLOBAL_ENV_EXISTS, USER_ENVIRONMENT_INVALID_ENVIRONMENT_NAME, } from '../errors'; @@ -140,7 +141,7 @@ describe('UserEnvironmentsService', () => { expect( await userEnvironmentsService.fetchUserGlobalEnvironment('abc'), - ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + ).toEqualLeft(USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST); }); }); @@ -359,7 +360,7 @@ describe('UserEnvironmentsService', () => { '[{}]', mockUser, ), - ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); }); test('Should update a users personal environment and publish an updated subscription ', async () => { @@ -458,7 +459,7 @@ describe('UserEnvironmentsService', () => { return expect( await userEnvironmentsService.deleteUserEnvironment('abc123', 'env1'), - ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); }); test('Should resolve right, delete a users personal environment and publish a deleted subscription', async () => { @@ -545,7 +546,7 @@ describe('UserEnvironmentsService', () => { return expect( await userEnvironmentsService.deleteUserEnvironment('abc123', 'genv1'), - ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + ).toEqualLeft(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); }); test('Should resolve right,delete all variables inside users global environment and publish an updated subscription', async () => { diff --git a/packages/hoppscotch-backend/src/user-environment/user-environments.service.ts b/packages/hoppscotch-backend/src/user-environment/user-environments.service.ts index b1214d06502..e91d294d1e2 100644 --- a/packages/hoppscotch-backend/src/user-environment/user-environments.service.ts +++ b/packages/hoppscotch-backend/src/user-environment/user-environments.service.ts @@ -5,8 +5,8 @@ import { PubSubService } from '../pubsub/pubsub.service'; import * as E from 'fp-ts/Either'; import * as O from 'fp-ts/Option'; import { - USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS, - USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS, + USER_ENVIRONMENT_ENV_DOES_NOT_EXIST, + USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST, USER_ENVIRONMENT_GLOBAL_ENV_DELETION_FAILED, USER_ENVIRONMENT_GLOBAL_ENV_EXISTS, USER_ENVIRONMENT_IS_NOT_GLOBAL, @@ -72,7 +72,7 @@ export class UserEnvironmentsService { }); } - return E.left(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + return E.left(USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST); } /** @@ -163,7 +163,7 @@ export class UserEnvironmentsService { ); return E.right(updatedUserEnvironment); } catch (e) { - return E.left(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + return E.left(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); } } @@ -205,7 +205,7 @@ export class UserEnvironmentsService { ); return E.right(true); } catch (e) { - return E.left(USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS); + return E.left(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); } } @@ -240,7 +240,7 @@ export class UserEnvironmentsService { async clearGlobalEnvironments(uid: string, id: string) { const globalEnvExists = await this.checkForExistingGlobalEnv(uid); if (O.isNone(globalEnvExists)) - return E.left(USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS); + return E.left(USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXIST); const env = globalEnvExists.value; if (env.id === id) { diff --git a/packages/hoppscotch-backend/src/user-environment/user.resolver.ts b/packages/hoppscotch-backend/src/user-environment/user.resolver.ts index c1d8d31d4ec..e4bab7719f8 100644 --- a/packages/hoppscotch-backend/src/user-environment/user.resolver.ts +++ b/packages/hoppscotch-backend/src/user-environment/user.resolver.ts @@ -1,9 +1,13 @@ import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; +import { UseGuards } from '@nestjs/common'; import { User } from 'src/user/user.model'; import { UserEnvironment } from './user-environments.model'; import { UserEnvironmentsService } from './user-environments.service'; import * as E from 'fp-ts/Either'; import { throwErr } from '../utils'; +import { GqlAuthGuard } from '../guards/gql-auth.guard'; +import { GqlUser } from '../decorators/gql-user.decorator'; +import { USER_ENVIRONMENT_ENV_DOES_NOT_EXIST } from '../errors'; @Resolver(() => User) export class UserEnvsUserResolver { @@ -12,16 +16,26 @@ export class UserEnvsUserResolver { @ResolveField(() => [UserEnvironment], { description: 'Returns a list of users personal environments', }) - async environments(@Parent() user: User): Promise { + @UseGuards(GqlAuthGuard) + async environments( + @Parent() user: User, + @GqlUser() requestingUser: User, + ): Promise { + if (requestingUser?.uid !== user.uid) return []; return await this.userEnvironmentsService.fetchUserEnvironments(user.uid); } @ResolveField(() => UserEnvironment, { description: 'Returns the users global environments', }) + @UseGuards(GqlAuthGuard) async globalEnvironments( @Parent() user: User, + @GqlUser() requestingUser: User, ): Promise { + if (requestingUser?.uid !== user.uid) { + throwErr(USER_ENVIRONMENT_ENV_DOES_NOT_EXIST); + } const userEnvironment = await this.userEnvironmentsService.fetchUserGlobalEnvironment(user.uid); if (E.isLeft(userEnvironment)) throwErr(userEnvironment.left); diff --git a/packages/hoppscotch-backend/src/user-history/user-history.service.spec.ts b/packages/hoppscotch-backend/src/user-history/user-history.service.spec.ts index c9ccba49ec3..bf27ff43ce1 100644 --- a/packages/hoppscotch-backend/src/user-history/user-history.service.spec.ts +++ b/packages/hoppscotch-backend/src/user-history/user-history.service.spec.ts @@ -369,6 +369,53 @@ describe('UserHistoryService', () => { userHistory, ); }); + test('Should scope the lookup and the update to the requesting user (ownership enforcement)', async () => { + const executedOn = new Date(); + + mockPrisma.userHistory.findFirst.mockResolvedValueOnce({ + userUid: 'abc', + id: '1', + request: [{}], + responseMetadata: [{}], + reqType: ReqType.REST, + executedOn, + isStarred: false, + }); + mockPrisma.userHistory.update.mockResolvedValueOnce({ + userUid: 'abc', + id: '1', + request: [{}], + responseMetadata: [{}], + reqType: ReqType.REST, + executedOn, + isStarred: true, + }); + + await userHistoryService.toggleHistoryStarStatus('abc', '1'); + + expect(mockPrisma.userHistory.findFirst).toHaveBeenCalledWith({ + where: { id: '1', userUid: 'abc' }, + }); + expect(mockPrisma.userHistory.update).toHaveBeenCalledWith({ + where: { id: '1', userUid: 'abc' }, + data: { isStarred: true }, + }); + }); + test('Should resolve left when the history entry is not owned by the requesting user', async () => { + // Scoped lookup finds nothing because the entry belongs to another user + mockPrisma.userHistory.findFirst.mockResolvedValueOnce(null); + + const result = await userHistoryService.toggleHistoryStarStatus( + 'attacker', + '1', + ); + + expect(result).toEqualLeft(USER_HISTORY_NOT_FOUND); + // The lookup must be scoped to the requesting user's uid + expect(mockPrisma.userHistory.findFirst).toHaveBeenCalledWith({ + where: { id: '1', userUid: 'attacker' }, + }); + }); }); describe('removeRequestFromHistory', () => { test('Should resolve right and delete request from users history', async () => { @@ -433,6 +480,38 @@ describe('UserHistoryService', () => { userHistory, ); }); + test('Should scope the delete to the requesting user (ownership enforcement)', async () => { + mockPrisma.userHistory.delete.mockResolvedValueOnce({ + userUid: 'abc', + id: '1', + request: [{}], + responseMetadata: [{}], + reqType: ReqType.REST, + executedOn: date, + isStarred: false, + }); + + await userHistoryService.removeRequestFromHistory('abc', '1'); + + expect(mockPrisma.userHistory.delete).toHaveBeenCalledWith({ + where: { id: '1', userUid: 'abc' }, + }); + }); + test('Should resolve left when deleting a history entry not owned by the requesting user', async () => { + // Prisma throws when no row matches the user-scoped where clause + mockPrisma.userHistory.delete.mockRejectedValueOnce(new Error('P2025')); + + const result = await userHistoryService.removeRequestFromHistory( + 'attacker', + '1', + ); + + expect(result).toEqualLeft(USER_HISTORY_NOT_FOUND); + // The delete must be scoped to the requesting user's uid + expect(mockPrisma.userHistory.delete).toHaveBeenCalledWith({ + where: { id: '1', userUid: 'attacker' }, + }); + }); }); describe('deleteAllUserHistory', () => { test('Should resolve right and delete all user REST history for a request type', async () => { diff --git a/packages/hoppscotch-backend/src/user-history/user-history.service.ts b/packages/hoppscotch-backend/src/user-history/user-history.service.ts index 19d65ae4f12..c16978db655 100644 --- a/packages/hoppscotch-backend/src/user-history/user-history.service.ts +++ b/packages/hoppscotch-backend/src/user-history/user-history.service.ts @@ -99,7 +99,7 @@ export class UserHistoryService { * @returns an Either of updated `UserHistory` or Error */ async toggleHistoryStarStatus(uid: string, id: string) { - const userHistory = await this.fetchUserHistoryByID(id); + const userHistory = await this.fetchUserHistoryByID(id, uid); if (O.isNone(userHistory)) { return E.left(USER_HISTORY_NOT_FOUND); } @@ -108,6 +108,7 @@ export class UserHistoryService { const updatedHistory = await this.prisma.userHistory.update({ where: { id: id, + userUid: uid, }, data: { isStarred: !userHistory.value.isStarred, @@ -142,6 +143,7 @@ export class UserHistoryService { const delUserHistory = await this.prisma.userHistory.delete({ where: { id: id, + userUid: uid, }, }); @@ -205,14 +207,16 @@ export class UserHistoryService { } /** - * Fetch a user history based on history ID. + * Fetch a user history based on history ID, scoped to its owner. * @param id User History ID - * @returns an `UserHistory` object + * @param uid UID of the user the history entry must belong to + * @returns an `UserHistory` object owned by the given user, or `O.none` */ - async fetchUserHistoryByID(id: string) { + async fetchUserHistoryByID(id: string, uid: string) { const userHistory = await this.prisma.userHistory.findFirst({ where: { id: id, + userUid: uid, }, }); if (userHistory == null) return O.none; diff --git a/packages/hoppscotch-backend/src/user-history/user.resolver.ts b/packages/hoppscotch-backend/src/user-history/user.resolver.ts index b6758d159ae..3c46481432c 100644 --- a/packages/hoppscotch-backend/src/user-history/user.resolver.ts +++ b/packages/hoppscotch-backend/src/user-history/user.resolver.ts @@ -1,9 +1,12 @@ import { Args, Parent, ResolveField, Resolver } from '@nestjs/graphql'; +import { UseGuards } from '@nestjs/common'; import { User } from '../user/user.model'; import { UserHistoryService } from './user-history.service'; import { UserHistory } from './user-history.model'; import { ReqType } from 'src/types/RequestTypes'; import { PaginationArgs } from '../types/input-types.args'; +import { GqlAuthGuard } from '../guards/gql-auth.guard'; +import { GqlUser } from '../decorators/gql-user.decorator'; @Resolver(() => User) export class UserHistoryUserResolver { @@ -12,10 +15,13 @@ export class UserHistoryUserResolver { @ResolveField(() => [UserHistory], { description: 'Returns a users REST history', }) + @UseGuards(GqlAuthGuard) async RESTHistory( @Parent() user: User, + @GqlUser() requestingUser: User, @Args() args: PaginationArgs, ): Promise { + if (requestingUser?.uid !== user.uid) return []; return await this.userHistoryService.fetchUserHistory( user.uid, args.take, @@ -25,10 +31,13 @@ export class UserHistoryUserResolver { @ResolveField(() => [UserHistory], { description: 'Returns a users GraphQL history', }) + @UseGuards(GqlAuthGuard) async GQLHistory( @Parent() user: User, + @GqlUser() requestingUser: User, @Args() args: PaginationArgs, ): Promise { + if (requestingUser?.uid !== user.uid) return []; return await this.userHistoryService.fetchUserHistory( user.uid, args.take, diff --git a/packages/hoppscotch-backend/src/user-settings/user.resolver.ts b/packages/hoppscotch-backend/src/user-settings/user.resolver.ts index b5f63de6e52..d191e03cfde 100644 --- a/packages/hoppscotch-backend/src/user-settings/user.resolver.ts +++ b/packages/hoppscotch-backend/src/user-settings/user.resolver.ts @@ -1,9 +1,13 @@ import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; +import { UseGuards } from '@nestjs/common'; import { User } from 'src/user/user.model'; import { UserSettings } from './user-settings.model'; import { UserSettingsService } from './user-settings.service'; import * as E from 'fp-ts/Either'; import { throwErr } from 'src/utils'; +import { GqlAuthGuard } from '../guards/gql-auth.guard'; +import { GqlUser } from '../decorators/gql-user.decorator'; +import { USER_SETTINGS_NOT_FOUND } from '../errors'; @Resolver(() => User) export class UserSettingsUserResolver { @@ -12,7 +16,9 @@ export class UserSettingsUserResolver { @ResolveField(() => UserSettings, { description: 'Returns user settings', }) - async settings(@Parent() user: User) { + @UseGuards(GqlAuthGuard) + async settings(@Parent() user: User, @GqlUser() requestingUser: User) { + if (requestingUser?.uid !== user.uid) throwErr(USER_SETTINGS_NOT_FOUND); const userSettings = await this.userSettingsService.fetchUserSettings(user); if (E.isLeft(userSettings)) throwErr(userSettings.left); diff --git a/packages/hoppscotch-backend/src/utils.ts b/packages/hoppscotch-backend/src/utils.ts index 62d3f77ef85..f2c0901eeda 100644 --- a/packages/hoppscotch-backend/src/utils.ts +++ b/packages/hoppscotch-backend/src/utils.ts @@ -205,10 +205,27 @@ export const validateSMTPUrl = (url: string) => { if (!url || url.length === 0) return false; - const regex = - /^(smtp|smtps):\/\/(?:([^:]+):([^@]+)@)?((?!\.)[^:]+)(?::(\d+))?$/; - if (regex.test(url)) return true; - return false; + if (/[\s\x00-\x1f\x7f]/.test(url)) return false; + if (/[?#\\]/.test(url)) return false; + if (url.endsWith(':')) return false; + + let parsed: URL; + try { + parsed = new URL(url); + } catch { + return false; + } + + // Only the SMTP schemes are permitted. + if (parsed.protocol !== 'smtp:' && parsed.protocol !== 'smtps:') return false; + if (parsed.pathname !== '' && parsed.pathname !== '/') return false; + if (parsed.search !== '' || parsed.hash !== '') return false; + + // A hostname is required and must not start with a dot. + if (!parsed.hostname || parsed.hostname.startsWith('.')) return false; + + // Port, when present, must be numeric (the URL parser already guarantees this). + return true; }; /** diff --git a/packages/hoppscotch-cli/package.json b/packages/hoppscotch-cli/package.json index f86342e761a..722442e9e98 100644 --- a/packages/hoppscotch-cli/package.json +++ b/packages/hoppscotch-cli/package.json @@ -1,6 +1,6 @@ { "name": "@hoppscotch/cli", - "version": "0.31.2", + "version": "0.31.3", "description": "A CLI to run Hoppscotch test scripts in CI environments.", "homepage": "https://hoppscotch.io", "type": "module", @@ -42,7 +42,7 @@ "private": false, "dependencies": { "aws4fetch": "1.0.20", - "axios": "1.15.2", + "axios": "1.18.0", "axios-cookiejar-support": "6.0.5", "chalk": "5.6.2", "commander": "14.0.3", @@ -50,9 +50,9 @@ "js-md5": "0.8.3", "jsonc-parser": "3.3.1", "lodash-es": "4.18.1", - "papaparse": "5.5.3", - "qs": "6.15.1", - "semver": "7.8.0", + "papaparse": "5.5.4", + "qs": "6.15.2", + "semver": "7.8.5", "tough-cookie": "6.0.1", "verzod": "0.4.0", "xmlbuilder2": "4.0.3", @@ -66,9 +66,9 @@ "@types/papaparse": "5.5.2", "@types/qs": "6.15.1", "fp-ts": "2.16.11", - "prettier": "3.8.3", + "prettier": "3.8.4", "tsup": "8.5.1", "typescript": "5.9.3", - "vitest": "4.1.6" + "vitest": "4.1.9" } } diff --git a/packages/hoppscotch-common/languages.json b/packages/hoppscotch-common/languages.json index 8356912dc08..f8a14e88adc 100644 --- a/packages/hoppscotch-common/languages.json +++ b/packages/hoppscotch-common/languages.json @@ -174,6 +174,12 @@ "iso": "sv-SV", "name": "Svenska" }, + { + "code": "th", + "file": "th.json", + "iso": "th-TH", + "name": "ไทย" + }, { "code": "tr", "file": "tr.json", diff --git a/packages/hoppscotch-common/locales/cn.json b/packages/hoppscotch-common/locales/cn.json index 4c69405d455..73311d90615 100644 --- a/packages/hoppscotch-common/locales/cn.json +++ b/packages/hoppscotch-common/locales/cn.json @@ -538,7 +538,6 @@ "versions": "版本", "create_new_version": "创建新版本", "invalid_version": "版本只能包含字母数字字符、点和连字符", - "snapshot_description": "这会将当前文档快照保存为此版本", "live": "实时版", "snapshot": "快照", "version_immutable": "已发布版本为只读快照", @@ -556,8 +555,9 @@ "snapshot_empty": "此快照中没有请求或文件夹", "snapshot_item_count": "{count} 项", "auto_sync_live_notice": "此版本会与实时集合自动同步", + "snapshot_promote_warning": "启用自动同步会将此冻结快照替换为实时集合树。此操作无法撤销。", + "live_freeze_notice": "自动同步将被关闭,并且此版本会冻结在当前集合状态。", "untitled_project": "未命名项目", - "first_publish_hint": "您的文档将作为一个实时版本发布,并自动与您的集合保持同步", "environment": "环境", "no_environment": "无环境", "environment_description": "附加一个环境以解析已发布文档中的变量" @@ -841,6 +841,7 @@ "authorization": "授权头将会在您发送请求时自动生成。", "collection_properties_authorization": "这个授权将被应用在当前集合下的所有请求。", "collection_properties_header": "这个请求头将被应用在当前集合下的所有请求。", + "collection_properties_scripts": "这些脚本会针对该集合中的每个请求运行。预请求脚本会在请求发送前运行,请求后脚本会在收到响应后运行。", "generate_documentation_first": "请先生成文档", "network_fail": "无法到达 API 端点。请检查网络连接并重试。", "offline": "您似乎处于离线状态,该工作区中的数据可能不是最新。", @@ -1256,6 +1257,12 @@ "saved": "响应已保存", "invalid_name": "请为响应提供名称" }, + "script": { + "inheriting": "正在从以下位置继承脚本", + "inheriting_from_count": "从 {count} 个集合继承 | 从 {count} 个集合继承", + "inherited_scripts": "继承的脚本", + "view_inherited": "查看继承的脚本" + }, "settings": { "accent_color": "强调色", "account": "帐户", @@ -1281,7 +1288,21 @@ "dark_mode": "暗色", "delete_account": "刪除账号", "delete_account_description": "一旦您删除了您的帐号,您的所有数据将被永久删除。此操作无法复原。", + "desktop": "桌面版", + "desktop_description": "更新 Hoppscotch 桌面应用的行为和键盘处理方式。", + "desktop_keyboard": "键盘", + "desktop_keyboard_strategy_label": "按输入字符或物理按键位置匹配快捷键", + "desktop_keyboard_strategy_description": "在非 QWERTY 布局中,同一个字母可能来自不同的物理按键。默认设置适用于大多数布局;如果快捷键在您的布局上未按预期触发,请切换选项。", + "desktop_keyboard_strategy_hybrid": "智能(推荐)", + "desktop_keyboard_strategy_hybrid_description": "拉丁字符使用输入的字母;非拉丁布局(西里尔、CJK)则回退到物理按键位置。", + "desktop_keyboard_strategy_key": "输入的字母", + "desktop_keyboard_strategy_key_description": "始终使用输入的字母。如果快捷键在您的布局上未按预期工作,请选择此项。", + "desktop_keyboard_strategy_code": "物理按键位置", + "desktop_keyboard_strategy_code_description": "始终使用 US-QWERTY 物理位置。如果您在非拉丁布局上已有 QWERTY 肌肉记忆,请选择此项。", + "desktop_updates": "更新", "disable_encode_mode_tooltip": "从不编码请求中的参数", + "disable_update_checks": "禁用自动更新检查", + "disable_update_checks_description": "应用启动时跳过更新检查。使用上方按钮可按需检查。", "enable_encode_mode_tooltip": "始终编码请求中的参数", "enter_otp": "输入 Agent 的验证码", "expand_navigation": "展开导航栏", @@ -1339,6 +1360,15 @@ "telemetry_helps_us": "遥测服务帮助我们进行个性化操作,为您提供最佳体验。", "theme": "主题", "theme_description": "自定义您的应用程序主题。", + "update_check_description": "手动检查新版本并安装。无论下方开关状态如何都可使用。", + "update_check_now": "检查更新", + "update_checking": "正在检查…", + "update_download_version": "下载 v{version}", + "update_downloading": "正在下载…", + "update_downloading_percent": "正在下载 {percent}%", + "update_installing": "正在安装…", + "update_restart_now": "重启以应用更新", + "update_up_to_date": "已是最新版本", "use_experimental_url_bar": "使用实验性的带有环境高亮的 URL 栏", "user": "用户", "verified_email": "已验证邮箱地址", @@ -1781,6 +1811,7 @@ "parameters": "参数", "post_request_script": "请求后脚本", "pre_request_script": "预请求脚本", + "scripts": "脚本", "queries": "查询", "query": "查询", "schema": "模式", @@ -2327,4 +2358,4 @@ "delete_error": "删除 Mock 服务失败" } } -} \ No newline at end of file +} diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index f32c1fee9e5..1f52c235919 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -393,7 +393,10 @@ "cookie_value": "Value", "empty_domain": "Domain is empty", "empty_domains": "Domain list is empty", + "invalid_domain": "Domain has invalid characters", "enter_cookie_string": "Enter cookie string", + "http_only": "HttpOnly", + "http_only_info": "Not exposed to page scripts. Still sent on matching requests.", "interceptor_no_support": "Your currently selected interceptor does not support cookies. Select a different Interceptor and try again.", "managed_tab": "Managed", "new_domain_name": "New domain name", diff --git a/packages/hoppscotch-common/locales/fi.json b/packages/hoppscotch-common/locales/fi.json index 604df9a7bd3..563c2e8a30f 100644 --- a/packages/hoppscotch-common/locales/fi.json +++ b/packages/hoppscotch-common/locales/fi.json @@ -1,246 +1,413 @@ { "action": { - "add": "Add", - "autoscroll": "Autoscroll", - "cancel": "Peruuttaa", + "add": "Lisää", + "autoscroll": "Automaattinen vieritys", + "cancel": "Peruuta", "choose_file": "Valitse tiedosto", - "clear": "Asia selvä", - "clear_all": "Tyhjennä", - "clear_history": "Clear all History", - "close": "Close", - "connect": "Kytkeä", - "connecting": "Connecting", - "copy": "Kopio", - "create": "Create", - "delete": "Poistaa", - "disconnect": "Katkaista", + "choose_workspace": "Valitse työtila", + "choose_collection": "Valitse kokoelma", + "select_workspace": "Valitse työtila", + "clear": "Tyhjennä", + "clear_all": "Tyhjennä kaikki", + "clear_cache": "Tyhjennä välimuisti", + "clear_history": "Tyhjennä kaikki historia", + "clear_unpinned": "Tyhjennä kiinnittämättömät", + "clear_response": "Tyhjennä vastaus", + "close": "Sulje", + "confirm": "Vahvista", + "connect": "Yhdistä", + "connecting": "Yhdistetään", + "copy": "Kopioi", + "create": "Luo", + "delete": "Poista", + "disconnect": "Katkaise yhteys", "dismiss": "Hylkää", - "dont_save": "Don't save", + "done": "Valmis", + "dont_save": "Älä tallenna", "download_file": "Lataa tiedosto", - "drag_to_reorder": "Drag to reorder", - "duplicate": "Duplicate", - "edit": "Muokata", - "filter": "Filter", - "go_back": "Mene takaisin", - "go_forward": "Go forward", - "group_by": "Group by", - "hide_secret": "Hide secret", - "label": "Etiketti", + "download_test_report": "Lataa testiraportti", + "drag_to_reorder": "Vedä järjestääksesi uudelleen", + "duplicate": "Monista", + "edit": "Muokkaa", + "filter": "Suodata", + "go_back": "Takaisin", + "go_forward": "Eteenpäin", + "group_by": "Ryhmittele", + "hide_secret": "Piilota salaisuus", + "label": "Tunniste", "learn_more": "Lue lisää", - "download_here": "Download here", - "less": "Less", + "download_here": "Lataa tästä", + "less": "Vähemmän", "more": "Lisää", "new": "Uusi", "no": "Ei", - "open_workspace": "Open workspace", - "paste": "Paste", - "prettify": "Koristella", - "properties": "Properties", + "open": "Avaa", + "open_workspace": "Avaa työtila", + "paste": "Liitä", + "prettify": "Siisti", + "properties": "Ominaisuudet", + "register": "Rekisteröidy", "remove": "Poista", - "rename": "Rename", - "restore": "Palauttaa", - "save": "Tallentaa", - "scroll_to_bottom": "Scroll to bottom", - "scroll_to_top": "Scroll to top", + "remove_instance": "Poista instanssi", + "rename": "Nimeä uudelleen", + "restore": "Palauta", + "retry": "Yritä uudelleen", + "save": "Tallenna", + "save_as_example": "Tallenna esimerkkinä", + "add_example": "Lisää esimerkki", + "invalid_request": "Virheelliset pyyntötiedot", + "scroll_to_bottom": "Vieritä alas", + "scroll_to_top": "Vieritä ylös", "search": "Hae", - "send": "Lähettää", - "share": "Share", - "show_secret": "Show secret", - "start": "alkaa", - "starting": "Starting", - "stop": "Lopettaa", - "to_close": "to close", - "to_navigate": "to navigate", - "to_select": "to select", - "turn_off": "Sammuttaa", - "turn_on": "Kiihottua", + "send": "Lähetä", + "share": "Jaa", + "show_secret": "Näytä salaisuus", + "sort": "Järjestä", + "start": "Aloita", + "starting": "Käynnistetään", + "stop": "Pysäytä", + "to_close": "sulkeaksesi", + "to_navigate": "navigoidaksesi", + "to_select": "valitaksesi", + "turn_off": "Poista käytöstä", + "turn_on": "Ota käyttöön", "undo": "Kumoa", - "yes": "Joo" + "unpublish": "Poista julkaisu", + "yes": "Kyllä", + "verify": "Vahvista", + "enable": "Ota käyttöön", + "disable": "Poista käytöstä", + "assign": "Määritä" + }, + "activity_logs": { + "ACTIVITY_LOG_DELETE": "Toimintoloki on poistettu", + "WORKSPACE_CREATE": "Luotiin uusi työtila {name}", + "WORKSPACE_RENAME": "Työtila nimettiin uudelleen: {old_name} → {new_name}", + "WORKSPACE_USER_ADD": "{user} lisättiin työtilaan roolilla {role}", + "WORKSPACE_USER_INVITE": "{user} kutsui käyttäjän {inviteeEmail} roolilla {role}", + "WORKSPACE_USER_INVITE_REVOKE": "Käyttäjän {inviteeEmail} kutsu roolilla {inviteeRole} peruutettiin", + "WORKSPACE_USER_INVITE_ACCEPT": "{inviteeEmail} hyväksyi kutsun roolilla {inviteeRole}", + "WORKSPACE_USER_REMOVE": "{user} poistettiin työtilasta", + "WORKSPACE_USER_ROLE_UPDATE": "Käyttäjän {user} rooli päivitettiin: {old_role} → {new_role}", + "COLLECTION_CREATE": "Luotiin uusi kokoelma {title}", + "COLLECTION_RENAME": "Kokoelma nimettiin uudelleen: {old_title} → {new_title}", + "COLLECTION_IMPORT": "Tuotiin {count} kokoelma(a)", + "COLLECTION_DELETE": "Poistettiin kokoelma {title}", + "COLLECTION_DUPLICATE": "Kopioitiin kokoelma {parentTitle}", + "REQUEST_CREATE": "Luotiin uusi pyyntö {title}", + "REQUEST_RENAME": "Pyyntö nimettiin uudelleen: {old_title} → {new_title}", + "REQUEST_DELETE": "Poistettiin pyyntö {title}" }, "add": { "new": "Lisää uusi", "star": "Lisää tähti" }, + "agent": { + "registration_instruction": "Rekisteröi Hoppscotch Agent verkkosovellukseesi jatkaaksesi.", + "enter_otp_instruction": "Syötä Hoppscotch Agentin luoma vahvistuskoodi ja suorita rekisteröinti loppuun", + "otp_label": "Vahvistuskoodi", + "processing": "Käsitellään pyyntöäsi...", + "not_running_title": "Agenttia ei havaittu", + "registration_title": "Agentin rekisteröinti", + "verify_ssl_certs": "Vahvista SSL-sertifikaatit", + "ca_certs": "CA-sertifikaatit", + "client_certs": "Asiakassertifikaatit", + "use_http_proxy": "Käytä HTTP-välityspalvelinta", + "proxy_capabilities": "Hoppscotch Agent tukee HTTP/HTTPS/SOCKS-välityspalvelimia sekä NTLM- ja Basic Auth -todennusta. Sisällytä käyttäjänimi ja salasana välityspalvelimen todennusta varten suoraan URL-osoitteeseen.", + "add_cert_file": "Lisää sertifikaattitiedosto", + "add_client_cert": "Lisää asiakassertifikaatti", + "add_key_file": "Lisää avaintiedosto", + "domain": "Verkkotunnus", + "cert": "Sertifikaatti", + "key": "Avain", + "pfx_or_pkcs": "PFX/PKCS12", + "pfx_or_pkcs_file": "PFX/PKCS12-tiedosto", + "add_pfx_or_pkcs_file": "Lisää PFX/PKCS12-tiedosto" + }, "app": { - "chat_with_us": "Juttele kanssamme", - "contact_us": "Ota meihin yhteyttä", - "cookies": "Cookies", - "copy": "Kopio", - "copy_interface_type": "Copy interface type", - "copy_user_id": "Copy User Auth Token", - "developer_option": "Developer options", - "developer_option_description": "Developer tools which helps in development and maintenance of Hoppscotch.", + "additional_links": { + "macOS": "macOS", + "windows": "Windows", + "linux": "Linux", + "web_app": "Verkkosovellus", + "cli": "CLI" + }, + "downloads": "Lataukset", + "chat_with_us": "Keskustele kanssamme", + "contact_us": "Ota yhteyttä", + "cookies": "Evästeet", + "copy": "Kopioi", + "copy_interface_type": "Kopioi rajapintatyyppi", + "copy_user_id": "Kopioi käyttäjän todennustoken", + "developer_option": "Kehittäjäasetukset", + "developer_option_description": "Kehittäjätyökalut Hoppscotchin kehitykseen ja ylläpitoon.", "discord": "Discord", - "documentation": "Dokumentointi", + "documentation": "Dokumentaatio", "github": "GitHub", - "help": "Ohje, palaute ja dokumentaatio", - "home": "Koti", + "help": "Ohje ja palaute", + "home": "Etusivu", "invite": "Kutsu", - "invite_description": "Hoppscotchissa suunnittelimme yksinkertaisen ja intuitiivisen käyttöliittymän sovellusliittymiesi luomiseen ja hallintaan. Hoppscotch on työkalu, jonka avulla voit rakentaa, testata, dokumentoida ja jakaa sovellusliittymiäsi.", + "invite_description": "Hoppscotch on avoimen lähdekoodin API-kehitysympäristö. Suunnittelimme yksinkertaisen ja intuitiivisen käyttöliittymän API-rajapintojen luomiseen ja hallintaan. Hoppscotch auttaa sinua rakentamaan, testaamaan, dokumentoimaan ja jakamaan API-rajapintasi.", "invite_your_friends": "Kutsu ystäväsi", - "join_discord_community": "Liity Discord -yhteisöön", + "join_discord_community": "Liity Discord-yhteisöömme", "keyboard_shortcuts": "Pikanäppäimet", "name": "Hoppscotch", - "new_version_found": "Uusi versio löytyi. Päivitä päivittääksesi.", - "open_in_hoppscotch": "Open in Hoppscotch", - "options": "Options", + "new_version_found": "Uusi versio löytyi. Päivitä sivusto.", + "open_in_hoppscotch": "Avaa Hoppscotchissa", + "options": "Asetukset", + "powered_by": "Powered by Hoppscotch", "proxy_privacy_policy": "Välityspalvelimen tietosuojakäytäntö", "reload": "Lataa uudelleen", - "search": "Hae", + "search": "Haku ja komennot", "share": "Jaa", "shortcuts": "Pikanäppäimet", - "social_description": "Follow us on social media to stay updated with the latest news, updates and releases.", - "social_links": "Social links", - "spotlight": "Valokeila", + "social_description": "Seuraa meitä sosiaalisessa mediassa pysyäksesi ajan tasalla uusimmista uutisista, päivityksistä ja julkaisuista.", + "social_links": "Sosiaaliset linkit", + "spotlight": "Spotlight", "status": "Tila", - "status_description": "Check the status of the website", - "terms_and_privacy": "Ehdot ja yksityisyys", + "status_description": "Tarkista sivuston tila", + "terms_and_privacy": "Ehdot ja tietosuoja", "twitter": "Twitter", "type_a_command_search": "Kirjoita komento tai hae…", "we_use_cookies": "Käytämme evästeitä", - "updated_text": "Hoppscotch has been updated to v{version} 🎉", - "whats_new": "Mikä on uutta?", - "see_whats_new": "See what’s new", - "wiki": "Wiki" + "updated_text": "Hoppscotch on päivitetty versioon v{version} 🎉", + "whats_new": "Mitä uutta?", + "see_whats_new": "Katso mitä uutta", + "wiki": "Wiki", + "collapse_sidebar": "Pienennä sivupalkki", + "continue_to_dashboard": "Jatka hallintapaneeliin", + "expand_sidebar": "Laajenna sivupalkki", + "no_name": "Nimetön", + "open_navigation": "Avaa navigaatio", + "read_documentation": "Lue dokumentaatio", + "default": "oletus: {value}" }, "auth": { - "account_exists": "Tili on eri kirjautumistiedoilla - Kirjaudu linkittääksesi molemmat tilit", + "account_deactivated": "Tilisi on deaktivoitu. Ota yhteyttä ylläpitäjään saadaksesi pääsyn.", + "account_exists": "Tili on olemassa eri tunnistetiedoilla - Kirjaudu sisään yhdistääksesi molemmat tilit", "all_sign_in_options": "Kaikki kirjautumisvaihtoehdot", - "continue_with_auth_provider": "Continue with {provider}", + "continue_with_auth_provider": "Jatka palvelulla {provider}", "continue_with_email": "Jatka sähköpostilla", "continue_with_github": "Jatka GitHubilla", - "continue_with_github_enterprise": "Continue with GitHub Enterprise", + "continue_with_github_enterprise": "Jatka GitHub Enterprisella", "continue_with_google": "Jatka Googlella", - "continue_with_microsoft": "Continue with Microsoft", + "continue_with_microsoft": "Jatka Microsoftilla", "email": "Sähköposti", - "logged_out": "Kirjautunut ulos", + "logged_out": "Kirjauduttu ulos", "login": "Kirjaudu sisään", "login_success": "Kirjautuminen onnistui", "login_to_hoppscotch": "Kirjaudu Hoppscotchiin", - "logout": "Kirjautua ulos", - "re_enter_email": "Syötä sähköpostiosoite uudestaan", - "send_magic_link": "Lähetä maaginen linkki", + "logout": "Kirjaudu ulos", + "re_enter_email": "Syötä sähköposti uudelleen", + "send_magic_link": "Lähetä kirjautumislinkki", "sync": "Synkronoi", - "we_sent_magic_link": "Lähetimme sinulle maagisen linkin!", - "we_sent_magic_link_description": "Tarkista postilaatikkosi - lähetimme sähköpostin osoitteeseen {email}. Se sisältää maagisen linkin, joka kirjaa sinut sisään." + "we_sent_magic_link": "Lähetimme sinulle kirjautumislinkin!", + "we_sent_magic_link_description": "Tarkista saapuneet - lähetimme sähköpostin osoitteeseen {email}. Se sisältää linkin, jolla voit kirjautua sisään." }, "authorization": { - "generate_token": "Luo tunnus", - "graphql_headers": "Authorization Headers are sent as part of the payload to connection_init", - "include_in_url": "Sisällytä URL -osoitteeseen", - "inherited_from": "Inherited from {auth} from Parent Collection {collection} ", - "learn": "Opi kuinka", + "generate_token": "Luo token", + "refresh_token": "Päivitä token", + "graphql_headers": "Valtuutusotsikot lähetetään osana connection_init-viestiä", + "include_in_url": "Sisällytä URL-osoitteeseen", + "inherited_from": "Peritty {auth} yläkokoelmasta {collection} ", + "learn": "Opi miten", "oauth": { - "redirect_auth_server_returned_error": "Auth Server returned an error state", - "redirect_auth_token_request_failed": "Request to get the auth token failed", - "redirect_auth_token_request_invalid_response": "Invalid Response from the Token Endpoint when requesting for an auth token", - "redirect_invalid_state": "Invalid State value present in the redirect", - "redirect_no_auth_code": "No Authorization Code present in the redirect", - "redirect_no_client_id": "No Client ID defined", - "redirect_no_client_secret": "No Client Secret Defined", - "redirect_no_code_verifier": "No Code Verifier Defined", - "redirect_no_token_endpoint": "No Token Endpoint Defined", - "something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect", - "something_went_wrong_on_token_generation": "Something went wrong on token generation", - "token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed", - "grant_type": "Grant Type", - "grant_type_auth_code": "Authorization Code", - "token_fetched_successfully": "Token fetched successfully", - "token_fetch_failed": "Failed to fetch token", - "validation_failed": "Validation Failed, please check the form fields", - "label_authorization_endpoint": "Authorization Endpoint", + "redirect_auth_server_returned_error": "Todennuspalvelin palautti virhetilan", + "redirect_auth_token_request_failed": "Todennustokenin pyyntö epäonnistui", + "redirect_auth_token_request_invalid_response": "Virheellinen vastaus token-päätepisteeltä todennustokenia pyydettäessä", + "redirect_invalid_state": "Virheellinen State-arvo uudelleenohjauksessa", + "redirect_no_auth_code": "Valtuutuskoodia ei löydy uudelleenohjauksesta", + "redirect_no_client_id": "Client ID:tä ei ole määritetty", + "redirect_no_client_secret": "Client Secretiä ei ole määritetty", + "redirect_no_code_verifier": "Code Verifieriä ei ole määritetty", + "redirect_no_token_endpoint": "Token-päätepistettä ei ole määritetty", + "something_went_wrong_on_oauth_redirect": "OAuth-uudelleenohjauksessa tapahtui virhe", + "something_went_wrong_on_token_generation": "Tokenin luonnissa tapahtui virhe", + "token_generation_oidc_discovery_failed": "Tokenin luonti epäonnistui: OpenID Connect Discovery epäonnistui", + "grant_type": "Myöntämistyyppi", + "grant_type_auth_code": "Valtuutuskoodi", + "token_fetched_successfully": "Token haettu onnistuneesti", + "token_fetch_failed": "Tokenin haku epäonnistui", + "validation_failed": "Vahvistus epäonnistui, tarkista lomakkeen kentät", + "no_refresh_token_present": "Refresh tokenia ei löydy. Suorita tokenin luontiprosessi uudelleen", + "refresh_token_request_failed": "Refresh token -pyyntö epäonnistui", + "token_refreshed_successfully": "Token päivitetty onnistuneesti", + "label_authorization_endpoint": "Valtuutuspäätepiste", "label_client_id": "Client ID", "label_client_secret": "Client Secret", "label_code_challenge": "Code Challenge", - "label_code_challenge_method": "Code Challenge Method", + "label_code_challenge_method": "Code Challenge -menetelmä", "label_code_verifier": "Code Verifier", - "label_scopes": "Scopes", - "label_token_endpoint": "Token Endpoint", - "label_use_pkce": "Use PKCE", + "label_scopes": "Käyttöoikeusalueet", + "label_token_endpoint": "Token-päätepiste", + "label_use_pkce": "Käytä PKCE:tä", "label_implicit": "Implicit", - "label_password": "Password", - "label_username": "Username", - "label_auth_code": "Authorization Code", - "label_client_credentials": "Client Credentials" - }, - "pass_key_by": "Pass by", - "pass_by_query_params_label": "Query Parameters", - "pass_by_headers_label": "Headers", + "label_password": "Salasana", + "label_username": "Käyttäjänimi", + "label_auth_code": "Valtuutuskoodi", + "label_client_credentials": "Client Credentials", + "label_send_as": "Asiakastodennustapa", + "label_send_in_body": "Lähetä tunnistetiedot rungossa", + "label_send_as_basic_auth": "Lähetä tunnistetiedot Basic Auth -muodossa", + "enter_value": "Syötä arvo", + "auth_request": "Todennuspyyntö", + "token_request": "Token-pyyntö", + "refresh_request": "Päivityspyyntö", + "send_in": "Lähetä kohteessa" + }, + "pass_key_by": "Välitä", + "pass_by_query_params_label": "Kyselyparametrit", + "pass_by_headers_label": "Otsikot", "password": "Salasana", - "save_to_inherit": "Please save this request in any collection to inherit the authorization", + "save_to_inherit": "Tallenna tämä pyyntö johonkin kokoelmaan periäksesi valtuutuksen", "token": "Token", - "type": "Valtuustyyppi", - "username": "Käyttäjätunnus" + "access_token": "Access Token", + "client_token": "Client Token", + "client_secret": "Client Secret", + "timestamp": "Aikaleima", + "host": "Isäntä", + "type": "Valtuutustyyppi", + "username": "Käyttäjänimi", + "advance_config": "Lisäasetukset", + "advance_config_description": "Hoppscotch asettaa oletusarvot automaattisesti tietyille kentille, jos arvoa ei ole erikseen annettu", + "algorithm": "Algoritmi", + "payload": "Sisältö", + "secret": "Salaisuus", + "aws_signature": { + "access_key": "Pääsyavain", + "secret_key": "Salainen avain", + "service_name": "Palvelun nimi", + "aws_region": "AWS-alue", + "service_token": "Palvelutoken" + }, + "digest": { + "realm": "Realm", + "nonce": "Nonce", + "algorithm": "Algoritmi", + "qop": "qop", + "nonce_count": "Nonce-laskuri", + "client_nonce": "Client Nonce", + "opaque": "Opaque", + "disable_retry": "Älä yritä pyyntöä uudelleen" + }, + "akamai": { + "headers_to_sign": "Allekirjoitettavat otsikot", + "max_body_size": "Rungon enimmäiskoko" + }, + "hawk": { + "id": "HAWK Auth ID", + "key": "HAWK Auth Key", + "ext": "ext", + "app": "app", + "dlg": "dlg", + "include": "Sisällytä Payload Hash" + }, + "jwt": { + "params_name": "Parametrin nimi", + "param_name": "Parametrin nimi", + "header_prefix": "Otsikon etuliite", + "placeholder_request_header": "Pyyntöotsikon etuliite", + "placeholder_request_param": "Pyyntöparametrin nimi", + "secret_base64_encoded": "Salaisuus Base64-koodattu", + "headers": "JWT-otsikot", + "private_key": "Yksityinen avain", + "placeholder_headers": "JWT-otsikot" + }, + "ntlm": { + "domain": "Verkkotunnus", + "workstation": "Työasema", + "disable_retrying_request": "Älä yritä pyyntöä uudelleen" + }, + "asap": { + "issuer": "Myöntäjä", + "audience": "Yleisö", + "expires_in": "Vanhenee", + "key_id": "Avaimen tunniste", + "optional_config": "Valinnaiset asetukset", + "subject": "Aihe", + "additional_claims": "Lisävaatimukset" + } }, "collection": { + "title": "Kokoelma", + "run": "Suorita kokoelma", "created": "Kokoelma luotu", - "different_parent": "Cannot reorder collection with different parent", + "different_parent": "Kokoelmaa ei voi järjestää uudelleen eri yläkansion kanssa", "edit": "Muokkaa kokoelmaa", - "import_or_create": "Import or create a collection", - "import_collection": "Import Collection", - "invalid_name": "Anna kokoelmalle kelvollinen nimi", - "invalid_root_move": "Collection already in the root", - "moved": "Moved Successfully", + "import_or_create": "Tuo tai luo kokoelma", + "import_collection": "Tuo kokoelma", + "invalid_name": "Anna kokoelmalle nimi", + "invalid_root_move": "Kokoelma on jo juuritasolla", + "moved": "Siirretty onnistuneesti", "my_collections": "Omat kokoelmat", "name": "Uusi kokoelmani", - "name_length_insufficient": "Collection name should be at least 3 characters long", + "name_length_insufficient": "Kokoelman nimen on oltava vähintään 3 merkkiä pitkä", "new": "Uusi kokoelma", - "order_changed": "Collection Order Updated", - "properties": "Collection Properties", - "properties_updated": "Collection Properties Updated", + "order_changed": "Kokoelman järjestys päivitetty", + "properties": "Kokoelman ominaisuudet", + "properties_updated": "Kokoelman ominaisuudet päivitetty", "renamed": "Kokoelma nimetty uudelleen", - "request_in_use": "Request in use", + "request_in_use": "Pyyntö on käytössä", "save_as": "Tallenna nimellä", - "save_to_collection": "Save to Collection", + "save_to_collection": "Tallenna kokoelmaan", "select": "Valitse kokoelma", "select_location": "Valitse sijainti", - "details": "Details", - "select_team": "Valitse joukkue", - "team_collections": "Joukkuekokoelmat" + "sorted": "Kokoelma järjestetty", + "details": "Tiedot", + "duplicated": "Kokoelma kopioitu" }, "confirm": { - "close_unsaved_tab": "Are you sure you want to close this tab?", - "close_unsaved_tabs": "Are you sure you want to close all tabs? {count} unsaved tabs will be lost.", - "exit_team": "Are you sure you want to leave this team?", + "close_unsaved_tab": "Haluatko varmasti sulkea tämän välilehden?", + "close_unsaved_tabs": "Haluatko varmasti sulkea kaikki välilehdet? {count} tallentamatonta välilehteä menetetään.", + "delete_all_activity_logs": "Haluatko varmasti poistaa kaikki toimintolokit?", + "exit_team": "Haluatko varmasti poistua tästä työtilasta?", "logout": "Haluatko varmasti kirjautua ulos?", "remove_collection": "Haluatko varmasti poistaa tämän kokoelman pysyvästi?", "remove_environment": "Haluatko varmasti poistaa tämän ympäristön pysyvästi?", "remove_folder": "Haluatko varmasti poistaa tämän kansion pysyvästi?", - "remove_history": "Haluatko varmasti poistaa koko historian pysyvästi?", + "remove_history": "Haluatko varmasti poistaa kaiken historian pysyvästi?", "remove_request": "Haluatko varmasti poistaa tämän pyynnön pysyvästi?", - "remove_shared_request": "Are you sure you want to permanently delete this shared request?", - "remove_team": "Haluatko varmasti poistaa tämän ryhmän?", - "remove_telemetry": "Haluatko varmasti poistaa telemetrian käytöstä?", - "request_change": "Are you sure you want to discard current request, unsaved changes will be lost.", - "save_unsaved_tab": "Do you want to save changes made in this tab?", - "sync": "Haluatko varmasti synkronoida tämän työtilan?", - "delete_access_token": "Are you sure you want to delete the access token {tokenLabel}?" + "remove_response": "Haluatko varmasti poistaa tämän vastauksen pysyvästi?", + "remove_shared_request": "Haluatko varmasti poistaa tämän jaetun pyynnön pysyvästi?", + "remove_team": "Haluatko varmasti poistaa tämän työtilan?", + "remove_telemetry": "Haluatko varmasti poistua telemetriasta?", + "request_change": "Haluatko varmasti hylätä nykyisen pyynnön? Tallentamattomat muutokset menetetään.", + "save_unsaved_tab": "Haluatko tallentaa tähän välilehteen tehdyt muutokset?", + "sync": "Haluatko palauttaa työtilasi pilvestä? Tämä hylkää paikallisen edistymisesi.", + "delete_access_token": "Haluatko varmasti poistaa käyttöoikeustokenin {tokenLabel}?", + "delete_mock_server": "Haluatko varmasti poistaa tämän mock-palvelimen?" }, "context_menu": { - "add_parameters": "Add to parameters", - "open_request_in_new_tab": "Open request in new tab", - "set_environment_variable": "Set as variable" + "add_parameters": "Lisää parametreihin", + "open_request_in_new_tab": "Avaa pyyntö uudessa välilehdessä", + "set_environment_variable": "Aseta muuttujaksi", + "encode_uri_component": "Koodaa URL-komponentti", + "decode_uri_component": "Pura URL-komponentti" }, "cookies": { "modal": { - "cookie_expires": "Expires", - "cookie_name": "Name", - "cookie_path": "Path", - "cookie_string": "Cookie string", - "cookie_value": "Value", - "empty_domain": "Domain is empty", - "empty_domains": "Domain list is empty", - "enter_cookie_string": "Enter cookie string", - "interceptor_no_support": "Your currently selected interceptor does not support cookies. Select a different Interceptor and try again.", - "managed_tab": "Managed", - "new_domain_name": "New domain name", - "no_cookies_in_domain": "No cookies set for this domain", - "raw_tab": "Raw", - "set": "Set a cookie" + "cookie_expires": "Vanhenee", + "cookie_name": "Nimi", + "cookie_path": "Polku", + "cookie_string": "Evästejono", + "cookie_value": "Arvo", + "empty_domain": "Verkkotunnus on tyhjä", + "empty_domains": "Verkkotunnuslista on tyhjä", + "enter_cookie_string": "Syötä evästejono", + "interceptor_no_support": "Valittu sieppaaja ei tue evästeitä. Valitse toinen sieppaaja ja yritä uudelleen.", + "managed_tab": "Hallitut", + "new_domain_name": "Uusi verkkotunnus", + "no_cookies_in_domain": "Tälle verkkotunnukselle ei ole asetettu evästeitä", + "raw_tab": "Raaka", + "set": "Aseta eväste" } }, "count": { + "currentValue": "Nykyinen arvo {count}", + "description": "Kuvaus {count}", "header": "Otsikko {count}", + "initialValue": "Alkuarvo {count}", + "key": "Avain {count}", "message": "Viesti {count}", "parameter": "Parametri {count}", "protocol": "Protokolla {count}", @@ -248,859 +415,1964 @@ "variable": "Muuttuja {count}" }, "documentation": { + "add_description": "Lisää kuvaus tälle kokoelmalle tähän...", + "add_description_placeholder": "Lisää kuvaus tähän...", + "add_request_description": "Lisää kuvaus pyynnölle tähän...", + "auth": { + "access_key": "Pääsyavain", + "access_token": "Access Token", + "add_to": "Lisää kohteeseen", + "akamai_edgegrid": "Akamai EdgeGrid", + "algorithm": "Algoritmi", + "api_key": "API-avain", + "app_id": "Sovellustunnus", + "auth_id": "Todennustunnus", + "auth_key": "Todennusavain", + "auth_url": "Todennusosoite", + "aws_signature": "AWS Signature", + "basic_auth": "Basic Auth", + "bearer_token": "Bearer Token", + "client_id": "Client ID", + "client_nonce": "Client Nonce", + "client_secret": "Client Secret", + "client_token": "Client Token", + "delegation": "Delegointi", + "digest_auth": "Digest Auth", + "extra_data": "Lisätiedot", + "grant_type": "Myöntämistyyppi", + "hawk_auth": "HAWK Auth", + "headers_to_sign": "Allekirjoitettavat otsikot", + "host": "Isäntä", + "include_payload_hash": "Sisällytä Payload Hash", + "jwt_auth": "JWT Auth", + "max_body_size": "Rungon enimmäiskoko", + "no_auth": "Ei todennusta", + "nonce": "Nonce", + "oauth_2": "OAuth 2.0", + "opaque": "Opaque", + "password": "Salasana", + "payload": "Sisältö", + "qop": "QOP", + "realm": "Realm", + "region": "Alue", + "scope": "Käyttöoikeusalue", + "secret_key": "Salainen avain", + "service_name": "Palvelun nimi", + "timestamp": "Aikaleima", + "title": "Todennus", + "token_url": "Token URL", + "user": "Käyttäjä", + "username": "Käyttäjänimi" + }, + "body": { + "content_type": "Sisältötyyppi", + "no_body": "Runkoa ei ole määritetty", + "title": "Runko" + }, + "copied_to_clipboard": "Kopioitu leikepöydälle!", + "curl": { + "click_to_load": "Napsauta ladataksesi cURL-komennon", + "copied": "cURL-komento kopioitu leikepöydälle!", + "copy_to_clipboard": "Kopioi leikepöydälle", + "generating": "Luodaan cURL-komentoa...", + "load": "Lataa cURL", + "title": "cURL" + }, + "description": "Kuvaus", + "error_rendering_markdown": "Virhe markdown-renderöinnissä:", + "fetching_documentation": "Haetaan dokumentaatiota...", "generate": "Luo dokumentaatio", - "generate_message": "Tuo mikä tahansa Hoppscotch-kokoelma ja luo sovellusliittymän dokumentaatio liikkeellä ollessasi." + "generate_message": "Tuo mikä tahansa Hoppscotch-kokoelma luodaksesi API-dokumentaation lennossa.", + "headers": { + "no_headers": "Otsikoita ei ole määritetty", + "title": "Otsikot" + }, + "hide_all_documentation": "Piilota kaikki dokumentaatio", + "inherited_from": "Peritty kohteesta {name}", + "inherited_with_type": "Peritty {type} kohteesta {name}", + "key": "Avain", + "loading": "Ladataan...", + "loading_collection_data": "Ladataan kokoelman tietoja...", + "no": "Ei", + "no_collection_data": "Kokoelman tietoja ei ole saatavilla", + "no_documentation_found": "Kansioille tai pyynnöille ei löytynyt dokumentaatiota", + "no_request_data": "Pyynnön tietoja ei ole saatavilla", + "no_requests_or_folders": "Ei pyyntöjä tai kansioita", + "not_set": "Ei asetettu", + "open_request_in_new_tab": "Avaa pyyntö uudessa välilehdessä", + "parameters": { + "no_params": "Parametreja ei ole määritetty", + "title": "Parametrit" + }, + "percent_complete": "% valmis", + "processing_documentation": "Käsitellään dokumentaatiota", + "publish": { + "already_published": "Tämä kokoelma on jo julkaistu", + "auto_sync": "Automaattinen synkronointi kokoelman kanssa", + "auto_sync_description": "Päivitä julkaistu dokumentaatio automaattisesti, kun kokoelma muuttuu", + "button": "Julkaise", + "copy_url": "Kopioi URL", + "delete": "Poista dokumentaatio", + "unpublish_doc": "Haluatko varmasti poistaa dokumentaation julkaisun?", + "delete_success": "Julkaistu dokumentaatio poistettu onnistuneesti", + "doc_title": "Otsikko", + "doc_version": "Versio", + "edit_published_doc": "Muokkaa julkaistua dokumentaatiota", + "last_updated": "Viimeksi päivitetty", + "metadata": "Metatiedot (JSON)", + "open_published_doc": "Avaa julkaistu dokumentaatio uudessa välilehdessä", + "publish_error": "Dokumentaation julkaisu epäonnistui", + "publish_success": "Dokumentaatio julkaistu onnistuneesti!", + "published": "Julkaistu", + "published_url": "Julkaistu URL", + "title": "Julkaise dokumentaatio", + "update_button": "Päivitä", + "update_error": "Dokumentaation päivitys epäonnistui", + "update_published_docs": "Päivitä julkaistu dokumentaatio", + "update_success": "Dokumentaatio päivitetty onnistuneesti!", + "unpublish": "Poista julkaisu", + "update_title": "Päivitä julkaistu dokumentaatio", + "url_copied": "URL kopioitu leikepöydälle!", + "view_published": "Näytä julkaistu dokumentaatio", + "view_title": "Julkaistun dokumentaation tilannekuva", + "versions": "Versiot", + "create_new_version": "Luo uusi versio", + "invalid_version": "Versio saa sisältää vain kirjaimia, numeroita, pisteitä ja väliviivoja", + "live": "Live", + "snapshot": "Tilannekuva", + "version_immutable": "Julkaistut versiot ovat vain luku -tilannekuvia", + "view_snapshot": "Näytä tilannekuva", + "current_version": "NYKYINEN", + "not_found": "Julkaistua dokumentaatiota ei löytynyt", + "no_doc_id": "Dokumenttitunnusta ei annettu", + "version_label": "v{version}", + "unpublish_version": "Poista tämän version julkaisu", + "loading_snapshot": "Ladataan tilannekuvaa...", + "retry_snapshot": "Yritä uudelleen", + "sensitive_data_warning": "Varmista, ettei julkaistussa dokumentaatiossa paljasteta arkaluonteisia tietoja.", + "snapshot_preview": "Tilannekuvan esikatselu", + "snapshot_load_error": "Tilannekuvan esikatselun lataus epäonnistui", + "snapshot_empty": "Tässä tilannekuvassa ei ole pyyntöjä tai kansioita", + "snapshot_item_count": "{count} kohdetta", + "auto_sync_live_notice": "Tämä versio synkronoidaan automaattisesti live-kokoelman kanssa", + "snapshot_promote_warning": "Automaattisen synkronoinnin käyttöönotto korvaa tämän jäädytetyn tilannekuvan live-kokoelmapuulla. Tätä ei voi kumota.", + "live_freeze_notice": "Automaattinen synkronointi poistetaan käytöstä ja tämä versio jäädytetään kokoelman nykyiseen tilaan.", + "untitled_project": "Nimetön projekti", + "environment": "Ympäristö", + "no_environment": "Ei ympäristöä", + "environment_description": "Liitä ympäristö muuttujien ratkaisemiseksi julkaistussa dokumentaatiossa" + }, + "request_opened_in_new_tab": "Pyyntö avattu uudessa välilehdessä!", + "response": { + "body": "Vastauksen runko", + "copy": "Kopioi vastaus", + "example_copied": "Vastausesimerkki kopioitu leikepöydälle!", + "example_copy_failed": "Vastausesimerkin kopiointi epäonnistui", + "headers": "Vastauksen otsikot", + "no_examples": "Ei vastausesimerkkejä saatavilla", + "title": "Vastausesimerkit" + }, + "save_error": "Virhe dokumentaation tallennuksessa", + "save_success": "Dokumentaatio tallennettu onnistuneesti", + "saved_items_status": "Tallennettu {success} kohdetta. {failure} kohteen tallennus epäonnistui.", + "show_all_documentation": "Näytä kaikki dokumentaatio", + "source": "Lähde", + "title": "Dokumentaatio", + "unsaved_changes": "Sinulla on {count} tallentamatonta muutosta. Tallenna ennen sulkemista.", + "untitled_collection": "Nimetön kokoelma", + "untitled_request": "Nimetön pyyntö", + "value": "Arvo", + "variables": { + "no_vars": "Muuttujia ei ole määritetty", + "title": "Muuttujat" + }, + "yes": "Kyllä" }, "empty": { + "activity_logs": "Toimintolokeja ei löytynyt", "authorization": "Tämä pyyntö ei käytä valtuutusta", - "body": "Tällä pyynnöllä ei ole sisältöä", + "body": "Tällä pyynnöllä ei ole runkoa", "collection": "Kokoelma on tyhjä", "collections": "Kokoelmat ovat tyhjiä", - "documentation": "Connect to a GraphQL endpoint to view documentation", - "endpoint": "Endpoint cannot be empty", + "documentation": "Yhdistä GraphQL-päätepisteeseen nähdäksesi dokumentaation", + "empty_schema": "Skeemaa ei löytynyt", + "endpoint": "Päätepiste ei voi olla tyhjä", "environments": "Ympäristöt ovat tyhjiä", + "collection_variables": "Kokoelman muuttujat ovat tyhjiä", "folder": "Kansio on tyhjä", - "headers": "Tässä pyynnössä ei ole otsikoita", + "headers": "Tällä pyynnöllä ei ole otsikoita", "history": "Historia on tyhjä", - "invites": "Invite list is empty", - "members": "Joukkue on tyhjä", - "parameters": "Tässä pyynnössä ei ole parametreja", - "pending_invites": "There are no pending invites for this team", - "profile": "Login to view your profile", + "invites": "Kutsulista on tyhjä", + "members": "Työtila on tyhjä", + "parameters": "Tällä pyynnöllä ei ole parametreja", + "pending_invites": "Tässä työtilassa ei ole odottavia kutsuja", + "profile": "Kirjaudu sisään nähdäksesi profiilisi", "protocols": "Protokollat ovat tyhjiä", - "request_variables": "This request does not have any request variables", - "schema": "Muodosta yhteys GraphQL -päätepisteeseen", - "secret_environments": "Secrets are not synced to Hoppscotch", - "shared_requests": "Shared requests are empty", - "shared_requests_logout": "Login to view your shared requests or create a new one", - "subscription": "Subscriptions are empty", - "team_name": "Joukkueen nimi tyhjä", - "teams": "Joukkueet ovat tyhjiä", - "tests": "Tätä pyyntöä ei ole testattu", - "access_tokens": "Access tokens are empty", - "shortcodes": "Shortcodes are empty" + "request_variables": "Tällä pyynnöllä ei ole pyyntömuuttujia", + "schema": "Yhdistä GraphQL-päätepisteeseen nähdäksesi skeeman", + "search_environment": "Vastaavaa ympäristöä ei löytynyt haulle", + "secret_environments": "Salaisuuksia ei synkronoida Hoppscotchiin", + "shared_requests": "Jaettuja pyyntöjä ei ole", + "shared_requests_logout": "Kirjaudu sisään nähdäksesi jaetut pyyntösi tai luodaksesi uuden", + "subscription": "Tilaukset ovat tyhjiä", + "team_name": "Työtilan nimi on tyhjä", + "teams": "Et kuulu mihinkään työtilaan", + "tests": "Tällä pyynnöllä ei ole testejä", + "access_tokens": "Käyttöoikeustokenit ovat tyhjiä", + "response": "Vastausta ei saatu", + "mock_servers": "Mock-palvelimia ei löytynyt" }, "environment": { - "add_to_global": "Add to Global", - "added": "Environment addition", + "heading": "Ympäristö", + "add_to_global": "Lisää globaaliin", + "added": "Ympäristömuuttuja lisätty", "create_new": "Luo uusi ympäristö", - "created": "Environment created", - "deleted": "Environment deletion", - "duplicated": "Environment duplicated", + "created": "Ympäristö luotu", + "current_value": "Nykyinen arvo", + "deleted": "Ympäristömuuttuja poistettu", + "duplicated": "Ympäristö kopioitu", "edit": "Muokkaa ympäristöä", - "empty_variables": "No variables", - "global": "Global", - "global_variables": "Global variables", - "import_or_create": "Import or create a environment", - "invalid_name": "Anna ympäristölle kelvollinen nimi", - "list": "Environment variables", - "my_environments": "My Environments", - "name": "Name", - "nested_overflow": "nested environment variables are limited to 10 levels", + "empty_variables": "Ei muuttujia", + "global": "Globaali", + "global_variables": "Globaalit muuttujat", + "import_or_create": "Tuo tai luo ympäristö", + "initial_value": "Alkuarvo", + "invalid_name": "Anna ympäristölle nimi", + "list": "Ympäristömuuttujat", + "my_environments": "Omat ympäristöt", + "name": "Nimi", + "nested_overflow": "Sisäkkäiset ympäristömuuttujat on rajoitettu 10 tasoon", "new": "Uusi ympäristö", - "no_active_environment": "No active environment", + "no_active_environment": "Ei aktiivista ympäristöä", "no_environment": "Ei ympäristöä", - "no_environment_description": "No environments were selected. Choose what to do with the following variables.", - "quick_peek": "Environment Quick Peek", - "replace_with_variable": "Replace with variable", - "scope": "Scope", - "secrets": "Secrets", - "secret_value": "Secret value", + "no_environment_description": "Ympäristöjä ei ole valittu. Valitse mitä tehdä seuraavien muuttujien kanssa.", + "quick_peek": "Ympäristön pikatarkastelu", + "replace_all_current_with_initial": "Korvaa kaikki nykyiset alkuarvoilla", + "replace_all_initial_with_current": "Korvaa kaikki alkuarvot nykyisillä", + "replace_current_with_initial": "Korvaa alkuarvolla", + "replace_initial_with_current": "Korvaa nykyisellä", + "replace_with_variable": "Korvaa muuttujalla", + "scope": "Käyttöalue", + "secrets": "Salaisuudet", + "secret_value": "Salainen arvo", "select": "Valitse ympäristö", - "set": "Set environment", - "set_as_environment": "Set as environment", - "team_environments": "Team Environments", + "set": "Aseta ympäristö", + "set_as_environment": "Aseta ympäristöksi", + "short_name": "Ympäristön nimessä on oltava vähintään 1 merkki", + "team_environments": "Työtilan ympäristöt", "title": "Ympäristöt", - "updated": "Environment updation", - "value": "Value", - "variable": "Variable", - "variables": "Variables", - "variable_list": "Muuttujien luettelo", - "properties": "Environment Properties", - "details": "Details" + "updated": "Ympäristö päivitetty", + "value": "Arvo", + "variable": "Muuttuja", + "variables": "Muuttujat", + "variable_list": "Muuttujalista", + "properties": "Ympäristön ominaisuudet", + "details": "Tiedot" }, "error": { - "authproviders_load_error": "Unable to load auth providers", - "browser_support_sse": "Tämä selain ei näytä tukevan palvelimen lähettämiä tapahtumia.", - "check_console_details": "Katso lisätietoja konsolilokista.", - "check_how_to_add_origin": "Check how you can add an origin", - "curl_invalid_format": "cURL ei ole alustettu oikein", - "danger_zone": "Danger zone", - "delete_account": "Your account is currently an owner in these teams:", - "delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.", - "empty_email_address": "Email Address cannot be empty", - "empty_profile_name": "Profile name cannot be empty", + "network": { + "heading": "Verkkovirhe", + "description": "Verkkoyhteys epäonnistui. {message}: {cause}" + }, + "timeout": { + "heading": "Aikakatkaisuvirhe", + "description": "Pyyntö aikakatkaistiin vaiheessa {phase}. {message}" + }, + "certificate": { + "heading": "Sertifikaattivirhe", + "description": "Virheellinen sertifikaatti. {message}: {cause}" + }, + "auth": { + "heading": "Todennusvirhe", + "description": "Pääsy evätty. {message}: {cause}" + }, + "proxy": { + "heading": "Välityspalvelinvirhe", + "description": "Välityspalvelinyhteys epäonnistui. {message}: {cause}" + }, + "parse": { + "heading": "Jäsennysvirhe", + "description": "Vastauksen jäsentäminen epäonnistui. {message}: {cause}" + }, + "version": { + "heading": "Versiovirhe", + "description": "Yhteensopimattomat versiot. {message}: {cause}" + }, + "abort": { + "heading": "Pyyntö keskeytetty", + "description": "Toiminto peruutettu. {message}: {cause}" + }, + "unknown": { + "heading": "Tuntematon virhe", + "description": "Tapahtui tuntematon virhe.", + "cause": "Tuntematon syy" + }, + "extension": { + "heading": "Laajennusvirhe", + "description": "Pyynnön suorittaminen laajennuksella epäonnistui" + }, + "authproviders_load_error": "Todennuspalveluiden lataaminen epäonnistui", + "browser_support_sse": "Tämä selain ei näytä tukevan Server Sent Events -ominaisuutta.", + "check_console_details": "Tarkista konsolin loki lisätiedoista.", + "check_how_to_add_origin": "Katso miten voit lisätä lähteen", + "curl_invalid_format": "cURL-komento ei ole oikeassa muodossa", + "danger_zone": "Vaaravyöhyke", + "delete_account": "Tilisi on tällä hetkellä ainoa omistaja näissä työtiloissa:", + "delete_account_description": "Sinun on joko poistettava itsesi, siirrettävä omistajuus tai poistettava nämä työtilat ennen kuin voit poistaa tilisi.", + "delete_activity_log": "Toimintolokin poistaminen epäonnistui", + "delete_all_activity_logs": "Kaikkien toimintolokien poistaminen epäonnistui", + "email_already_exists": "Tämä sähköposti on jo käytössä toisella tilillä. Aseta toinen sähköpostiosoite.", + "empty_email_address": "Sähköpostiosoite ei voi olla tyhjä", + "empty_profile_name": "Profiilin nimi ei voi olla tyhjä", "empty_req_name": "Tyhjä pyynnön nimi", - "f12_details": "(F12 lisätietoja)", - "gql_prettify_invalid_query": "Virheellistä kyselyä ei voitu määrittää, ratkaista kyselyn syntaksivirheet ja yrittää uudelleen", - "incomplete_config_urls": "Incomplete configuration URLs", - "incorrect_email": "Incorrect email", - "invalid_link": "Invalid link", - "invalid_link_description": "The link you clicked is invalid or expired.", - "invalid_embed_link": "The embed does not exist or is invalid.", - "json_parsing_failed": "Invalid JSON", - "json_prettify_invalid_body": "Virheellistä runkoa ei voitu määrittää, ratkaista json -syntaksivirheitä ja yrittää uudelleen", - "network_error": "There seems to be a network error. Please try again.", + "fetch_activity_logs": "Toimintolokien hakeminen epäonnistui", + "f12_details": "(F12 lisätiedot)", + "gql_prettify_invalid_query": "Virheellistä kyselyä ei voitu siistiä, korjaa kyselysyntaksivirheet ja yritä uudelleen", + "incomplete_config_urls": "Puutteelliset asetusliittymien URL-osoitteet", + "incorrect_email": "Virheellinen sähköposti", + "invalid_file_type": "Virheellinen tiedostotyyppi tiedostolle `{filename}`.", + "invalid_link": "Virheellinen linkki", + "invalid_link_description": "Linkki, jota napsautit, on virheellinen tai vanhentunut.", + "invalid_embed_link": "Upotusta ei ole olemassa tai se on virheellinen.", + "json_parsing_failed": "Virheellinen JSON", + "json_prettify_invalid_body": "Virheellistä runkoa ei voitu siistiä, korjaa JSON-syntaksivirheet ja yritä uudelleen", + "network_error": "Verkkoyhteydessä näyttää olevan ongelma. Yritä uudelleen.", "network_fail": "Pyyntöä ei voitu lähettää", - "no_collections_to_export": "No collections to export. Please create a collection to get started.", + "no_collections_to_export": "Ei kokoelmia vietäväksi. Luo kokoelma aloittaaksesi.", "no_duration": "Ei kestoa", - "no_environments_to_export": "No environments to export. Please create an environment to get started.", - "no_results_found": "No matches found", - "page_not_found": "This page could not be found", - "please_install_extension": "Please install the extension and add origin to the extension.", - "proxy_error": "Proxy error", - "same_email_address": "Updated email address is same as the current email address", - "same_profile_name": "Updated profile name is same as the current profile name", - "script_fail": "Ennakkopyyntöskriptiä ei voitu suorittaa", - "something_went_wrong": "Jotain meni pieleen", - "post_request_script_fail": "Could not execute post-request script", - "reading_files": "Error while reading one or more files.", - "fetching_access_tokens_list": "Something went wrong while fetching the list of tokens", - "generate_access_token": "Something went wrong while generating the access token", - "delete_access_token": "Something went wrong while deleting the access token" + "no_environments_to_export": "Ei ympäristöjä vietäväksi. Luo ympäristö aloittaaksesi.", + "no_results_found": "Osumia ei löytynyt", + "page_not_found": "Tätä sivua ei löytynyt", + "please_install_extension": "Asenna laajennus ja lisää lähde laajennukseen.", + "proxy_error": "Välityspalvelinvirhe", + "same_email_address": "Päivitetty sähköpostiosoite on sama kuin nykyinen", + "same_profile_name": "Päivitetty profiilin nimi on sama kuin nykyinen", + "script_fail": "Esipyyntöskriptiä ei voitu suorittaa", + "something_went_wrong": "Jokin meni pieleen", + "subscription_error": "Aiheen tilaaminen epäonnistui: {error}", + "post_request_script_fail": "Jälkipyyntöskriptiä ei voitu suorittaa", + "reading_files": "Virhe luettaessa yhtä tai useampaa tiedostoa.", + "fetching_access_tokens_list": "Jokin meni pieleen haettaessa tokenilistausta", + "generate_access_token": "Jokin meni pieleen luotaessa käyttöoikeustokenia", + "delete_access_token": "Jokin meni pieleen poistettaessa käyttöoikeustokenia", + "extension_not_found": "Laajennusta ei löytynyt", + "invalid_request": "Virheelliset pyyntötiedot" }, "export": { - "as_json": "Vie JSON -muodossa", - "create_secret_gist": "Luo salainen ydin", - "create_secret_gist_tooltip_text": "Export as secret Gist", - "failed": "Something went wrong while exporting", - "secret_gist_success": "Successfully exported as secret Gist", - "require_github": "Kirjaudu sisään GitHubilla luodaksesi salaisen sisällön", - "title": "Export", - "success": "Successfully exported", - "gist_created": "Gist luotu" + "as_json": "Vie JSON-muodossa", + "as_openapi": "Vie OpenAPI-muodossa", + "as_yaml": "Vie YAML-muodossa", + "choose_format": "Valitse vientimuoto", + "collection": "Vie kokoelma", + "collections": "Vie kokoelmat", + "format_hoppscotch": "Vie Hoppscotch JSON -muodossa", + "format_openapi_json": "Vie OpenAPI 3.1 (JSON) -muodossa", + "format_openapi_yaml": "Vie OpenAPI 3.1 (YAML) -muodossa", + "openapi_lossy_summary": "OpenAPI-vienti jättää pois skriptit, todennustiedot, inaktiiviset kohteet, tupla-polut ja tuplavastauskoodit.", + "create_secret_gist": "Luo salainen Gist", + "create_secret_gist_tooltip_text": "Vie salaisena Gistinä", + "failed": "Jokin meni pieleen viennissä", + "secret_gist_success": "Viety onnistuneesti salaisena Gistinä", + "require_github": "Kirjaudu GitHubilla luodaksesi salaisen gistin", + "title": "Vienti", + "success": "Viety onnistuneesti" + }, + "file_upload": { + "choose_file": "Valitse tiedosto", + "max_size_format": "Enintään 5 Mt. Tukee JPEG, PNG, GIF, WebP", + "profile_photo_updated": "Profiilikuva päivitetty onnistuneesti", + "profile_photo_removed": "Profiilikuva poistettu onnistuneesti", + "org_logo_updated": "Organisaation logo päivitetty onnistuneesti", + "error_size_limit": "Tiedostokoon on oltava alle 5 Mt", + "error_invalid_format": "Tiedoston on oltava kuva (JPEG, PNG, GIF tai WebP)", + "error_invalid_upload_type": "Virheellinen lataustyyppi", + "error_invalid_org_id": "Virheellinen organisaatiotunnuksen muoto", + "error_upload_failed": "Lataus epäonnistui. Yritä uudelleen", + "error_network_failed": "Verkkovirhe. Tarkista yhteytesi", + "error_timeout": "Lataus aikakatkaistiin 30 sekunnin jälkeen. Yritä uudelleen", + "error_missing_backend_url": "Taustapalvelun URL-osoitetta ei ole määritetty. Aseta VITE_BACKEND_API_URL ympäristömuuttuja ympäristöasetuksissasi", + "error_invalid_backend_url": "Virheellinen taustapalvelun URL-osoitteen määritys" + }, + "filename": { + "cookie_key_value_pairs": "Eväste", + "codegen": "{request_name} - koodi", + "graphql_response": "GraphQL-vastaus", + "lens": "{request_name} - vastaus", + "realtime_response": "Reaaliaikavastaus", + "response_interface": "Vastausrajapinta" }, "filter": { - "all": "All", - "none": "None", - "starred": "Starred" + "all": "Kaikki", + "none": "Ei mitään", + "starred": "Tähdellä merkityt" }, "folder": { "created": "Kansio luotu", "edit": "Muokkaa kansiota", - "invalid_name": "Anna kansion nimi", - "name_length_insufficient": "Folder name should be at least 3 characters long", + "invalid_name": "Anna kansiolle nimi", + "name_length_insufficient": "Kansion nimen on oltava vähintään 3 merkkiä pitkä", "new": "Uusi kansio", - "renamed": "Kansio nimettiin uudelleen" + "run": "Suorita kansio", + "renamed": "Kansio nimetty uudelleen", + "sorted": "Kansio järjestetty" }, "graphql": { - "connection_switch_confirm": "Do you want to connect with the latest GraphQL endpoint?", - "connection_switch_new_url": "Switching to a tab will disconnected you from the active GraphQL connection. New connection URL is", - "connection_switch_url": "You're connected to a GraphQL endpoint the connection URL is", + "arguments": "Argumentit", + "connection_switch_confirm": "Haluatko yhdistää uusimpaan GraphQL-päätepisteeseen?", + "connection_error_http": "GraphQL-skeeman haku epäonnistui verkkovirheen vuoksi.", + "connection_switch_new_url": "Välilehden vaihto katkaisee aktiivisen GraphQL-yhteyden. Uusi yhteysosoite on", + "connection_switch_url": "Olet yhteydessä GraphQL-päätepisteeseen, yhteysosoite on", + "deprecated": "Vanhentunut", + "fields": "Kentät", + "mutation": "Mutaatio", "mutations": "Mutaatiot", - "schema": "Kaavio", + "schema": "Skeema", + "show_depricated_values": "Näytä vanhentuneet arvot", + "subscription": "Tilaus", "subscriptions": "Tilaukset", - "switch_connection": "Switch connection", - "url_placeholder": "Enter a GraphQL endpoint URL" + "switch_connection": "Vaihda yhteyttä", + "url_placeholder": "Syötä GraphQL-päätepisteen URL", + "query": "Kysely" }, "graphql_collections": { - "title": "GraphQL Collections" + "title": "GraphQL-kokoelmat" }, "group": { - "time": "Time", + "time": "Aika", "url": "URL" }, "header": { "install_pwa": "Asenna sovellus", "login": "Kirjaudu sisään", - "save_workspace": "Tallenna työtila" + "save_workspace": "Tallenna työtilani" }, "helpers": { "authorization": "Valtuutusotsikko luodaan automaattisesti, kun lähetät pyynnön.", - "collection_properties_authorization": " This authorization will be set for every request in this collection.", - "collection_properties_header": "This header will be set for every request in this collection.", - "generate_documentation_first": "Luo asiakirjat ensin", - "network_fail": "Sovellusliittymän päätepistettä ei voi saavuttaa. Tarkista verkkoyhteys ja yritä uudelleen.", - "offline": "Näytät olevan offline -tilassa. Tämän työtilan tiedot eivät ehkä ole ajan tasalla.", - "offline_short": "Näytät olevan offline -tilassa.", - "post_request_tests": "Testikomentosarjat kirjoitetaan JavaScriptillä ja ne suoritetaan vastauksen vastaanottamisen jälkeen.", - "pre_request_script": "Pyyntöä edeltävät komentosarjat kirjoitetaan JavaScriptillä ja ne suoritetaan ennen pyynnön lähettämistä.", - "script_fail": "Vaikuttaa siltä, että ennakkopyyntöskriptissä on virhe. Tarkista alla oleva virhe ja korjaa komentosarja sen mukaisesti.", - "post_request_script_fail": "There seems to be an error with post-request script. Please fix the errors and run tests again", - "post_request_script": "Kirjoita testikomentosarja virheenkorjauksen automatisoimiseksi." + "collection_properties_authorization": " Tämä valtuutus asetetaan jokaiselle pyynnölle tässä kokoelmassa.", + "collection_properties_header": "Tämä otsikko asetetaan jokaiselle pyynnölle tässä kokoelmassa.", + "collection_properties_scripts": "Nämä skriptit suoritetaan jokaiselle pyynnölle tässä kokoelmassa. Esipyyntöskriptit suoritetaan ennen pyyntöä, testiskriptit vastauksen jälkeen.", + "generate_documentation_first": "Luo dokumentaatio ensin", + "network_fail": "API-päätepisteeseen ei saada yhteyttä. Tarkista verkkoyhteytesi tai valitse toinen sieppaaja ja yritä uudelleen.", + "offline": "Käytät Hoppscotchia offline-tilassa. Päivitykset synkronoidaan, kun olet online, työtilan asetusten mukaan.", + "offline_short": "Käytät Hoppscotchia offline-tilassa.", + "post_request_tests": "Jälkipyyntöskriptit kirjoitetaan JavaScriptillä ja suoritetaan vastauksen saamisen jälkeen.", + "pre_request_script": "Esipyyntöskriptit kirjoitetaan JavaScriptillä ja suoritetaan ennen pyynnön lähettämistä.", + "script_fail": "Esipyyntöskriptissä näyttää olevan virhe. Tarkista alla oleva virhe ja korjaa skripti.", + "post_request_script_fail": "Jälkipyyntöskriptissä näyttää olevan virhe. Korjaa virheet ja suorita testit uudelleen", + "post_request_script": "Kirjoita jälkipyyntöskripti automatisoidaksesi virheen etsinnän." }, "hide": { - "collection": "Collapse Collection Panel", - "more": "Piilota enemmän", + "collection": "Pienennä kokoelmapaneeli", + "more": "Piilota lisää", "preview": "Piilota esikatselu", - "sidebar": "Piilota sivupalkki" + "sidebar": "Pienennä sivupalkki", + "password": "Piilota salasana" }, "import": { - "collections": "Tuo kokoelmia", + "collections": "Tuo kokoelmat", "curl": "Tuo cURL", - "environments_from_gist": "Import From Gist", - "environments_from_gist_description": "Import Hoppscotch Environments From Gist", - "failed": "Tuonti epäonnistui", - "from_file": "Import from File", + "environments_from_gist": "Tuo Gististä", + "environments_from_gist_description": "Tuo Hoppscotch-ympäristöt Gististä", + "failed": "Virhe tuonnissa: muotoa ei tunnistettu", + "from_file": "Tuo tiedostosta", "from_gist": "Tuo Gististä", - "from_gist_description": "Import from Gist URL", - "from_insomnia": "Import from Insomnia", - "from_insomnia_description": "Import from Insomnia collection", - "from_json": "Import from Hoppscotch", - "from_json_description": "Import from Hoppscotch collection file", + "from_gist_description": "Tuo Gist-URL-osoitteesta", + "from_gist_import_summary": "Kaikki Hoppscotch-ominaisuudet tuodaan.", + "from_hoppscotch_importer_summary": "Kaikki Hoppscotch-ominaisuudet tuodaan.", + "from_insomnia": "Tuo Insomniasta", + "from_insomnia_description": "Tuo Insomnia-kokoelmasta", + "from_insomnia_import_summary": "Kokoelmat ja pyynnöt tuodaan.", + "from_json": "Tuo Hoppscotchista", + "from_json_description": "Tuo Hoppscotch-kokoelmatiedostosta", "from_my_collections": "Tuo omista kokoelmista", - "from_my_collections_description": "Import from My Collections file", - "from_openapi": "Import from OpenAPI", - "from_openapi_description": "Import from OpenAPI specification file (YML/JSON)", - "from_postman": "Import from Postman", - "from_postman_description": "Import from Postman collection", - "from_url": "Import from URL", - "gist_url": "Anna Gist URL", - "gql_collections_from_gist_description": "Import GraphQL Collections From Gist", - "hoppscotch_environment": "Hoppscotch Environment", - "hoppscotch_environment_description": "Import Hoppscotch Environment JSON file", - "import_from_url_invalid_fetch": "Couldn't get data from the url", - "import_from_url_invalid_file_format": "Error while importing collections", - "import_from_url_invalid_type": "Unsupported type. accepted values are 'hoppscotch', 'openapi', 'postman', 'insomnia'", - "import_from_url_success": "Collections Imported", - "insomnia_environment_description": "Import Insomnia Environment from a JSON/YAML file", - "json_description": "Import collections from a Hoppscotch Collections JSON file", - "postman_environment": "Postman Environment", - "postman_environment_description": "Import Postman Environment from a JSON file", + "from_my_collections_description": "Tuo omien kokoelmien tiedostosta", + "from_all_collections": "Tuo toisesta työtilasta", + "from_all_collections_description": "Tuo mikä tahansa kokoelma toisesta työtilasta nykyiseen työtilaan", + "from_openapi": "Tuo OpenAPI:sta", + "from_openapi_description": "Tuo OpenAPI-määrittelytiedostosta (YML/JSON)", + "from_openapi_import_summary": "Kokoelmat (luodaan tunnisteista), pyynnöt ja vastausesimerkit tuodaan.", + "from_postman": "Tuo Postmanista", + "from_postman_description": "Tuo Postman-kokoelmasta", + "from_postman_import_summary": "Kokoelmat, pyynnöt ja vastausesimerkit tuodaan.", + "import_scripts": "Tuo skriptit", + "import_scripts_description": "Tukee Postman Collection v2.0/v2.1.", + "from_url": "Tuo URL-osoitteesta", + "gist_url": "Syötä Gist-URL", + "from_har": "Tuo HAR-tiedostosta", + "from_har_description": "Tuo HAR-tiedostosta", + "from_har_import_summary": "Pyynnöt tuodaan oletuskokoelmaan.", + "gql_collections_from_gist_description": "Tuo GraphQL-kokoelmat Gististä", + "hoppscotch_environment": "Hoppscotch-ympäristö", + "hoppscotch_environment_description": "Tuo Hoppscotch-ympäristön JSON-tiedosto", + "import_from_url_invalid_fetch": "Tietoja ei voitu hakea URL-osoitteesta", + "import_from_url_invalid_file_format": "Virhe kokoelmien tuonnissa", + "import_from_url_invalid_type": "Tyyppiä ei tueta. Hyväksytyt arvot ovat 'hoppscotch', 'openapi', 'postman', 'insomnia'", + "import_from_url_success": "Kokoelmat tuotu", + "insomnia_environment_description": "Tuo Insomnia-ympäristö JSON/YAML-tiedostosta", + "json_description": "Tuo kokoelmat Hoppscotch Collections JSON -tiedostosta", + "postman_environment": "Postman-ympäristö", + "postman_environment_description": "Tuo Postman-ympäristö JSON-tiedostosta", "title": "Tuonti", - "file_size_limit_exceeded_warning_multiple_files": "Chosen files exceed the recommended limit of 10MB. Only the first {files} selected will be imported", - "file_size_limit_exceeded_warning_single_file": "The currently chosen file exceeds the recommended limit of 10MB. Please select another file.", - "success": "Successfully imported" + "file_size_limit_exceeded_warning_multiple_files": "Valitut tiedostot ylittävät suositellun rajan {sizeLimit} Mt. Vain ensimmäiset {files} valittua tuodaan", + "file_size_limit_exceeded_warning_single_file": "Valittu tiedosto ylittää suositellun rajan {sizeLimit} Mt. Valitse toinen tiedosto.", + "success": "Tuotu onnistuneesti", + "import_summary_collections_title": "Kokoelmat", + "import_summary_requests_title": "Pyynnöt", + "import_summary_responses_title": "Vastaukset", + "import_summary_pre_request_scripts_title": "Esipyyntöskriptit", + "import_summary_post_request_scripts_title": "Jälkipyyntöskriptit", + "import_summary_not_supported_by_hoppscotch_import": "Emme tue tällä hetkellä {featureLabel} tuontia tästä lähteestä.", + "import_summary_script_found": "skripti löydetty mutta ei tuotu", + "import_summary_scripts_found": "skriptiä löydetty mutta ei tuotu", + "import_summary_enable_experimental_sandbox": "Tuodaksesi Postman-skriptejä, ota käyttöön 'Kokeellinen skriptihiekkalaatikko' asetuksista. Huom: Tämä ominaisuus on kokeellinen.", + "cors_error_modal": { + "title": "CORS-virhe havaittu", + "description": "Tuonti epäonnistui palvelimen CORS-rajoitusten (Cross-Origin Resource Sharing) vuoksi.", + "explanation": "Tämä on turvaominaisuus, joka estää verkkosivuja tekemästä pyyntöjä eri verkkotunnuksiin. Voit yrittää uudelleen käyttämällä välityspalveluamme tämän rajoituksen ohittamiseksi.", + "url_label": "Yritetty URL", + "retry_with_proxy": "Yritä uudelleen välityspalvelimella" + } + }, + "instances": { + "switch": "Vaihda Hoppscotch-instanssia", + "enter_server_url": "Yhdistä itse isännöityyn instanssiin", + "already_connected": "Olet jo yhteydessä tähän instanssiin", + "recent_connections": "Viimeaikaiset yhteydet", + "add_instance": "Lisää instanssi", + "add_new": "Lisää uusi instanssi", + "confirm_remove": "Vahvista poisto", + "remove_warning": "Haluatko varmasti poistaa tämän instanssin?", + "clear_cached_bundles": "Tyhjennä välimuistissa olevat paketit", + "opening_add_modal": "Avataan lisää instanssi -ikkuna", + "closed_add_modal": "Lisää instanssi -ikkuna suljettu", + "cancelled_removal": "Instanssin poisto peruutettu", + "connection_cancelled": "Yhteys peruutettu esivalidoinnissa", + "post_connect_completed": "Yhteyden jälkeinen asennus valmis", + "connecting": "Yhdistetään instanssiin...", + "confirm_removal": "Vahvista instanssin poisto", + "removal_cancelled": "Instanssin poisto peruutettu esivalidoinnissa", + "post_remove_completed": "Poiston jälkeinen siivous valmis", + "removing": "Poistetaan instanssia...", + "clearing_cache": "Tyhjennetään välimuistia...", + "initialized": "Instanssinvaihto alustettu", + "connecting_state": "Muodostetaan yhteyttä...", + "connected_state": "Yhdistetty instanssiin onnistuneesti", + "disconnected_state": "Yhteys instanssiin katkaistu", + "stream_error": "Yhteystilan seuranta epäonnistui", + "recent_instances_error": "Viimeaikaisten instanssien lataus epäonnistui", + "instance_changed": "Vaihdettu instanssiin", + "current_instance_error": "Nykyisen instanssin seuranta epäonnistui", + "not_available": "Instanssin vaihto ei ole käytettävissä", + "cleanup_completed": "Instanssinvaihdon siivous valmis", + "self_hosted": "Itse isännöidyt instanssit" }, "inspections": { - "description": "Inspect possible errors", + "description": "Tarkista mahdolliset virheet", "environment": { - "add_environment": "Add to Environment", - "add_environment_value": "Add value", - "empty_value": "Environment value is empty for the variable '{variable}' ", - "not_found": "Environment variable “{environment}” not found." + "add_environment": "Lisää ympäristöön", + "add_environment_value": "Lisää arvo", + "empty_value": "Ympäristömuuttujan '{variable}' arvo on tyhjä ", + "not_found": "Ympäristömuuttujaa '{environment}' ei löytynyt." }, "header": { - "cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead." + "cookie": "Selain ei salli Hoppscotchin asettaa Cookie-otsikoita. Käytä sen sijaan valtuutusotsikoita. Hoppscotch-työpöytäsovellus kuitenkin tukee evästeitä." }, "response": { - "401_error": "Please check your authentication credentials.", - "404_error": "Please check your request URL and method type.", - "cors_error": "Please check your Cross-Origin Resource Sharing configuration.", - "default_error": "Please check your request.", - "network_error": "Please check your network connection." + "401_error": "Tarkista todennustietosi.", + "404_error": "Tarkista pyynnön URL-osoite ja metodityyppi.", + "cors_error": "Tarkista Cross-Origin Resource Sharing -asetukset.", + "default_error": "Tarkista pyynnösi.", + "network_error": "Tarkista verkkoyhteytesi." }, - "title": "Inspector", + "title": "Tarkastaja", "url": { - "extension_not_installed": "Extension not installed.", - "extension_unknown_origin": "Make sure you've added the API endpoint's origin to the Hoppscotch Browser Extension list.", - "extention_enable_action": "Enable Browser Extension", - "extention_not_enabled": "Extension not enabled." + "extension_not_installed": "Laajennusta ei ole asennettu.", + "extension_unknown_origin": "Varmista, että olet lisännyt API-päätepisteen lähteen Hoppscotch-selainlaajennuksen listaan.", + "extention_enable_action": "Ota selainlaajennus käyttöön", + "extention_not_enabled": "Laajennus ei ole käytössä.", + "localaccess_unsupported": "Nykyinen sieppaaja ei tue paikallista pääsyä, harkitse Agent- tai laajennussieppaajien tai työpöytäsovelluksen käyttöä" + }, + "auth": { + "digest": "Agent-sieppaajaa verkkosovelluksessa tai natiivia sieppaajaa työpöytäsovelluksessa suositellaan Digest-valtuutuksen kanssa.", + "hawk": "Agent-sieppaajaa verkkosovelluksessa tai natiivia sieppaajaa työpöytäsovelluksessa suositellaan Hawk-valtuutuksen kanssa." + }, + "body": { + "binary": "Binääridatan lähettämistä nykyisellä sieppaajalla ei tueta vielä." + }, + "scripting_interceptor": { + "pre_request": "esipyyntöskripti", + "post_request": "jälkipyyntöskripti", + "both_scripts": "esipyyntö- ja jälkipyyntöskriptit", + "unsupported_interceptor": "{scriptType} käyttää rajapintaa {apiUsed}. Luotettavan suorituksen varmistamiseksi vaihda Agent-sieppaajaan (verkkosovellus) tai natiiviin sieppaajaan (työpöytäsovellus). {interceptor}-sieppaajalla on rajoitettu tuki skriptipyynnöille eikä se välttämättä toimi odotetulla tavalla.", + "same_origin_csrf_warning": "Turvallisuusvaroitus: {scriptType} tekee saman alkuperän pyyntöjä käyttäen rajapintaa {apiUsed}. Koska tämä alusta käyttää evästepohjaista todennusta, nämä pyynnöt sisältävät automaattisesti istuntoevästeet, mikä voi mahdollistaa haitallisten skriptien luvattomien toimintojen suorittamisen. Käytä Agent-sieppaajaa saman alkuperän pyynnöille tai suorita vain luotettavia skriptejä." + } + }, + "interceptor": { + "native": { + "name": "Natiivi", + "settings_title": "Natiivi" + }, + "agent": { + "name": "Agent", + "settings_title": "Agent" + }, + "proxy": { + "name": "Välityspalvelin", + "settings_title": "Välityspalvelin" + }, + "browser": { + "name": "Selain", + "settings_title": "Selain" + }, + "extension": { + "name": "Laajennus", + "settings_title": "Laajennus" } }, "layout": { - "collapse_collection": "Collapse or Expand Collections", - "collapse_sidebar": "Collapse or Expand the sidebar", - "column": "Vertical layout", - "name": "Layout", - "row": "Horizontal layout" + "collapse_collection": "Pienennä tai laajenna kokoelmat", + "collapse_sidebar": "Pienennä tai laajenna sivupalkki", + "column": "Pystyasettelu", + "name": "Asettelu", + "row": "Vaaka-asettelu" }, "modal": { - "close_unsaved_tab": "You have unsaved changes", + "close_unsaved_tab": "Sinulla on tallentamattomia muutoksia", "collections": "Kokoelmat", - "confirm": "Vahvistaa", - "customize_request": "Customize Request", + "confirm": "Vahvista", + "customize_request": "Mukauta pyyntöä", "edit_request": "Muokkaa pyyntöä", - "import_export": "Tuonti ja vienti", - "share_request": "Share Request" + "edit_response": "Muokkaa vastausta", + "import_export": "Tuonti / Vienti", + "response_name": "Vastauksen nimi", + "share_request": "Jaa pyyntö" }, "mqtt": { - "already_subscribed": "You are already subscribed to this topic.", - "clean_session": "Clean Session", - "clear_input": "Clear input", - "clear_input_on_send": "Clear input on send", - "client_id": "Client ID", - "color": "Pick a color", + "already_subscribed": "Olet jo tilannut tämän aiheen.", + "clean_session": "Puhdas istunto", + "clear_input": "Tyhjennä syöte", + "clear_input_on_send": "Tyhjennä syöte lähetettäessä", + "client_id": "Asiakastunnus", + "color": "Valitse väri", "communication": "Viestintä", - "connection_config": "Connection Config", - "connection_not_authorized": "This MQTT connection does not use any authentication.", - "invalid_topic": "Please provide a topic for the subscription", - "keep_alive": "Keep Alive", - "log": "Hirsi", - "lw_message": "Last-Will Message", - "lw_qos": "Last-Will QoS", - "lw_retain": "Last-Will Retain", - "lw_topic": "Last-Will Topic", + "connection_config": "Yhteysasetukset", + "connection_not_authorized": "Tämä MQTT-yhteys ei käytä todennusta.", + "invalid_topic": "Anna aihe tilaukselle", + "keep_alive": "Pidä yhteys", + "log": "Loki", + "lw_message": "Testamenttiviesti", + "lw_qos": "Testamentin QoS", + "lw_retain": "Testamentin säilytys", + "lw_topic": "Testamenttiaihe", "message": "Viesti", - "new": "New Subscription", - "not_connected": "Please start a MQTT connection first.", - "publish": "Julkaista", + "new": "Uusi tilaus", + "not_connected": "Aloita ensin MQTT-yhteys.", + "publish": "Julkaise", "qos": "QoS", "ssl": "SSL", "subscribe": "Tilaa", "topic": "Aihe", "topic_name": "Aiheen nimi", - "topic_title": "Julkaise / tilaa tilaus", - "unsubscribe": "Lopeta tilaus", - "url": "URL -osoite" + "topic_title": "Julkaise / Tilaa aihe", + "unsubscribe": "Peruuta tilaus", + "url": "URL" }, "navigation": { - "doc": "Docs", + "admin_dashboard": "Hallintapaneeli", + "doc": "Dokumentit", "graphql": "GraphQL", - "profile": "Profile", - "realtime": "Reaaliaika", + "profile": "Profiili", + "realtime": "Reaaliaikaiset", "rest": "REST", - "settings": "asetukset" + "mock_servers": "Mock-palvelimet", + "settings": "Asetukset", + "goto_app": "Siirry sovellukseen", + "authentication": "Todennus" + }, + "mock_server": { + "confirm_delete_log": "Haluatko varmasti poistaa tämän lokin?", + "create_mock_server": "Määritä mock-palvelin", + "mock_server_configuration": "Mock-palvelimen asetukset", + "mock_server_name": "Mock-palvelimen nimi", + "mock_server_name_placeholder": "Syötä mock-palvelimen nimi", + "base_url": "Perus-URL", + "start_server": "Käynnistä palvelin", + "stop_server": "Pysäytä palvelin", + "mock_server_created": "Mock-palvelin luotu onnistuneesti", + "mock_server_started": "Mock-palvelin käynnistetty onnistuneesti", + "mock_server_stopped": "Mock-palvelin pysäytetty onnistuneesti", + "active": "Mock-palvelin on aktiivinen", + "inactive": "Mock-palvelin on epäaktiivinen", + "edit_mock_server": "Muokkaa mock-palvelinta", + "path_based_url": "Polkupohjainen URL", + "subdomain_based_url": "Aliverkkotunnuspohjainen URL", + "mock_server_updated": "Mock-palvelin päivitetty onnistuneesti", + "no_collection": "Ei kokoelmaa", + "collection_deleted": "liitetty kokoelma poistettu.", + "private_access_hint": "Yksityisiä mock-palvelimia varten sisällytä otsikko 'x-api-key' henkilökohtaisella käyttöoikeustokenillasi (luo sellainen profiilissasi).", + "private_access_instruction": "Tämän yksityisen mock-palvelimen käyttämiseksi sisällytä otsikko 'x-api-key' henkilökohtaisella käyttöoikeustokenillasi.", + "create_token_here": "Luo tästä", + "status": "Tila", + "server_running": "Palvelin on käynnissä", + "server_stopped": "Palvelin on pysäytetty", + "delay_ms": "Vastauksen viive (ms)", + "delay_placeholder": "Syötä viive millisekunteina", + "delay_description": "Lisää keinotekoinen viive mock-vastauksiin", + "public_access": "Julkinen pääsy", + "public": "Julkinen", + "private": "Yksityinen", + "public_description": "Kuka tahansa URL-osoitteen tietävä voi käyttää tätä mock-palvelinta", + "private_description": "Vain todennetut käyttäjät voivat käyttää tätä mock-palvelinta", + "select_collection": "Valitse kokoelma", + "select_collection_error": "Valitse kokoelma", + "invalid_collection_error": "Mock-palvelimen luonti kokoelmalle epäonnistui.", + "url_copied": "URL kopioitu leikepöydälle", + "make_public": "Tee julkiseksi", + "view_logs": "Näytä lokit", + "logs_title": "Mock-palvelimen lokit", + "no_logs": "Ei lokeja saatavilla", + "request_headers": "Pyynnön otsikot", + "request_body": "Pyynnön runko", + "response_status": "Vastauksen tila", + "response_headers": "Vastauksen otsikot", + "response_body": "Vastauksen runko", + "log_deleted": "Loki poistettu onnistuneesti", + "description": "Mock-palvelimet simuloivat API-vastauksia kokoelmasi vastausesimerkkien perusteella.", + "set_in_environment": "Aseta ympäristöön", + "set_in_environment_hint": "Mock-palvelimen URL lisätään automaattisesti 'mockUrl'-muuttujana kokoelman ympäristöön", + "environment_variable_added": "Mock URL lisätty ympäristöön", + "environment_variable_updated": "Mock URL päivitetty ympäristössä", + "environment_created_with_variable": "Ympäristö luotu mock URL:lla", + "add_example_request": "Lisää esimerkkipyyntö", + "add_example_request_hint": "Kokoelma luodaan esimerkkipyynnöllä, joka näyttää miten mock-palvelinta käytetään", + "create_example_collection": "Luo esimerkkikokoelma", + "create_example_collection_hint": "Luo lemmikkikauppaesimerkkikokoelma esimerkkipyynnöillä (GET, POST, PUT, DELETE)", + "creating_example_collection": "Luodaan esimerkkikokoelmaa...", + "failed_to_create_collection": "Esimerkkikokoelman luonti epäonnistui", + "enable_example_collection_hint": "Ota käyttöön 'Luo esimerkkikokoelma' -valinta uuden kokoelman tilassa", + "new_collection_name_hint": "Kokoelma luodaan samalla nimellä kuin mock-palvelimesi", + "existing_collection": "Olemassa oleva kokoelma", + "new_collection": "Uusi kokoelma" }, "preRequest": { - "javascript_code": "JavaScript -koodi", + "javascript_code": "JavaScript-koodi", "learn": "Lue dokumentaatio", - "script": "Pre-Request-skripti", - "snippets": "Katkelmat" + "script": "Esipyyntöskripti", + "snippets": "Koodinpätkät" }, "profile": { - "app_settings": "App Settings", - "default_hopp_displayname": "Unnamed User", - "editor": "Editor", - "editor_description": "Editors can add, edit, and delete requests.", - "email_verification_mail": "A verification email has been sent to your email address. Please click on the link to verify your email address.", - "no_permission": "You do not have permission to perform this action.", - "owner": "Owner", - "owner_description": "Owners can add, edit, and delete requests, collections and team members.", - "roles": "Roles", - "roles_description": "Roles are used to control access to the shared collections.", - "updated": "Profile updated", - "viewer": "Viewer", - "viewer_description": "Viewers can only view and use requests." + "app_settings": "Sovelluksen asetukset", + "default_hopp_displayname": "Nimetön käyttäjä", + "editor": "Muokkaaja", + "editor_description": "Muokkaajat voivat lisätä, muokata ja poistaa pyyntöjä.", + "email_verification_mail": "Vahvistussähköposti on lähetetty sähköpostiosoitteeseesi. Napsauta linkkiä vahvistaaksesi sähköpostiosoitteesi.", + "no_permission": "Sinulla ei ole oikeutta suorittaa tätä toimintoa.", + "owner": "Omistaja", + "owner_description": "Omistajat voivat lisätä, muokata ja poistaa pyyntöjä, kokoelmia ja työtilan jäseniä.", + "roles": "Roolit", + "roles_description": "Rooleja käytetään jaettujen kokoelmien pääsynhallintaan.", + "updated": "Profiili päivitetty", + "viewer": "Katsoja", + "viewer_description": "Katsojat voivat vain tarkastella ja käyttää pyyntöjä.", + "verified_email_sent": "Vahvistussähköposti on lähetetty sähköpostiosoitteeseesi. Päivitä sivu vahvistettuasi sähköpostiosoitteesi. Saat sähköpostin, jos tämä osoite ei ole yhdistetty toiseen tiliin." }, "remove": { "star": "Poista tähti" }, "request": { "added": "Pyyntö lisätty", + "add": "Lisää pyyntö", "authorization": "Valtuutus", "body": "Pyynnön runko", "choose_language": "Valitse kieli", "content_type": "Sisältötyyppi", "content_type_titles": { - "others": "Others", - "structured": "Structured", - "text": "Text" + "others": "Muut", + "structured": "Rakenteinen", + "text": "Teksti", + "binary": "Binääri" }, - "different_collection": "Cannot reorder requests from different collections", - "duplicated": "Request duplicated", + "show_content_type": "Näytä sisältötyyppi", + "different_collection": "Pyyntöjä ei voi järjestää uudelleen eri kokoelmista", + "duplicated": "Pyyntö kopioitu", "duration": "Kesto", - "enter_curl": "Kirjoita cURL", + "enter_curl": "Syötä cURL-komento", "generate_code": "Luo koodi", "generated_code": "Luotu koodi", - "go_to_authorization_tab": "Go to Authorization tab", - "go_to_body_tab": "Go to Body tab", - "header_list": "Otsikkoluettelo", + "go_to_authorization_tab": "Siirry Valtuutus-välilehteen", + "go_to_body_tab": "Siirry Runko-välilehteen", + "header_list": "Otsikkolista", "invalid_name": "Anna pyynnölle nimi", - "method": "Menetelmä", - "moved": "Request moved", + "method": "Metodi", + "moved": "Pyyntö siirretty", "name": "Pyynnön nimi", - "new": "New Request", - "order_changed": "Request Order Updated", - "override": "Override", - "override_help": "Set Content-Type in Headers", - "overriden": "Overridden", + "new": "Uusi pyyntö", + "order_changed": "Pyynnön järjestys päivitetty", + "override": "Ohita", + "override_help": "Aseta Content-Type otsikoissa", + "overriden": "Ohitettu", "parameter_list": "Kyselyparametrit", "parameters": "Parametrit", "path": "Polku", - "payload": "Hyötykuorma", + "payload": "Sisältö", "query": "Kysely", "raw_body": "Raaka pyynnön runko", - "rename": "Rename Request", - "renamed": "Pyyntö nimettiin uudelleen", - "request_variables": "Request variables", - "run": "Juosta", - "save": "Tallentaa", + "rename": "Nimeä pyyntö uudelleen", + "renamed": "Pyyntö nimetty uudelleen", + "request_variables": "Pyyntömuuttujat", + "response_name_exists": "Vastauksen nimi on jo olemassa", + "run": "Suorita", + "save": "Tallenna", "save_as": "Tallenna nimellä", "saved": "Pyyntö tallennettu", "share": "Jaa", - "share_description": "Share Hoppscotch with your friends", - "share_request": "Share Request", - "stop": "Stop", + "share_description": "Jaa Hoppscotch ystävillesi", + "share_request": "Jaa pyyntö", + "stop": "Pysäytä", "title": "Pyyntö", "type": "Pyynnön tyyppi", - "url": "URL -osoite", - "url_placeholder": "Enter a URL or paste a cURL command", + "url": "URL", + "url_placeholder": "Syötä URL tai liitä cURL-komento", "variables": "Muuttujat", - "view_my_links": "View my links", - "copy_link": "Kopioi linkki" + "view_my_links": "Näytä linkkini", + "generate_name_error": "Pyynnön nimen luonti epäonnistui." }, "response": { - "audio": "Audio", - "body": "Vastauselin", - "filter_response_body": "Filter JSON response body (uses jq syntax)", + "audio": "Ääni", + "body": "Vastauksen runko", + "duplicated": "Vastaus kopioitu", + "duplicate_name_error": "Samanniminen vastaus on jo olemassa", + "filter_response_body": "Suodata JSON-vastauksen runko (käyttää jq-syntaksia)", "headers": "Otsikot", + "request_headers": "Pyynnön otsikot", "html": "HTML", "image": "Kuva", "json": "JSON", "pdf": "PDF", - "preview_html": "Esikatsele HTML -koodia", + "please_save_request": "Tallenna pyyntö luodaksesi esimerkin", + "preview_html": "Esikatsele HTML", "raw": "Raaka", + "renamed": "Vastaus nimetty uudelleen", + "same_name_inspector_warning": "Samanniminen vastaus on jo olemassa tälle pyynnölle. Tallennettaessa se korvaa olemassa olevan vastauksen", "size": "Koko", "status": "Tila", "time": "Aika", "title": "Vastaus", "video": "Video", - "waiting_for_connection": "yhteyttä odotellessa", - "xml": "XML" + "waiting_for_connection": "odotetaan yhteyttä", + "xml": "XML", + "generate_data_schema": "Luo tietoskeema", + "data_schema": "Tietoskeema", + "saved": "Vastaus tallennettu", + "invalid_name": "Anna vastaukselle nimi" + }, + "script": { + "inheriting": "Perityt skriptit kohteesta", + "inheriting_from_count": "Peritään {count} kokoelmasta | Peritään {count} kokoelmista", + "inherited_scripts": "Perityt skriptit", + "view_inherited": "Näytä perityt skriptit" }, "settings": { "accent_color": "Korostusväri", "account": "Tili", - "account_deleted": "Your account has been deleted", - "account_description": "Muokkaa tilisi asetuksia.", + "account_deleted": "Tilisi on poistettu", + "account_description": "Mukauta tilisi asetuksia.", "account_email_description": "Ensisijainen sähköpostiosoitteesi.", "account_name_description": "Tämä on näyttönimesi.", - "additional": "Additional Settings", + "additional": "Lisäasetukset", + "agent_not_running": "Hoppscotch Agentia ei havaittu. Tarkista, että Agent on käynnissä.", + "agent_not_running_short": "Tarkista Agentin tila.", + "agent_running": "Hoppscotch Agent on aktiivinen.", + "agent_running_short": "Hoppscotch Agent on aktiivinen.", + "agent_discard_registration": "Hylkää Agent-rekisteröinti", + "agent_registered": "Agent rekisteröity", + "agent_registration_successful": "Agent rekisteröity onnistuneesti", + "agent_registration_fetch_failed": "Agent-rekisteröintitietojen haku epäonnistui. Rekisteröi Agent uudelleen.", + "agent_registration_already_in_progress": "Agent-rekisteröinti on jo käynnissä. Suorita tai peruuta nykyinen rekisteröinti ja yritä uudelleen.", + "auto_encode_mode": "Automaattinen", + "auto_encode_mode_tooltip": "Koodaa parametrit pyynnössä vain jos erikoismerkkejä on läsnä", "background": "Tausta", "black_mode": "Musta", "choose_language": "Valitse kieli", "dark_mode": "Tumma", - "delete_account": "Delete account", - "delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.", - "expand_navigation": "Expand navigation", - "experiments": "Kokeet", - "experiments_notice": "Tämä on kokoelma kokeiluja, joita parhaillaan käsittelemme ja jotka voivat osoittautua hyödyllisiksi, hauskoiksi, molemmiksi tai kumpikaan. Ne eivät ole lopullisia eivätkä ehkä vakaita, joten jos jotain liian outoa tapahtuu, älä panikoi. Kytke vain paska pois päältä. Vitsit sivuun,", - "extension_ver_not_reported": "Ei raportoitu", - "extension_version": "Laajennusversio", - "extensions": "Laajennukset", - "extensions_use_toggle": "Käytä pyyntöjen lähettämiseen selainlaajennusta (jos sellainen on)", - "follow": "Follow Us", - "interceptor": "Torjuntahävittäjä", - "interceptor_description": "Sovellusliittymien ja sovellusliittymien välinen väliohjelmisto.", + "delete_account": "Poista tili", + "delete_account_description": "Kun poistat tilisi, kaikki tietosi poistetaan pysyvästi. Tätä toimintoa ei voi peruuttaa.", + "desktop": "Työpöytä", + "desktop_description": "Päivitä käyttäytymis-, näppäimistö- ja näyttöasetukset Hoppscotch-työpöytäsovellukselle.", + "desktop_display": "Näyttö", + "desktop_keyboard": "Näppäimistö", + "desktop_keyboard_strategy_label": "Vastaa pikanäppäimiä kirjoitetun kirjaimen tai fyysisen sijainnin perusteella", + "desktop_keyboard_strategy_description": "Ei-QWERTY-asetteluissa sama kirjain voi tulla eri fyysisistä näppäimistä. Oletusasetus toimii useimmissa asetteluissa; vaihda vaihtoehtoa jos pikanäppäimet eivät toimi odotetusti.", + "desktop_keyboard_strategy_hybrid": "Älykäs (suositeltu)", + "desktop_keyboard_strategy_hybrid_description": "Käytä kirjoitettua kirjainta latinalaisille merkeille; käytä fyysistä näppäinsijaintia ei-latinalaisille asetteluille (kyrilliset, CJK).", + "desktop_keyboard_strategy_key": "Kirjoitettu kirjain", + "desktop_keyboard_strategy_key_description": "Käytä aina kirjoitettua kirjainta. Valitse tämä jos pikanäppäimet eivät toimi odotetusti asettelussasi.", + "desktop_keyboard_strategy_code": "Fyysinen näppäinsijainti", + "desktop_keyboard_strategy_code_description": "Käytä aina US-QWERTY fyysistä sijaintia. Valitse tämä jos sinulla on QWERTY-lihasmuisti ei-latinalaisessa asettelussa.", + "desktop_updates": "Päivitykset", + "disable_encode_mode_tooltip": "Älä koskaan koodaa parametreja pyynnössä", + "disable_update_checks": "Poista automaattiset päivitystarkistukset käytöstä", + "disable_update_checks_description": "Ohita päivitystarkistus sovelluksen käynnistyksessä. Käytä yllä olevaa painiketta tarkistaaksesi manuaalisesti.", + "zoom_level": "Zoomaustaso", + "zoom_level_description": "Skaalaa koko käyttöliittymän. Suuremmat arvot tekevät tekstistä ja säätimistä suurempia korkearesooluutioisilla näytöillä.", + "zoom_level_100": "100%", + "zoom_level_110": "110%", + "zoom_level_125": "125%", + "zoom_level_150": "150%", + "enable_encode_mode_tooltip": "Koodaa aina parametrit pyynnössä", + "enter_otp": "Syötä Agentin koodi", + "expand_navigation": "Laajenna navigointi", + "experiments": "Kokeilut", + "experiments_notice": "Tämä on kokoelma kokeiluja, joiden parissa työskentelemme ja jotka saattavat osoittautua hyödyllisiksi, hauskoiksi, molemmiksi tai ei kummaksikaan. Ne eivät ole lopullisia eivätkä välttämättä vakaita, joten jos jotain outoa tapahtuu, älä hätäänny. Sammuta se vain. Vakavasti puhuen, ", + "extension_ver_not_reported": "Ei ilmoitettu", + "extension_version": "Laajennuksen versio", + "extensions": "Selainlaajennus", + "extensions_use_toggle": "Käytä selainlaajennusta pyyntöjen lähettämiseen (jos asennettu)", + "follow": "Seuraa meitä", + "general": "Yleiset", + "general_description": "Sovelluksen yleiset asetukset", + "interceptor": "Sieppaaja", + "interceptor_description": "Väliohjelmisto sovelluksen ja API:en välillä.", + "kernel_interceptor": "Sieppaaja", + "kernel_interceptor_description": "Väliohjelmisto sovelluksen ja API:en välillä.", "language": "Kieli", - "light_mode": "Valo", - "official_proxy_hosting": "Virallista välityspalvelinta isännöi Hoppscotch.", - "profile": "Profile", - "profile_description": "Update your profile details", - "profile_email": "Email address", - "profile_name": "Profile name", + "light_mode": "Vaalea", + "official_proxy_hosting": "Virallista välityspalvelinta ylläpitää Hoppscotch.", + "query_parameters_encoding": "Kyselyparametrien koodaus", + "query_parameters_encoding_description": "Määritä kyselyparametrien koodaus pyyntöihin", + "profile": "Profiili", + "profile_description": "Päivitä profiilitietosi", + "profile_email": "Sähköpostiosoite", + "profile_name": "Profiilin nimi", + "profile_photo": "Profiilikuva", "proxy": "Välityspalvelin", - "proxy_url": "Välityspalvelimen URL -osoite", - "proxy_use_toggle": "Käytä välityspalvelimen väliohjelmistoa pyyntöjen lähettämiseen", + "proxy_url": "Välityspalvelimen URL", + "proxy_url_invalid": "Välityspalvelimen URL:n on alettava http(s):// eikä se saa sisältää välilyöntejä", + "proxy_use_toggle": "Käytä välityspalvelinta pyyntöjen lähettämiseen", "read_the": "Lue", - "reset_default": "Palauta oletusarvoon", - "short_codes": "Short codes", - "short_codes_description": "Short codes which were created by you.", - "sidebar_on_left": "Sidebar on left", - "sync": "Synkronoida", + "register_agent": "Rekisteröi Agent", + "reset_default": "Käytä oletusvälityspalvelinta", + "short_codes": "Lyhytkoodit", + "short_codes_description": "Luomasi lyhytkoodit.", + "sidebar_on_left": "Sivupalkki vasemmalla", + "ai_experiments": "Tekoälykokeilut", + "ai_request_naming_style": "Pyynnön nimeämistyyli", + "ai_request_naming_style_descriptive_with_spaces": "Kuvaileva välilyönneillä", + "ai_request_naming_style_camel_case": "Camel Case ( camelCase )", + "ai_request_naming_style_snake_case": "Snake Case ( snake_case )", + "ai_request_naming_style_pascal_case": "Pascal Case ( PascalCase )", + "ai_request_naming_style_custom": "Mukautettu", + "ai_request_naming_style_custom_placeholder": "Syötä mukautettu nimeämistyylin malli...", + "experimental_scripting_sandbox": "Kokeellinen skriptihiekkalaatikko", + "enable_experimental_mock_servers": "Ota Mock-palvelimet käyttöön", + "enable_experimental_documentation": "Ota Dokumentaatio käyttöön", + "sync": "Synkronoi", "sync_collections": "Kokoelmat", "sync_description": "Nämä asetukset synkronoidaan pilveen.", "sync_environments": "Ympäristöt", "sync_history": "Historia", + "history_disabled": "Historia on poistettu käytöstä. Ota yhteyttä organisaatiosi ylläpitäjään historian ottamiseksi käyttöön", "system_mode": "Järjestelmä", "telemetry": "Telemetria", - "telemetry_helps_us": "Telemetria auttaa meitä yksilöimään toimintamme ja tarjoamaan sinulle parhaan mahdollisen kokemuksen.", + "telemetry_helps_us": "Telemetria auttaa meitä mukauttamaan toimintojamme ja tarjoamaan sinulle parhaan käyttökokemuksen.", "theme": "Teema", - "theme_description": "Mukauta sovellusteemaa.", - "use_experimental_url_bar": "Käytä kokeellista URL -palkkia ympäristön korostamisen kanssa", + "theme_description": "Mukauta sovelluksen teemaa.", + "update_check_description": "Tarkista manuaalisesti uusi versio ja asenna se. Toimii alla olevan kytkimen asetuksesta riippumatta.", + "update_check_now": "Tarkista päivitykset", + "update_checking": "Tarkistetaan…", + "update_download_version": "Lataa v{version}", + "update_downloading": "Ladataan…", + "update_downloading_percent": "Ladataan {percent}%", + "update_installing": "Asennetaan…", + "update_restart_now": "Käynnistä uudelleen päivityksen asentamiseksi", + "update_up_to_date": "Ajan tasalla", + "use_experimental_url_bar": "Käytä kokeellista URL-palkkia ympäristökorostuksella", "user": "Käyttäjä", - "verified_email": "Verified email", - "verify_email": "Verify email" + "verified_email": "Vahvistettu sähköposti", + "verify_email": "Vahvista sähköposti", + "validate_certificates": "Validoi SSL/TLS-sertifikaatit", + "verify_host": "Vahvista isäntä", + "verify_peer": "Vahvista vastapuoli", + "follow_redirects": "Seuraa uudelleenohjauksia", + "client_certificates": "Asiakassertifikaatit", + "certificate_settings": "Sertifikaattiasetukset", + "certificate": "Sertifikaatti", + "key": "Yksityinen avain", + "pfx_or_p12": "PFX/PKCS#12", + "password": "Salasana", + "select_file": "Valitse tiedosto", + "domain": "Verkkotunnus", + "add_certificate": "Lisää sertifikaatti", + "add_cert_file": "Lisää sertifikaattitiedosto", + "add_key_file": "Lisää avaintiedosto", + "add_pfx_file": "Lisää PFX-tiedosto", + "global_defaults": "Yleiset oletukset", + "add_domain_override": "Lisää verkkotunnusohitus", + "domain_override": "Verkkotunnusohitus", + "manage_domains_overrides": "Hallitse verkkotunnusohituksia", + "add_domain": "Lisää verkkotunnus", + "remove_domain": "Poista verkkotunnus", + "ca_certificate": "CA-sertifikaatti", + "ca_certificates": "CA-sertifikaatit", + "ca_certificates_support": "Hoppscotch tukee .crt-, .cer- tai .pem-tiedostoja, jotka sisältävät yhden tai useamman sertifikaatin.", + "proxy_capabilities": "Hoppscotch Agent ja työpöytäsovellus tukevat HTTP/HTTPS/SOCKS-välityspalvelimia NTLM- ja Basic Auth -tuella.", + "proxy_auth": "Voit myös sisällyttää käyttäjätunnuksen ja salasanan URL-osoitteeseen." }, "shared_requests": { - "button": "Button", - "button_info": "Create a 'Run in Hoppscotch' button for your website, blog or a README.", - "copy_html": "Copy HTML", - "copy_link": "Copy Link", - "copy_markdown": "Copy Markdown", - "creating_widget": "Creating widget", - "customize": "Customize", - "deleted": "Shared request deleted", - "description": "Select a widget, you can change and customize this later", - "embed": "Embed", - "embed_info": "Add a mini 'Hoppscotch API Playground' to your website, blog or documentation.", - "link": "Link", - "link_info": "Create a shareable link to share with anyone on the internet with view access.", - "modified": "Shared request modified", - "not_found": "Shared request not found", - "open_new_tab": "Open in new tab", - "preview": "Preview", - "run_in_hoppscotch": "Run in Hoppscotch", + "button": "Painike", + "button_info": "Luo 'Suorita Hoppscotchissa' -painike verkkosivullesi, blogillesi tai README-tiedostolle.", + "copy_html": "Kopioi HTML", + "copy_link": "Kopioi linkki", + "copy_markdown": "Kopioi Markdown", + "creating_widget": "Luodaan widgettiä", + "customize": "Mukauta", + "deleted": "Jaettu pyyntö poistettu", + "description": "Valitse widget, voit muuttaa ja mukauttaa tätä myöhemmin", + "embed": "Upota", + "embed_info": "Lisää mini 'Hoppscotch API Playground' verkkosivullesi, blogillesi tai dokumentaatioosi.", + "link": "Linkki", + "link_info": "Luo jaettava linkki, jonka voit jakaa kenelle tahansa internetissä katseluoikeudella.", + "modified": "Jaettu pyyntö muokattu", + "not_found": "Jaettua pyyntöä ei löytynyt", + "open_new_tab": "Avaa uudessa välilehdessä", + "preview": "Esikatselu", + "run_in_hoppscotch": "Suorita Hoppscotchissa", "theme": { - "dark": "Dark", - "light": "Light", - "system": "System", - "title": "Theme" - } + "dark": "Tumma", + "light": "Vaalea", + "system": "Järjestelmä", + "title": "Teema" + }, + "action": "Toiminto", + "clear_filter": "Tyhjennä suodatin", + "confirm_request_deletion": "Vahvista valitun jaetun pyynnön poisto?", + "copy": "Kopioi", + "created_on": "Luotu", + "delete": "Poista", + "email": "Sähköposti", + "filter": "Suodata", + "filter_by_email": "Suodata sähköpostilla", + "id": "ID", + "load_list_error": "Jaettujen pyyntöjen listan lataus epäonnistui", + "no_requests": "Jaettuja pyyntöjä ei löytynyt", + "open_request": "Avaa pyyntö", + "properties": "Ominaisuudet", + "request": "Pyyntö", + "show_more": "Näytä lisää", + "title": "Jaetut pyynnöt", + "url": "URL" }, "shortcut": { "general": { "close_current_menu": "Sulje nykyinen valikko", - "command_menu": "Haku ja komento -valikko", - "help_menu": "Ohje -valikko", + "command_menu": "Haku- ja komentovalikko", + "help_menu": "Ohjevalikko", "show_all": "Pikanäppäimet", - "title": "Yleistä" + "title": "Yleiset", + "comment_uncomment": "Kommentoi/Poista kommentti", + "close_tab": "Sulje välilehti", + "undo": "Kumoa", + "redo": "Tee uudelleen" }, "miscellaneous": { "invite": "Kutsu ihmisiä Hoppscotchiin", - "title": "Sekalaisia" + "title": "Sekalaiset" }, "navigation": { - "back": "Palaa edelliselle sivulle", - "documentation": "Siirry dokumentaatiosivulle", + "back": "Siirry edelliselle sivulle", + "documentation": "Siirry Dokumentaatio-sivulle", "forward": "Siirry seuraavalle sivulle", - "graphql": "Siirry GraphQL -sivulle", - "profile": "Go to Profile page", - "realtime": "Siirry Realtime -sivulle", - "rest": "Siirry REST -sivulle", - "settings": "Siirry Asetukset -sivulle", + "graphql": "Siirry GraphQL-sivulle", + "profile": "Siirry Profiili-sivulle", + "realtime": "Siirry Reaaliaikaiset-sivulle", + "rest": "Siirry REST-sivulle", + "settings": "Siirry Asetukset-sivulle", "title": "Navigointi" }, "others": { - "prettify": "Prettify Editor's Content", - "title": "Others" + "prettify": "Muotoile editorin sisältö", + "title": "Muut" }, "request": { - "delete_method": "Valitse POISTA menetelmä", - "get_method": "Valitse GET -menetelmä", - "head_method": "Valitse HEAD -menetelmä", - "import_curl": "Import cURL", - "method": "Menetelmä", - "next_method": "Valitse Seuraava menetelmä", - "post_method": "Valitse POST -menetelmä", - "previous_method": "Valitse Edellinen menetelmä", - "put_method": "Valitse PUT -menetelmä", - "rename": "Rename Request", + "delete_method": "Valitse DELETE-metodi", + "get_method": "Valitse GET-metodi", + "head_method": "Valitse HEAD-metodi", + "import_curl": "Tuo cURL", + "method": "Metodi", + "next_method": "Valitse seuraava metodi", + "post_method": "Valitse POST-metodi", + "previous_method": "Valitse edellinen metodi", + "put_method": "Valitse PUT-metodi", + "rename": "Nimeä pyyntö uudelleen", "reset_request": "Nollaa pyyntö", - "save_request": "Save Request", + "save_request": "Tallenna pyyntö", "save_to_collections": "Tallenna kokoelmiin", "send_request": "Lähetä pyyntö", - "share_request": "Share Request", - "show_code": "Generate code snippet", + "share_request": "Jaa pyyntö", + "show_code": "Luo koodinpätkä", "title": "Pyyntö", - "copy_request_link": "Kopioi pyyntölinkki" + "focus_url": "Kohdista URL-palkkiin" }, "response": { - "copy": "Copy response to clipboard", - "download": "Download response as file", - "title": "Response" + "copy": "Kopioi vastaus leikepöydälle", + "download": "Lataa vastaus tiedostona", + "title": "Vastaus" + }, + "tabs": { + "title": "Välilehdet", + "new_tab": "Uusi välilehti", + "close_tab": "Sulje välilehti", + "reopen_tab": "Avaa suljettu välilehti uudelleen", + "next_tab": "Seuraava välilehti", + "previous_tab": "Edellinen välilehti", + "first_tab": "Vaihda ensimmäiseen välilehteen", + "last_tab": "Vaihda viimeiseen välilehteen", + "mru_switch": "Vaihda viimeksi käytettyyn välilehteen (MRU)", + "mru_switch_reverse": "Vaihda edelliseen viimeksi käytettyyn välilehteen (MRU)" }, "theme": { - "black": "Switch theme to black mode", - "dark": "Switch theme to dark mode", - "light": "Switch theme to light mode", - "system": "Switch theme to system mode", - "title": "Theme" + "black": "Vaihda teemaksi musta", + "dark": "Vaihda teemaksi tumma", + "light": "Vaihda teemaksi vaalea", + "system": "Vaihda teemaksi järjestelmä", + "title": "Teema" } }, "show": { "code": "Näytä koodi", - "collection": "Expand Collection Panel", + "collection": "Laajenna kokoelmapaneeli", "more": "Näytä lisää", - "sidebar": "Näytä sivupalkki" + "sidebar": "Laajenna sivupalkki", + "password": "Näytä salasana" }, "socketio": { "communication": "Viestintä", - "connection_not_authorized": "This SocketIO connection does not use any authentication.", - "event_name": "Tapahtuman nimi", + "connection_not_authorized": "Tämä SocketIO-yhteys ei käytä todennusta.", + "event_name": "Tapahtuman/Aiheen nimi", "events": "Tapahtumat", - "log": "Hirsi", - "url": "URL -osoite" + "log": "Loki", + "url": "URL" }, "spotlight": { - "change_language": "Change Language", + "change_language": "Vaihda kieli", "environments": { - "delete": "Delete current environment", - "duplicate": "Duplicate current environment", - "duplicate_global": "Duplicate global environment", - "edit": "Edit current environment", - "edit_global": "Edit global environment", - "new": "Create new environment", - "new_variable": "Create a new environment variable", - "title": "Environments" + "delete": "Poista nykyinen ympäristö", + "duplicate": "Kopioi nykyinen ympäristö", + "duplicate_global": "Kopioi yleinen ympäristö", + "edit": "Muokkaa nykyistä ympäristöä", + "edit_global": "Muokkaa yleistä ympäristöä", + "new": "Luo uusi ympäristö", + "new_variable": "Luo uusi ympäristömuuttuja", + "title": "Ympäristöt" }, "general": { - "chat": "Chat with support", - "help_menu": "Help and support", - "open_docs": "Read Documentation", - "open_github": "Open GitHub repository", - "open_keybindings": "Keyboard shortcuts", - "social": "Social", - "title": "General" + "chat": "Keskustele tuen kanssa", + "help_menu": "Ohje ja tuki", + "open_docs": "Lue dokumentaatio", + "open_github": "Avaa GitHub-repositorio", + "open_keybindings": "Pikanäppäimet", + "social": "Sosiaalinen media", + "title": "Yleiset" }, "graphql": { - "connect": "Connect to server", - "disconnect": "Disconnect from server" + "connect": "Yhdistä palvelimeen", + "disconnect": "Katkaise yhteys palvelimeen" }, "miscellaneous": { - "invite": "Invite your friends to Hoppscotch", - "title": "Miscellaneous" + "invite": "Kutsu ystäväsi Hoppscotchiin", + "title": "Sekalaiset" }, "request": { - "save_as_new": "Save as new request", - "select_method": "Select method", - "switch_to": "Switch to", - "tab_authorization": "Authorization tab", - "tab_body": "Body tab", - "tab_headers": "Headers tab", - "tab_parameters": "Parameters tab", - "tab_pre_request_script": "Pre-request script tab", - "tab_query": "Query tab", - "tab_tests": "Tests tab", - "tab_variables": "Variables tab" + "save_as_new": "Tallenna uutena pyyntönä", + "select_method": "Valitse metodi", + "switch_to": "Vaihda kohteeseen", + "tab_authorization": "Valtuutus-välilehti", + "tab_body": "Runko-välilehti", + "tab_headers": "Otsikot-välilehti", + "tab_parameters": "Parametrit-välilehti", + "tab_pre_request_script": "Esipyyntöskripti-välilehti", + "tab_query": "Kysely-välilehti", + "tab_tests": "Testit-välilehti", + "tab_variables": "Muuttujat-välilehti" }, "response": { - "copy": "Copy response", - "download": "Download response as file", - "title": "Response" + "copy": "Kopioi vastaus", + "download": "Lataa vastaus tiedostona", + "title": "Vastaus" }, "section": { - "interceptor": "Interceptor", - "interface": "Interface", - "theme": "Theme", - "user": "User" + "interceptor": "Sieppaaja", + "interface": "Käyttöliittymä", + "theme": "Teema", + "user": "Käyttäjä" }, "settings": { - "change_interceptor": "Change Interceptor", - "change_language": "Change Language", + "change_interceptor": "Vaihda sieppaaja", + "change_language": "Vaihda kieli", "theme": { - "black": "Black", - "dark": "Dark", - "light": "Light", - "system": "System preference" + "black": "Musta", + "dark": "Tumma", + "light": "Vaalea", + "system": "Järjestelmän asetus" } }, "tab": { - "close_current": "Close current tab", - "close_others": "Close all other tabs", - "duplicate": "Duplicate current tab", - "new_tab": "Open a new tab", - "title": "Tabs" + "close_current": "Sulje nykyinen välilehti", + "close_others": "Sulje kaikki muut välilehdet", + "duplicate": "Kopioi nykyinen välilehti", + "new_tab": "Avaa uusi välilehti", + "next": "Vaihda seuraavaan välilehteen", + "previous": "Vaihda edelliseen välilehteen", + "switch_to_first": "Vaihda ensimmäiseen välilehteen", + "switch_to_last": "Vaihda viimeiseen välilehteen", + "mru_switch": "Vaihda viimeksi käytettyyn välilehteen", + "mru_switch_reverse": "Vaihda edelliseen viimeksi käytettyyn välilehteen", + "title": "Välilehdet" }, "workspace": { - "delete": "Delete current team", - "edit": "Edit current team", - "invite": "Invite people to team", - "new": "Create new team", - "switch_to_personal": "Switch to your personal workspace", - "title": "Teams" + "delete": "Poista nykyinen työtila", + "edit": "Muokkaa nykyistä työtilaa", + "invite": "Kutsu ihmisiä työtilaan", + "new": "Luo uusi työtila", + "switch_to_personal": "Vaihda henkilökohtaiseen työtilaan", + "title": "Työtilat" }, "phrases": { - "try": "Try", - "import_collections": "Import collections", - "create_environment": "Create environment", - "create_workspace": "Create workspace", - "share_request": "Share request" + "try": "Kokeile", + "import_collections": "Tuo kokoelmat", + "create_environment": "Luo ympäristö", + "create_workspace": "Luo työtila", + "share_request": "Jaa pyyntö" } }, "sse": { "event_type": "Tapahtumatyyppi", - "log": "Hirsi", - "url": "URL -osoite" + "log": "Loki", + "url": "URL" }, "state": { - "bulk_mode": "Joukkomuokkaus", - "bulk_mode_placeholder": "Merkinnät erotetaan rivillä\nAvaimet ja arvot erotetaan toisistaan:\nEsitä # mihin tahansa riviin, jonka haluat lisätä, mutta pidä poissa käytöstä", - "cleared": "Selvitetty", + "bulk_mode": "Massamuokkaus", + "bulk_mode_placeholder": "Merkinnät erotetaan rivinvaihdolla\nAvaimet ja arvot erotetaan :\nLisää # rivin alkuun lisätäksesi mutta pitääksesi poissa käytöstä", + "cleared": "Tyhjennetty", "connected": "Yhdistetty", "connected_to": "Yhdistetty kohteeseen {name}", - "connecting_to": "Yhdistetään kohteeseen {name} ...", - "connection_error": "Failed to connect", - "connection_failed": "Connection failed", - "connection_lost": "Connection lost", - "copied_interface_to_clipboard": "Copied {language} interface type to clipboard", + "connecting_to": "Yhdistetään kohteeseen {name}...", + "connection_error": "Yhdistäminen epäonnistui", + "connection_failed": "Yhteys epäonnistui", + "connection_lost": "Yhteys katkesi", + "copied_interface_to_clipboard": "Kopioitu {language}-rajapintatyyppi leikepöydälle", "copied_to_clipboard": "Kopioitu leikepöydälle", "deleted": "Poistettu", - "deprecated": "POISTETTU", - "disabled": "Liikuntarajoitteinen", + "deprecated": "VANHENTUNUT", + "disabled": "Poistettu käytöstä", "disconnected": "Yhteys katkaistu", - "disconnected_from": "Yhteys katkaistu: {name}", + "disconnected_from": "Yhteys katkaistu kohteesta {name}", "docs_generated": "Dokumentaatio luotu", - "download_failed": "Download failed", + "download_failed": "Lataus epäonnistui", "download_started": "Lataus aloitettu", "enabled": "Käytössä", + "experimental": "Kokeellinen", "file_imported": "Tiedosto tuotu", - "finished_in": "Valmis {duration} ms", - "hide": "Hide", + "finished_in": "Valmis {duration} ms:ssä", + "hide": "Piilota", "history_deleted": "Historia poistettu", - "linewrap": "Kääri linjat", + "linewrap": "Rivitä", "loading": "Ladataan...", - "message_received": "Message: {message} arrived on topic: {topic}", - "mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}", + "message_received": "Viesti: {message} saapui aiheeseen: {topic}", + "mqtt_subscription_failed": "Jokin meni pieleen tilatessa aihetta: {topic}", + "no_content_found": "Sisältöä ei löytynyt", "none": "Ei mitään", - "nothing_found": "Mitään ei löytynyt", - "published_error": "Something went wrong while publishing msg: {topic} to topic: {message}", - "published_message": "Published message: {message} to topic: {topic}", - "reconnection_error": "Failed to reconnect", - "show": "Show", - "subscribed_failed": "Failed to subscribe to topic: {topic}", - "subscribed_success": "Successfully subscribed to topic: {topic}", - "unsubscribed_failed": "Failed to unsubscribe from topic: {topic}", - "unsubscribed_success": "Successfully unsubscribed from topic: {topic}", - "waiting_send_request": "Odottaa pyynnön lähettämistä" + "nothing_found": "Mitään ei löytynyt haulle", + "published_error": "Jokin meni pieleen julkaistaessa viestin: {topic} aiheeseen: {message}", + "published_message": "Julkaistu viesti: {message} aiheeseen: {topic}", + "reconnection_error": "Uudelleenyhdistäminen epäonnistui", + "saved": "Tallennettu", + "show": "Näytä", + "subscribed_failed": "Aiheen tilaus epäonnistui: {topic}", + "subscribed_success": "Aihe tilattu onnistuneesti: {topic}", + "unsubscribed_failed": "Aiheen tilauksen peruutus epäonnistui: {topic}", + "unsubscribed_success": "Aiheen tilaus peruutettu onnistuneesti: {topic}", + "waiting_send_request": "Odotetaan pyynnön lähettämistä", + "user_deactivated": "Tilisi on deaktivoitu. Ota yhteyttä ylläpitäjään tilin uudelleenaktivoimiseksi.", + "add_user_failure": "Käyttäjän lisääminen työtilaan epäonnistui!", + "add_user_success": "Käyttäjä on nyt työtilan jäsen!", + "admin_failure": "Käyttäjän ylläpitäjäksi tekeminen epäonnistui!", + "admin_success": "Käyttäjä on nyt ylläpitäjä!", + "and": "ja", + "clear_selection": "Tyhjennä valinta", + "configure_auth": "Määritä todennuspalveluntarjoaja ylläpitoasetuksista tai tutustu dokumentaatioon todennuspalveluntarjoajien määrittämiseksi.", + "confirm_admin_to_user": "Haluatko poistaa ylläpitäjäoikeudet tältä käyttäjältä?", + "confirm_admins_to_users": "Haluatko poistaa ylläpitäjäoikeudet valituilta käyttäjiltä?", + "confirm_delete_infra_token": "Haluatko varmasti poistaa infrastruktuuritokenin {tokenLabel}?", + "confirm_delete_invite": "Haluatko peruuttaa valitun kutsun?", + "confirm_delete_invites": "Haluatko peruuttaa valitut kutsut?", + "confirm_user_deletion": "Vahvista käyttäjän poisto?", + "confirm_users_deletion": "Haluatko poistaa valitut käyttäjät?", + "confirm_user_to_admin": "Haluatko tehdä tästä käyttäjästä ylläpitäjän?", + "confirm_users_to_admin": "Haluatko tehdä valituista käyttäjistä ylläpitäjiä?", + "confirm_user_deactivation": "Vahvista käyttäjän deaktivointi?", + "confirm_logout": "Vahvista uloskirjautuminen", + "created_on": "Luotu", + "continue_email": "Jatka sähköpostilla", + "continue_github": "Jatka Githubilla", + "continue_google": "Jatka Googlella", + "continue_microsoft": "Jatka Microsoftilla", + "create_team_failure": "Työtilan luonti epäonnistui!", + "create_team_success": "Työtila luotu onnistuneesti!", + "data_sharing_failure": "Tietojenjakamisen asetusten päivitys epäonnistui", + "delete_infra_token_failure": "Jokin meni pieleen infrastruktuuritokenin poistamisessa", + "delete_invite_failure": "Kutsun poistaminen epäonnistui!", + "delete_invites_failure": "Valittujen kutsujen poistaminen epäonnistui!", + "delete_invite_success": "Kutsu poistettu onnistuneesti!", + "delete_invites_success": "Valitut kutsut poistettu onnistuneesti!", + "delete_request_failure": "Jaetun pyynnön poistaminen epäonnistui!", + "delete_request_success": "Jaettu pyyntö poistettu onnistuneesti!", + "delete_team_failure": "Työtilan poistaminen epäonnistui!", + "delete_team_success": "Työtila poistettu onnistuneesti!", + "delete_some_users_failure": "Poistamattomien käyttäjien määrä: {count}", + "delete_some_users_success": "Poistettujen käyttäjien määrä: {count}", + "delete_user_failed_only_one_admin": "Käyttäjän poistaminen epäonnistui. Vähintään yksi ylläpitäjä on oltava!", + "delete_user_failure": "Käyttäjän poistaminen epäonnistui!", + "delete_users_failure": "Valittujen käyttäjien poistaminen epäonnistui!", + "delete_user_success": "Käyttäjä poistettu onnistuneesti!", + "delete_users_success": "Valitut käyttäjät poistettu onnistuneesti!", + "email": "Sähköposti", + "email_failure": "Kutsun lähettäminen epäonnistui", + "email_signin_failure": "Kirjautuminen sähköpostilla epäonnistui", + "email_success": "Sähköpostikutsu lähetetty onnistuneesti", + "emails_cannot_be_same": "Et voi kutsua itseäsi, valitse toinen sähköpostiosoite!", + "enter_team_email": "Syötä työtilan omistajan sähköposti!", + "error": "Jokin meni pieleen", + "error_auth_providers": "Todennuspalveluntarjoajien lataus epäonnistui", + "generate_infra_token_failure": "Jokin meni pieleen infrastruktuuritokenin luomisessa", + "github_signin_failure": "Kirjautuminen Githubilla epäonnistui", + "google_signin_failure": "Kirjautuminen Googlella epäonnistui", + "infra_token_label_short": "Infrastruktuuritokenin tunniste on liian lyhyt!", + "invalid_email": "Syötä kelvollinen sähköpostiosoite", + "link_copied_to_clipboard": "Linkki kopioitu leikepöydälle", + "logged_out": "Uloskirjautunut", + "login_as_admin": "ja kirjaudu ylläpitäjätilillä.", + "login_using_email": "Pyydä käyttäjää tarkistamaan sähköpostinsa tai jaa alla oleva linkki", + "login_using_link": "Pyydä käyttäjää kirjautumaan alla olevan linkin kautta", + "logout": "Kirjaudu ulos", + "magic_link_sign_in": "Napsauta linkkiä kirjautuaksesi sisään.", + "magic_link_success": "Lähetimme kirjautumislinkin osoitteeseen", + "microsoft_signin_failure": "Kirjautuminen Microsoftilla epäonnistui", + "newsletter_failure": "Uutiskirjeen asetusten päivitys epäonnistui", + "non_admin_logged_in": "Kirjautunut sisään ei-ylläpitäjäkäyttäjänä.", + "non_admin_login": "Olet kirjautunut sisään. Mutta et ole ylläpitäjä", + "owner_not_present": "Vähintään yhden omistajan on oltava tiimissä!", + "privacy_policy": "Tietosuojakäytäntö", + "reenter_email": "Syötä sähköposti uudelleen", + "remove_admin_failure": "Ylläpitäjäoikeuksien poistaminen epäonnistui!", + "remove_admin_failure_only_one_admin": "Ylläpitäjäoikeuksien poistaminen epäonnistui. Vähintään yksi ylläpitäjä on oltava!", + "remove_admin_success": "Ylläpitäjäoikeudet poistettu!", + "remove_admin_from_users_failure": "Ylläpitäjäoikeuksien poistaminen valituilta käyttäjiltä epäonnistui!", + "remove_admin_from_users_success": "Ylläpitäjäoikeudet poistettu valituilta käyttäjiltä!", + "remove_admin_to_delete_user": "Poista ylläpitäjäoikeudet poistaaksesi käyttäjän!", + "remove_owner_to_delete_user": "Poista tiimin omistajuus poistaaksesi käyttäjän!", + "remove_owner_failure_only_one_owner": "Jäsenen poistaminen epäonnistui. Tiimissä on oltava vähintään yksi omistaja!", + "remove_admin_for_deletion": "Poista ylläpitäjäoikeudet ennen poistoyritystä!", + "remove_owner_for_deletion": "Yksi tai useampi käyttäjä on tiimin omistaja. Päivitä omistajuus ennen poistoa!", + "remove_invitee_failure": "Kutsutun poistaminen epäonnistui!", + "remove_invitee_success": "Kutsuttu poistettu onnistuneesti!", + "remove_member_failure": "Jäsentä ei voitu poistaa!", + "remove_member_success": "Jäsen poistettu onnistuneesti!", + "rename_team_failure": "Työtilan uudelleennimeäminen epäonnistui!", + "rename_team_success": "Työtila nimetty uudelleen onnistuneesti!", + "rename_user_failure": "Käyttäjän uudelleennimeäminen epäonnistui!", + "rename_user_success": "Käyttäjä nimetty uudelleen onnistuneesti!", + "require_auth_provider": "Sinun on määritettävä vähintään yksi todennuspalveluntarjoaja kirjautumista varten.", + "role_update_failed": "Roolien päivitys epäonnistui!", + "role_update_success": "Roolit päivitetty onnistuneesti!", + "selected": "{count} valittu", + "self_host_docs": "Itse-isännöinnin dokumentaatio", + "send_magic_link": "Lähetä taikalinkki", + "setup_failure": "Määritys epäonnistui!", + "setup_success": "Määritys valmis onnistuneesti!", + "sign_in_agreement": "Kirjautumalla sisään hyväksyt", + "sign_in_options": "Kaikki kirjautumisvaihtoehdot", + "sign_out": "Kirjaudu ulos", + "something_went_wrong": "Jokin meni pieleen", + "team_name_too_short": "Työtilan nimen on oltava vähintään 6 merkkiä pitkä!", + "user_already_invited": "Kutsun lähettäminen epäonnistui. Käyttäjä on jo kutsuttu!", + "user_not_found": "Käyttäjää ei löytynyt infrastruktuurista!", + "users_to_admin_success": "Valitut käyttäjät korotettu ylläpitäjäksi!", + "users_to_admin_failure": "Valittujen käyttäjien korottaminen ylläpitäjäksi epäonnistui!", + "loading_workspaces": "Ladataan työtiloja", + "loading_collections_in_workspace": "Ladataan kokoelmia työtilassa" }, "support": { - "changelog": "Lue lisää uusimmista julkaisuista", - "chat": "Kysymyksiä? Juttele kanssamme!", - "community": "Esitä kysymyksiä ja auta muita", + "changelog": "Lue lisää viimeisimmistä julkaisuista", + "chat": "Kysyttävää? Keskustele kanssamme!", + "community": "Kysy kysymyksiä ja auta muita", "documentation": "Lue lisää Hoppscotchista", - "forum": "Esitä kysymyksiä ja saat vastauksia", - "github": "Follow us on Github", + "forum": "Kysy kysymyksiä ja saa vastauksia", + "github": "Seuraa meitä Githubissa", "shortcuts": "Selaa sovellusta nopeammin", "title": "Tuki", - "twitter": "Seuraa meitä Twitterissä", - "team": "Ota yhteyttä tiimiin" + "twitter": "Seuraa meitä Twitterissä" }, "tab": { "authorization": "Valtuutus", "body": "Runko", - "close": "Close Tab", - "close_others": "Close other Tabs", + "close": "Sulje välilehti", + "close_others": "Sulje muut välilehdet", "collections": "Kokoelmat", - "documentation": "Dokumentointi", - "duplicate": "Duplicate Tab", - "environments": "Environments", + "documentation": "Dokumentaatio", + "duplicate": "Kopioi välilehti", + "environments": "Ympäristöt", "headers": "Otsikot", "history": "Historia", "mqtt": "MQTT", "parameters": "Parametrit", - "pre_request_script": "Esipyynnön skripti", + "post_request_script": "Jälkipyyntöskripti", + "pre_request_script": "Esipyyntöskripti", + "scripts": "Skriptit", "queries": "Kyselyt", "query": "Kysely", - "schema": "Schema", - "shared_requests": "Shared Requests", - "codegen": "Generate Code", - "code_snippet": "Code snippet", - "share_tab_request": "Share tab request", - "socketio": "Pistorasia.IO", + "schema": "Skeema", + "shared_requests": "Jaetut pyynnöt", + "codegen": "Luo koodi", + "code_snippet": "Koodinpätkä", + "mock_servers": "Mock-palvelimet", + "share_tab_request": "Jaa välilehden pyyntö", + "socketio": "Socket.IO", "sse": "SSE", - "tests": "Testit", "types": "Tyypit", "variables": "Muuttujat", - "websocket": "WebSocket" + "websocket": "WebSocket", + "all_tests": "Kaikki testit", + "passed": "Läpäisty", + "failed": "Epäonnistunut" }, "team": { - "already_member": "You are already a member of this team. Contact your team owner.", - "create_new": "Luo uusi tiimi", - "deleted": "Joukkue poistettu", - "edit": "Muokkaa tiimiä", + "activity_logs": "Toimintalokit", + "already_member": "Tämä sähköposti on yhdistetty olemassa olevaan käyttäjään.", + "create_new": "Luo uusi työtila", + "deleted": "Työtila poistettu", + "delete_all_activity_logs": "Poista kaikki toimintalokit", + "successfully_deleted_all_activity_logs": "Kaikki toimintalokit poistettu onnistuneesti", + "delete_activity_log": "Poista toimintaloki", + "deleted_activity_log": "Valittu toimintaloki poistettu", + "deleted_all_activity_logs": "Kaikki toimintalokit poistettu", + "edit": "Muokkaa työtilaa", "email": "Sähköposti", - "email_do_not_match": "Email doesn't match with your account details. Contact your team owner.", - "exit": "Poistu tiimistä", - "exit_disabled": "Vain omistaja ei voi poistua tiimistä", - "failed_invites": "Failed invites", - "invalid_coll_id": "Invalid collection ID", - "invalid_email_format": "Sähköpostin muoto on virheellinen", - "invalid_id": "Invalid team ID. Contact your team owner.", - "invalid_invite_link": "Invalid invite link", - "invalid_invite_link_description": "The link you followed is invalid. Contact your team owner.", - "invalid_member_permission": "Anna voimassa oleva lupa tiimin jäsenelle", - "invite": "Invite", - "invite_more": "Invite more", - "invite_tooltip": "Invite people to this workspace", - "invited_to_team": "{owner} invited you to join {team}", - "join": "Invitation accepted", - "join_team": "Join {team}", - "joined_team": "You have joined {team}", - "joined_team_description": "You are now a member of this team", - "left": "Jätit joukkueen", - "login_to_continue": "Login to continue", - "login_to_continue_description": "You need to be logged in to join a team.", - "logout_and_try_again": "Logout and sign in with another account", - "member_has_invite": "This email ID already has an invite. Contact your team owner.", - "member_not_found": "Member not found. Contact your team owner.", + "email_do_not_match": "Sähköposti ei vastaa tilitietojasi. Ota yhteyttä työtilan omistajaan.", + "exit": "Poistu työtilasta", + "exit_disabled": "Ainoa omistaja ei voi poistua työtilasta", + "failed_invites": "Epäonnistuneet kutsut", + "invalid_coll_id": "Virheellinen kokoelmatunnus", + "invalid_email_format": "Sähköpostimuoto on virheellinen", + "invalid_id": "Virheellinen työtilatunnus. Ota yhteyttä työtilan omistajaan.", + "invalid_invite_link": "Virheellinen kutsulinkki", + "invalid_invite_link_description": "Seuraamasi linkki on virheellinen. Ota yhteyttä työtilan omistajaan.", + "invalid_member_permission": "Anna kelvollinen oikeus työtilan jäsenelle", + "invite": "Kutsu", + "invite_more": "Kutsu lisää", + "invite_tooltip": "Kutsu ihmisiä tähän työtilaan", + "invited_to_team": "{owner} kutsui sinut liittymään työtilaan {workspace}", + "join": "Kutsu hyväksytty", + "join_team": "Liity työtilaan {workspace}", + "joined_team": "Olet liittynyt työtilaan {workspace}", + "joined_team_description": "Olet nyt tämän työtilan jäsen", + "left": "Poistuit työtilasta", + "login_to_continue": "Kirjaudu jatkaaksesi", + "login_to_continue_description": "Sinun on kirjauduttava sisään liittyäksesi työtilaan.", + "logout_and_try_again": "Kirjaudu ulos ja kirjaudu sisään toisella tilillä", + "member_has_invite": "Käyttäjällä on jo kutsu. Pyydä häntä tarkistamaan sähköpostinsa tai peruuta ja lähetä kutsu uudelleen.", + "member_not_found": "Jäsentä ei löytynyt. Ota yhteyttä työtilan omistajaan.", "member_removed": "Käyttäjä poistettu", - "member_role_updated": "Käyttäjäroolit päivitetty", + "member_role_updated": "Käyttäjän roolit päivitetty", "members": "Jäsenet", - "more_members": "+{count} more", - "name_length_insufficient": "Joukkueen nimen tulee olla vähintään 6 merkkiä pitkä", - "name_updated": "Team name updated", - "new": "Uusi tiimi", - "new_created": "Uusi tiimi luotu", - "new_name": "Uusi tiimini", - "no_access": "Sinulla ei ole muokkausoikeuksia näihin kokoelmiin", - "no_invite_found": "Invitation not found. Contact your team owner.", - "no_request_found": "Request not found.", - "not_found": "Team not found. Contact your team owner.", - "not_valid_viewer": "You are not a valid viewer. Contact your team owner.", - "parent_coll_move": "Cannot move collection to a child collection", - "pending_invites": "Pending invites", - "permissions": "Käyttöoikeudet", - "same_target_destination": "Same target and destination", - "saved": "Joukkue tallennettu", - "select_a_team": "Select a team", - "success_invites": "Success invites", - "title": "Joukkueet", - "we_sent_invite_link": "We sent an invite link to all invitees!", - "invite_sent_smtp_disabled": "Invite links generated", - "we_sent_invite_link_description": "Ask all invitees to check their inbox. Click on the link to join the team.", - "invite_sent_smtp_disabled_description": "Sending invite emails is disabled for this instance of Hoppscotch. Please use the Copy link button to copy and share the invite link manually.", - "copy_invite_link": "Copy Invite Link", - "search_title": "Team Requests", - "join_beta": "Liity beta -ohjelmaan päästäksesi tiimeihin." + "more_members": "+{count} lisää", + "name_length_insufficient": "Työtilan nimi ei saa olla tyhjä", + "name_updated": "Työtilan nimi päivitetty", + "new": "Uusi työtila", + "new_created": "Uusi työtila luotu", + "new_name": "Uusi työtilani", + "no_access": "Sinulla ei ole muokkausoikeutta tähän työtilaan", + "no_invite_found": "Kutsua ei löytynyt. Ota yhteyttä työtilan omistajaan.", + "no_request_found": "Pyyntöä ei löytynyt.", + "not_found": "Työtilaa ei löytynyt. Ota yhteyttä työtilan omistajaan.", + "not_valid_viewer": "Et ole kelvollinen katsoja. Ota yhteyttä työtilan omistajaan.", + "parent_coll_move": "Kokoelmaa ei voi siirtää alikokoelmaan", + "pending_invites": "Odottavat kutsut", + "permissions": "Oikeudet", + "same_target_destination": "Sama kohde ja määränpää", + "saved": "Työtila tallennettu", + "select_a_team": "Valitse työtila", + "success_invites": "Onnistuneet kutsut", + "title": "Työtilat", + "we_sent_invite_link": "Kutsut ovat matkalla", + "invite_sent_smtp_disabled": "Kutsulinkit luotu", + "we_sent_invite_link_description": "Uudet kutsutut saavat linkin työtilaan liittymiseksi, olemassa olevat jäsenet ja odottavat kutsutut eivät saa uutta linkkiä.", + "invite_sent_smtp_disabled_description": "Kutsusähköpostien lähettäminen on poistettu käytöstä tässä Hoppscotch-instanssissa. Käytä Kopioi linkki -painiketta kopioidaksesi ja jakaaksesi kutsulinkin manuaalisesti.", + "copy_invite_link": "Kopioi kutsulinkki", + "search_title": "Tiimipyynnöt", + "user_not_found": "Käyttäjää ei löytynyt instanssista.", + "invite_members": "Kutsu jäseniä" }, "team_environment": { - "deleted": "Environment Deleted", - "duplicate": "Environment Duplicated", - "not_found": "Environment not found." + "deleted": "Ympäristö poistettu", + "duplicate": "Ympäristö kopioitu", + "not_found": "Ympäristöä ei löytynyt." }, "test": { - "failed": "test failed", - "javascript_code": "JavaScript -koodi", + "requests": "Pyynnöt", + "selection": "Valinta", + "failed": "testi epäonnistui", + "javascript_code": "JavaScript-koodi", "learn": "Lue dokumentaatio", - "passed": "test passed", + "passed": "testi läpäisty", "report": "Testiraportti", "results": "Testitulokset", - "script": "Käsikirjoitus", - "snippets": "Katkelmat" + "script": "Skripti", + "snippets": "Koodinpätkät", + "run": "Suorita", + "run_again": "Suorita uudelleen", + "stop": "Pysäytä", + "new_run": "Uusi suoritus", + "iterations": "Iteraatiot", + "duration": "Kesto", + "avg_resp": "Keskim. vasteaika" }, "websocket": { "communication": "Viestintä", - "log": "Hirsi", + "log": "Loki", "message": "Viesti", - "protocols": "Pöytäkirjat", - "url": "URL -osoite" + "protocols": "Protokollat", + "url": "URL" }, "workspace": { - "change": "Change workspace", - "personal": "My Workspace", - "other_workspaces": "My Workspaces", - "team": "Team Workspace", - "title": "Workspaces" + "change": "Vaihda työtilaa", + "personal": "Henkilökohtainen työtila", + "other_workspaces": "Omat työtilat", + "team": "Työtila", + "title": "Työtilat" }, "site_protection": { - "login_to_continue": "Login to continue", - "login_to_continue_description": "You need to be logged in to access this Hoppscotch Enterprise Instance.", - "error_fetching_site_protection_status": "Something Went Wrong While Fetching Site Protection Status" + "login_to_continue": "Kirjaudu jatkaaksesi", + "login_to_continue_description": "Sinun on kirjauduttava sisään käyttääksesi tätä Hoppscotch Enterprise -instanssia.", + "error_fetching_site_protection_status": "Jokin meni pieleen sivuston suojaustilan haussa" }, "access_tokens": { - "tab_title": "Tokens", - "section_title": "Personal Access Tokens", - "section_description": "Personal access tokens currently helps you connect the CLI to your Hoppscotch account", - "last_used_on": "Last used on", - "expires_on": "Expires on", - "no_expiration": "No expiration", - "expired": "Expired", - "copy_token_warning": "Make sure to copy your personal access token now. You won't be able to see it again!", - "token_purpose": "What's this token for?", - "expiration_label": "Expiration", - "scope_label": "Scope", - "workspace_read_only_access": "Read-only access to workspace data.", - "personal_workspace_access_limitation": "Personal Access Tokens can't access your personal workspace.", - "generate_token": "Generate Token", - "invalid_label": "Please provide a label for the token", - "no_expiration_verbose": "This token will never expire!", - "token_expires_on": "This token will expire on", - "generate_new_token": "Generate new token", - "generate_modal_title": "New Personal Access Token", - "deletion_success": "The access token {label} has been deleted" + "tab_title": "Tokenit", + "section_title": "Henkilökohtaiset käyttöoikeustokenit", + "section_description": "Henkilökohtaiset käyttöoikeustokenit auttavat yhdistämään CLI:n Hoppscotch-tiliisi", + "last_used_on": "Viimeksi käytetty", + "expires_on": "Vanhenee", + "no_expiration": "Ei vanhene", + "expired": "Vanhentunut", + "copy_token_warning": "Muista kopioida henkilökohtainen käyttöoikeustokenisi nyt. Et voi nähdä sitä enää myöhemmin!", + "token_purpose": "Mihin tämä token on?", + "expiration_label": "Voimassaolo", + "scope_label": "Laajuus", + "workspace_read_only_access": "Vain luku -oikeus työtilan tietoihin.", + "personal_workspace_access_limitation": "Henkilökohtaiset käyttöoikeustokenit eivät voi käyttää henkilökohtaista työtilaasi.", + "generate_token": "Luo token", + "invalid_label": "Anna tokenille tunniste", + "no_expiration_verbose": "Tämä token ei koskaan vanhene!", + "token_expires_on": "Tämä token vanhenee", + "generate_new_token": "Luo uusi token", + "generate_modal_title": "Uusi henkilökohtainen käyttöoikeustoken", + "deletion_success": "Käyttöoikeustoken {label} on poistettu" }, "collection_runner": { - "collection_id": "Collection ID", - "environment_id": "Environment ID", - "cli_collection_id_description": "This collection ID will be used by the CLI collection runner for Hoppscotch.", - "cli_environment_id_description": "This environment ID will be used by the CLI collection runner for Hoppscotch.", - "include_active_environment": "Include active environment:", + "collection_id": "Kokoelmatunnus", + "environment_id": "Ympäristötunnus", + "cli_collection_id_description": "Tätä kokoelmatunnusta käytetään Hoppscotchin CLI-kokoelmien suorittajassa.", + "cli_environment_id_description": "Tätä ympäristötunnusta käytetään Hoppscotchin CLI-kokoelmien suorittajassa.", + "include_active_environment": "Sisällytä aktiivinen ympäristö:", "cli": "CLI", - "ui": "Runner (coming soon)", - "cli_command_generation_description_cloud": "Copy the below command and run it from the CLI. Please specify a personal access token.", - "cli_command_generation_description_sh": "Copy the below command and run it from the CLI. Please specify a personal access token and verify the generated SH instance server URL.", - "cli_command_generation_description_sh_with_server_url_placeholder": "Copy the below command and run it from the CLI. Please specify a personal access token and the SH instance server URL.", - "run_collection": "Run collection" - }, - "shortcodes": { - "actions": "Actions", - "created_on": "Created on", - "deleted": "Shortcode deleted", - "method": "Method", - "not_found": "Shortcode not found", - "short_code": "Short code", - "url": "URL" + "cli_comming_soon_for_personal_collection": "Kokoelmien suorittaja henkilökohtaisille kokoelmille CLI:ssä tulossa pian.", + "delay": "Viive", + "negative_delay": "Viive ei voi olla negatiivinen", + "ui": "Suorittaja", + "running_collection": "Suoritetaan kokoelmaa", + "run_config": "Suorituksen asetukset", + "advanced_settings": "Lisäasetukset", + "stop_on_error": "Pysäytä suoritus virheen sattuessa", + "persist_responses": "Säilytä vastaukset", + "keep_variable_values": "Säilytä muuttujien arvot", + "collection_not_found": "Kokoelmaa ei löytynyt. Se on ehkä poistettu tai siirretty.", + "empty_collection": "Kokoelma on tyhjä. Lisää pyyntöjä suorittaaksesi.", + "no_response_persist": "Kokoelmien suorittaja on tällä hetkellä määritetty olemaan säilyttämättä vastauksia. Tämä asetus estää vastaustietojen näyttämisen. Muuttaaksesi tätä käyttäytymistä, aloita uusi suorituksen määritys.", + "select_request": "Valitse pyyntö nähdäksesi vastauksen ja testitulokset", + "response_body_lost_rerun": "Vastauksen runko on menetetty. Suorita kokoelma uudelleen saadaksesi vastauksen rungon.", + "cli_command_generation_description_cloud": "Kopioi alla oleva komento ja suorita se CLI:stä. Määritä henkilökohtainen käyttöoikeustoken.", + "cli_command_generation_description_sh": "Kopioi alla oleva komento ja suorita se CLI:stä. Määritä henkilökohtainen käyttöoikeustoken ja tarkista luotu SH-instanssin palvelin-URL.", + "cli_command_generation_description_sh_with_server_url_placeholder": "Kopioi alla oleva komento ja suorita se CLI:stä. Määritä henkilökohtainen käyttöoikeustoken ja SH-instanssin palvelin-URL.", + "run_collection": "Suorita kokoelma", + "no_passed_tests": "Yksikään testi ei läpäissyt", + "no_failed_tests": "Yksikään testi ei epäonnistunut" + }, + "ai_experiments": { + "generate_request_name": "Luo pyynnön nimi tekoälyn avulla", + "generate_or_modify_request_body": "Luo tai muokkaa pyynnön runkoa", + "modify_with_ai": "Muokkaa tekoälyllä", + "generate": "Luo", + "generate_or_modify_request_body_input_placeholder": "Syötä kehote pyynnön rungon muokkaamiseksi", + "accept_change": "Hyväksy muutos", + "feedback_success": "Palaute lähetetty onnistuneesti", + "feedback_failure": "Palautteen lähettäminen epäonnistui", + "feedback_thank_you": "Kiitos palautteestasi!", + "feedback_cta_text_long": "Arvioi luonti, auttaa meitä parantamaan", + "feedback_cta_request_name": "Piditkö luodusta nimestä?", + "modify_request_body_error": "Pyynnön rungon muokkaus epäonnistui", + "generate_or_modify_prerequest_input_placeholder": "Syötä kehote esipyyntöskriptin luomiseksi tai muokkaamiseksi", + "generate_or_modify_post_request_script_input_placeholder": "Syötä kehote jälkipyyntöskriptin luomiseksi tai muokkaamiseksi", + "modify_post_request_script_error": "Jälkipyyntöskriptin muokkaus epäonnistui", + "modify_prerequest_error": "Esipyyntöskriptin muokkaus epäonnistui" + }, + "configs": { + "auth_providers": { + "callback_url": "TAKAISINKUTSU-URL", + "client_id": "ASIAKASTUNNUS", + "client_secret": "ASIAKASSALAISUUS", + "description": "Määritä todennuspalveluntarjoajat palvelimellesi", + "provider_not_specified": "Ota käyttöön vähintään yksi todennuspalveluntarjoaja", + "scope": "LAAJUUS", + "tenant": "TENANT-TUNNUS", + "title": "Todennuspalveluntarjoajat", + "update_failure": "Todennuspalveluntarjoajien määritysten päivitys epäonnistui!" + }, + "confirm_changes": "Hoppscotch-palvelin on käynnistettävä uudelleen uusien muutosten voimaantulemiseksi. Vahvista palvelinmäärityksiin tehdyt muutokset?", + "input_empty": "Täytä kaikki kentät ennen määritysten päivittämistä", + "data_sharing": { + "title": "Tietojen jakaminen", + "description": "Auta parantamaan Hoppscotchia jakamalla anonyymiä tietoja", + "enable": "Ota tietojen jakaminen käyttöön", + "secondary_title": "Tietojenjakamisen asetukset", + "see_shared": "Katso mitä jaetaan", + "toggle_description": "Jaa anonyymiä tietoja", + "update_failure": "Tietojenjakamisen asetusten päivitys epäonnistui!" + }, + "load_error": "Palvelinmääritysten lataus epäonnistui", + "mail_configs": { + "address_from": "LÄHETTÄJÄN OSOITE", + "custom_smtp_configs": "Käytä mukautettuja SMTP-asetuksia", + "description": "Määritä SMTP-asetukset", + "enable_email_auth": "Ota sähköpostipohjainen todennus käyttöön", + "enable_smtp": "Ota SMTP käyttöön", + "host": "SÄHKÖPOSTIPALVELIMEN OSOITE", + "password": "SÄHKÖPOSTIN SALASANA", + "port": "SÄHKÖPOSTIN PORTTI", + "secure": "SUOJATTU SÄHKÖPOSTI", + "smtp_url": "SMTP-URL", + "tls_reject_unauthorized": "TLS REJECT UNAUTHORIZED", + "title": "SMTP-asetukset", + "toggle_failure": "SMTP:n käyttöönoton vaihto epäonnistui!", + "update_failure": "SMTP-asetusten päivitys epäonnistui!", + "user": "SÄHKÖPOSTIN KÄYTTÄJÄ" + }, + "reset": { + "confirm_reset": "Hoppscotch-palvelin on käynnistettävä uudelleen uusien muutosten voimaantulemiseksi. Vahvista palvelinmääritysten nollaus?", + "description": "Oletusmääritykset ladataan ympäristötiedostossa määritetyllä tavalla", + "failure": "Määritysten nollaus epäonnistui!", + "title": "Nollaa määritykset", + "info": "Nollaa palvelinmääritykset" + }, + "restart": { + "description": "{duration} sekuntia jäljellä ennen kuin sivu latautuu automaattisesti", + "initiate": "Käynnistetään palvelinta uudelleen...", + "title": "Palvelin käynnistyy uudelleen" + }, + "save_changes": "Tallenna muutokset", + "title": "Määritykset", + "update_failure": "Palvelinmääritysten päivitys epäonnistui", + "restrict_access": "Rajoita pääsyä", + "site_protection": { + "control_access": "Hallitse kuka voi käyttää Hoppscotch-sovellusta", + "description": "Mukauta miten vierailijat pääsevät Hoppscotch-sovellukseesi sivuston suojausasetuksilla.", + "enable": "Ota sivuston suojaus käyttöön", + "note": "Hoppscotch-sovellukseen saapuvat käyttäjät näkevät kirjautumissivun, pakollinen kirjautuminen vaaditaan sovelluksen käyttämiseksi. Ylläpitäjän hyväksyntä vaaditaan edelleen valtuutukseen", + "update_failure": "Sivuston suojausasetusten päivitys epäonnistui!" + }, + "domain_whitelisting": { + "add_domain": "Lisää uusi verkkotunnus", + "description": "Käyttäjät, joiden sähköposti on rekisteröity sallituissa verkkotunnuksissa, eivät tarvitse erillistä ylläpitäjän hyväksyntää Hoppscotch-sovelluksen käyttämiseksi", + "enable": "Ota verkkotunnusten sallimislista käyttöön", + "enter_domain": "Syötä verkkotunnus", + "title": "Sallitut verkkotunnukset", + "toggle_failure": "Verkkotunnusten sallimislistan vaihto epäonnistui", + "update_failure": "Verkkotunnusten sallimislistan asetusten päivitys epäonnistui!" + }, + "oidc_configs": { + "auth_url": "Todennus-URL", + "callback_url": "Takaisinkutsu-URL", + "client_id": "Asiakastunnus", + "client_secret": "Asiakassalaisuus", + "description": "Määritä OIDC-asetukset", + "enable": "Ota OIDC-pohjainen todennus käyttöön", + "issuer": "Myöntäjä", + "provider_name": "Palveluntarjoajan nimi", + "scope": "Laajuus", + "title": "OIDC-asetukset", + "token_url": "Token-URL", + "update_failure": "OIDC-asetusten päivitys epäonnistui!", + "user_info_url": "Käyttäjätietojen URL" + }, + "saml": { + "audience": "Yleisö", + "callback_url": "Takaisinkutsu-URL", + "certificate": "Sertifikaatti", + "description": "Määritä SAML-asetukset", + "enable": "Ota SAML-pohjainen todennus käyttöön", + "entry_point": "Aloituspiste", + "issuer": "Myöntäjä", + "title": "SAML-asetukset", + "update_failure": "SAML SSO -asetusten päivitys epäonnistui!", + "want_assertions_signed": "Allekirjoita väitteet", + "want_response_signed": "Allekirjoita vastaus" + } + }, + "data_sharing": { + "description": "Jaa anonyynejä käyttötietoja Hoppscotchin parantamiseksi", + "enable": "Ota tietojen jakaminen käyttöön", + "see_shared": "Katso mitä jaetaan", + "toggle_description": "Jaa tietoja ja tee Hoppscotchista parempi", + "title": "Tee Hoppscotchista parempi", + "welcome": "Tervetuloa" + }, + "infra_tokens": { + "copy_token_warning": "Muista kopioida infrastruktuuritokenisi nyt. Et voi nähdä sitä enää myöhemmin!", + "deletion_success": "Infrastruktuuritoken {label} on poistettu", + "empty": "Infrastruktuuritokeneita ei ole", + "expired": "Vanhentunut", + "expiration_label": "Voimassaolo", + "expires_on": "Vanhenee", + "generate_modal_title": "Uusi infrastruktuuritoken", + "generate_new_token": "Luo uusi token", + "generate_token": "Luo token", + "invalid_label": "Anna tokenille tunniste", + "last_used_on": "Viimeksi käytetty", + "no_expiration": "Ei vanhene", + "no_expiration_verbose": "Tämä token ei koskaan vanhene!", + "section_description": "Hallitse Hoppscotch-käyttäjiä API:en kautta infrastruktuuritokeneilla", + "section_title": "Infrastruktuuritokenit", + "tab_title": "Infrastruktuuritokenit", + "token_expires_on": "Tämä token vanhenee", + "token_purpose": "Syötä tunniste tämän tokenin tunnistamiseksi" + }, + "metrics": { + "dashboard": "Hallintapaneeli", + "no_metrics": "Mittareita ei löytynyt", + "total_collections": "Kokoelmia yhteensä", + "total_requests": "Pyyntöjä yhteensä", + "total_teams": "Työtiloja yhteensä", + "total_users": "Käyttäjiä yhteensä" + }, + "newsletter": { + "description": "Saa päivityksiä viimeisimmistä uutisistamme", + "subscribe": "Tilaa", + "title": "Pysy ajan tasalla", + "toggle_description": "Saa päivityksiä Hoppscotchin viimeisimmistä uutisista", + "unsubscribe": "Peruuta tilaus" + }, + "teams": { + "add_member": "Lisää jäsen", + "add_members": "Lisää jäseniä", + "add_new": "Lisää uusi", + "admin": "Ylläpitäjä", + "admin_Email": "Ylläpitäjän sähköposti", + "admin_id": "Ylläpitäjän ID", + "cancel": "Peruuta", + "confirm_team_deletion": "Vahvista työtilan poisto?", + "copy": "Kopioi", + "create_team": "Luo työtila", + "date": "Päivämäärä", + "delete_team": "Poista työtila", + "details": "Tiedot", + "edit": "Muokkaa", + "editor": "MUOKKAAJA", + "editor_description": "Muokkaajat voivat lisätä, muokata ja poistaa pyyntöjä ja kokoelmia.", + "email": "Työtilan omistajan sähköposti", + "email_address": "Sähköpostiosoite", + "email_title": "Sähköposti", + "empty_name": "Tiimin nimi ei voi olla tyhjä!", + "error": "Jokin meni pieleen. Yritä myöhemmin uudelleen.", + "id": "Työtilan ID", + "invited_email": "Kutsutun sähköposti", + "invited_on": "Kutsuttu", + "invites": "Kutsut", + "load_info_error": "Työtilan tietojen lataus epäonnistui", + "load_list_error": "Työtilalistan lataus epäonnistui", + "members": "Jäsenmäärä", + "no_invite": "Ei kutsuja", + "no_invite_description": "Kutsu tiimisi aloittamaan yhteistyö", + "owner": "OMISTAJA", + "owner_description": "Omistajat voivat lisätä, muokata ja poistaa pyyntöjä, kokoelmia ja työtilan jäseniä.", + "permissions": "Oikeudet", + "name": "Työtilan nimi", + "no_members": "Tässä työtilassa ei ole jäseniä. Lisää jäseniä aloittaaksesi yhteistyön", + "no_pending_invites": "Ei odottavia kutsuja", + "no_teams": "Työtiloja ei löytynyt..", + "no_teams_description": "Luo työtila aloittaaksesi yhteistyön tiimisi kanssa", + "pending_invites": "Odottavat kutsut", + "roles": "Roolit", + "roles_description": "Rooleja käytetään jaettujen kokoelmien pääsynhallintaan.", + "remove": "Poista", + "rename": "Nimeä uudelleen", + "save": "Tallenna", + "save_changes": "Tallenna muutokset", + "send_invite": "Lähetä kutsu", + "show_more": "Näytä lisää", + "team_details": "Työtilan tiedot", + "team_members": "Jäsenet", + "team_members_tab": "Työtilan jäsenet", + "teams": "Työtila", + "uid": "UID", + "unnamed": "(Nimetön työtila)", + "viewer": "KATSOJA", + "viewer_description": "Katsojat voivat vain tarkastella ja käyttää pyyntöjä", + "valid_name": "Syötä kelvollinen työtilan nimi", + "valid_owner_email": "Syötä kelvollinen omistajan sähköpostiosoite" + }, + "users": { + "add_user": "Lisää käyttäjä", + "admin": "Ylläpitäjä", + "admin_id": "Ylläpitäjän ID", + "cancel": "Peruuta", + "created_on": "Luotu", + "copy_invite_link": "Kopioi kutsulinkki", + "copy_link": "Kopioi linkki", + "date": "Päivämäärä", + "delete": "Poista", + "delete_user": "Poista käyttäjä", + "delete_users": "Poista käyttäjät", + "details": "Tiedot", + "edit": "Muokkaa", + "email": "Sähköposti", + "email_address": "Sähköpostiosoite", + "empty_name": "Nimi ei voi olla tyhjä!", + "id": "Käyttäjätunnus", + "invalid_user": "Virheellinen käyttäjä", + "invite_load_list_error": "Kutsuttujen käyttäjien listan lataus epäonnistui", + "invite_user": "Kutsu käyttäjä", + "invited_by": "Kutsujan", + "invited_on": "Kutsuttu", + "invited_users": "Kutsutut käyttäjät", + "invitee_email": "Kutsutun sähköposti", + "last_active_on": "Viimeksi aktiivinen", + "load_info_error": "Käyttäjätietojen lataus epäonnistui", + "load_list_error": "Käyttäjälistan lataus epäonnistui", + "make_admin": "Tee ylläpitäjäksi", + "name": "Nimi", + "new_user_added": "Uusi käyttäjä lisätty", + "no_invite": "Ei odottavia kutsuja", + "no_invite_description": "Ei odottavia kutsuja! Aloita tiimiläistesi kutsuminen Hoppscotchiin", + "no_shared_requests": "Käyttäjä ei ole luonut jaettuja pyyntöjä", + "no_users": "Käyttäjiä ei löytynyt", + "not_available": "Ei saatavilla", + "not_found": "Käyttäjää ei löytynyt", + "pending_invites": "Odottavat kutsut", + "remove_admin_privilege": "Poista ylläpitäjäoikeus", + "remove_admin_status": "Poista ylläpitäjätila", + "rename": "Nimeä uudelleen", + "revoke_invitation": "Peruuta kutsu", + "searchbar_placeholder": "Hae nimellä tai sähköpostilla..", + "send_invite": "Lähetä kutsu", + "show_more": "Näytä lisää", + "uid": "UID", + "unnamed": "(Nimetön käyttäjä)", + "user_not_found": "Käyttäjää ei löytynyt infrastruktuurista!", + "users": "Käyttäjät", + "valid_email": "Syötä kelvollinen sähköpostiosoite", + "deactivate": "Deaktivoi", + "deactivate_user": "Deaktivoi käyttäjä" + }, + "organization": { + "login_to_continue_description": "Sinun on kirjauduttava sisään liittyäksesi organisaation instanssiin.", + "create_an_organization": "Luo organisaatio", + "deactivate_user_failure": "Käyttäjän deaktivointi epäonnistui!", + "deactivate_user_success": "Käyttäjä deaktivoitu onnistuneesti!", + "delete_account_description": "Tämä poistaa kaikki Hoppscotch-tiliisi liittyvät tiedot, mukaan lukien tämän ja kaikki muut organisaatiot joissa olet jäsenenä.", + "delete_account": "Poista Hoppscotch-tili", + "user_deletion_failed_sole_admin": "Käyttäjä on yhden tai useamman organisaation instanssin ainoa ylläpitäjä. Alenna käyttäjä ennen poistoyritystä.", + "user_deletion_failed_sole_team_owner": "Käyttäjä on yhden tai useamman organisaation instanssin ainoa tiimin omistaja. Siirrä omistajuus tai poista asiaankuuluvat työtilat ennen poistoyritystä.", + "no_organizations": "Et ole minkään organisaation jäsen", + "admin": "Ylläpitäjä" + }, + "organization_sidebar": { + "hoppscotch_cloud": "Hoppscotch Cloud", + "cloud_locked": "Oletusinstanssia ei voi poistaa", + "admin": "Ylläpitäjä", + "error_loading": "Organisaatioiden lataus epäonnistui", + "inactive_orgs": "Epäaktiiviset organisaatiot", + "no_orgs_found": "Organisaatioita ei löytynyt", + "no_active_orgs_found": "Aktiivisia organisaatioita ei löytynyt", + "organizations_for": "Organisaatiot käyttäjälle {email}", + "multi_account_notice": "Jokainen organisaatio pitää oman kirjautumisensa, käyttäen viimeksi käytettyä tiliä.", + "inactive_orgs_tooltip": "Ota yhteyttä tukeen avun saamiseksi." + }, + "billing": { + "confirm": { + "update_seat_count": "Haluatko varmasti päivittää paikkamäärän arvoon {newSeatCount}?", + "update_billing_cycle": "Haluatko varmasti päivittää laskutusjakson arvoon {newBillingCycle}?" + }, + "cancel_subscription": "Peruuta tilaus" + }, + "app_console": { + "entries": "Konsolimerkinnät", + "no_entries": "Ei merkintöjä" + }, + "mockServer": { + "create_modal": { + "title": "Luo mock-palvelin", + "name_label": "Mock-palvelimen nimi", + "name_placeholder": "Syötä mock-palvelimen nimi", + "name_required": "Mock-palvelimen nimi on pakollinen", + "collection_source_label": "Kokoelman lähde", + "existing_collection": "Olemassa oleva kokoelma", + "new_collection": "Uusi kokoelma", + "select_collection_label": "Valitse kokoelma", + "select_collection_placeholder": "Valitse kokoelma", + "collection_required": "Valitse kokoelma", + "collection_name_label": "Kokoelman nimi", + "collection_name_placeholder": "Syötä kokoelman nimi", + "collection_name_required": "Kokoelman nimi on pakollinen", + "request_config_label": "Pyynnön asetukset", + "add_request": "Lisää pyyntö", + "create_button": "Luo mock-palvelin", + "success": "Mock-palvelin luotu onnistuneesti", + "error": "Mock-palvelimen luonti epäonnistui", + "no_collections": "Kokoelmia ei saatavilla" + }, + "edit_modal": { + "title": "Muokkaa mock-palvelinta", + "name_label": "Mock-palvelimen nimi", + "name_placeholder": "Syötä mock-palvelimen nimi", + "name_required": "Mock-palvelimen nimi on pakollinen", + "active_label": "Aktiivinen", + "url_label": "Mock-palvelimen URL", + "collection_label": "Kokoelma", + "update_button": "Päivitä mock-palvelin", + "success": "Mock-palvelin päivitetty onnistuneesti", + "error": "Mock-palvelimen päivitys epäonnistui", + "url_copied": "URL kopioitu leikepöydälle" + }, + "dashboard": { + "title": "Mock-palvelimet", + "subtitle": "Luo ja hallitse API-mock-palvelimiasi", + "create_button": "Luo mock-palvelin", + "create_first": "Luo ensimmäinen mock-palvelimesi", + "empty_title": "Mock-palvelimia ei löytynyt", + "empty_description": "Luo mock-palvelimia API-kokoelmiesi perusteella mahdollistaaksesi frontend- ja mobiilikehityksen ilman backend-riippuvuuksia.", + "collection": "Kokoelma", + "active": "Aktiivinen", + "inactive": "Epäaktiivinen", + "mock_url": "Mock-URL", + "endpoints": "Päätepisteet", + "created": "Luotu", + "view_collection": "Näytä kokoelma", + "documentation": "Dokumentaatio", + "doc_description": "Käytä tätä URL-osoitetta API:n perus-URL:na sovelluksissasi:", + "url_copied": "Mock-palvelimen URL kopioitu leikepöydälle", + "delete_title": "Poista mock-palvelin", + "delete_description": "Haluatko varmasti poistaa tämän mock-palvelimen?", + "delete_success": "Mock-palvelin poistettu onnistuneesti", + "delete_error": "Mock-palvelimen poisto epäonnistui" + } } } diff --git a/packages/hoppscotch-common/locales/th.json b/packages/hoppscotch-common/locales/th.json new file mode 100644 index 00000000000..e014577fea4 --- /dev/null +++ b/packages/hoppscotch-common/locales/th.json @@ -0,0 +1,2378 @@ +{ + "action": { + "add": "เพิ่ม", + "autoscroll": "เลื่อนอัตโนมัติ", + "cancel": "ยกเลิก", + "choose_file": "เลือกไฟล์", + "choose_workspace": "เลือกพื้นที่ทำงาน", + "choose_collection": "เลือกคอลเลกชัน", + "select_workspace": "เลือกพื้นที่ทำงาน", + "clear": "ล้าง", + "clear_all": "ล้างทั้งหมด", + "clear_cache": "ล้างแคช", + "clear_history": "ล้างประวัติทั้งหมด", + "clear_unpinned": "ล้างรายการที่ไม่ได้ปักหมุด", + "clear_response": "ล้างการตอบกลับ", + "close": "ปิด", + "confirm": "ยืนยัน", + "connect": "เชื่อมต่อ", + "connecting": "กำลังเชื่อมต่อ", + "copy": "คัดลอก", + "create": "สร้าง", + "delete": "ลบ", + "disconnect": "ตัดการเชื่อมต่อ", + "dismiss": "ปิด", + "done": "เสร็จสิ้น", + "dont_save": "ไม่บันทึก", + "download_file": "ดาวน์โหลดไฟล์", + "download_test_report": "ดาวน์โหลดรายงานการทดสอบ", + "drag_to_reorder": "ลากเพื่อจัดเรียงใหม่", + "duplicate": "ทำสำเนา", + "edit": "แก้ไข", + "filter": "กรอง", + "go_back": "ย้อนกลับ", + "go_forward": "ไปข้างหน้า", + "group_by": "จัดกลุ่มตาม", + "hide_secret": "ซ่อนข้อมูลลับ", + "label": "ป้ายกำกับ", + "learn_more": "เรียนรู้เพิ่มเติม", + "download_here": "ดาวน์โหลดที่นี่", + "less": "น้อยลง", + "more": "เพิ่มเติม", + "new": "ใหม่", + "no": "ไม่", + "open": "เปิด", + "open_workspace": "เปิดพื้นที่ทำงาน", + "paste": "วาง", + "prettify": "จัดรูปแบบให้สวยงาม", + "properties": "คุณสมบัติ", + "register": "ลงทะเบียน", + "remove": "นำออก", + "remove_instance": "นำอินสแตนซ์ออก", + "rename": "เปลี่ยนชื่อ", + "restore": "กู้คืน", + "retry": "ลองใหม่", + "save": "บันทึก", + "save_as_example": "บันทึกเป็นตัวอย่าง", + "add_example": "เพิ่มตัวอย่าง", + "invalid_request": "ข้อมูลคำขอไม่ถูกต้อง", + "scroll_to_bottom": "เลื่อนไปด้านล่างสุด", + "scroll_to_top": "เลื่อนไปด้านบนสุด", + "search": "ค้นหา", + "send": "ส่ง", + "share": "แชร์", + "show_secret": "แสดงข้อมูลลับ", + "sort": "จัดเรียง", + "start": "เริ่ม", + "starting": "กำลังเริ่ม", + "stop": "หยุด", + "to_close": "เพื่อปิด", + "to_navigate": "เพื่อนำทาง", + "to_select": "เพื่อเลือก", + "turn_off": "ปิด", + "turn_on": "เปิด", + "undo": "เลิกทำ", + "unpublish": "ยกเลิกการเผยแพร่", + "yes": "ใช่", + "verify": "ยืนยัน", + "enable": "เปิดใช้งาน", + "disable": "ปิดใช้งาน", + "assign": "มอบหมาย" + }, + "activity_logs": { + "ACTIVITY_LOG_DELETE": "ลบบันทึกกิจกรรมแล้ว", + "WORKSPACE_CREATE": "สร้างพื้นที่ทำงานใหม่ {name}", + "WORKSPACE_RENAME": "เปลี่ยนชื่อพื้นที่ทำงานจาก {old_name} เป็น {new_name}", + "WORKSPACE_USER_ADD": "{user} ถูกเพิ่มเข้าพื้นที่ทำงานในฐานะ {role}", + "WORKSPACE_USER_INVITE": "{user} ได้รับเชิญโดย {inviteeEmail} ในฐานะ {role}", + "WORKSPACE_USER_INVITE_REVOKE": "เพิกถอนคำเชิญของ {inviteeEmail} ในฐานะ {inviteeRole}", + "WORKSPACE_USER_INVITE_ACCEPT": "{inviteeEmail} ยอมรับคำเชิญในฐานะ {inviteeRole}", + "WORKSPACE_USER_REMOVE": "{user} ถูกนำออกจากพื้นที่ทำงาน", + "WORKSPACE_USER_ROLE_UPDATE": "บทบาทของ {user} ถูกอัปเดตจาก {old_role} เป็น {new_role}", + "COLLECTION_CREATE": "สร้างคอลเลกชันใหม่ {title}", + "COLLECTION_RENAME": "เปลี่ยนชื่อคอลเลกชันจาก {old_title} เป็น {new_title}", + "COLLECTION_IMPORT": "นำเข้า {count} คอลเลกชัน", + "COLLECTION_DELETE": "ลบคอลเลกชัน {title}", + "COLLECTION_DUPLICATE": "ทำสำเนาคอลเลกชัน {parentTitle}", + "REQUEST_CREATE": "สร้างคำขอใหม่ {title}", + "REQUEST_RENAME": "เปลี่ยนชื่อคำขอจาก {old_title} เป็น {new_title}", + "REQUEST_DELETE": "ลบคำขอ {title}" + }, + "add": { + "new": "เพิ่มใหม่", + "star": "เพิ่มดาว" + }, + "agent": { + "registration_instruction": "โปรดลงทะเบียน Hoppscotch Agent กับเว็บไคลเอนต์ของคุณเพื่อดำเนินการต่อ", + "enter_otp_instruction": "โปรดกรอกรหัสยืนยันที่สร้างโดย Hoppscotch Agent และดำเนินการลงทะเบียนให้เสร็จสมบูรณ์", + "otp_label": "รหัสยืนยัน", + "processing": "กำลังประมวลผลคำขอของคุณ...", + "not_running_title": "ไม่พบ Agent", + "registration_title": "การลงทะเบียน Agent", + "verify_ssl_certs": "ยืนยันใบรับรอง SSL", + "ca_certs": "ใบรับรอง CA", + "client_certs": "ใบรับรองไคลเอนต์", + "use_http_proxy": "ใช้ HTTP Proxy", + "proxy_capabilities": "Hoppscotch Agent รองรับพร็อกซี HTTP/HTTPS/SOCKS พร้อมด้วย NTLM และ Basic Auth ในพร็อกซีเหล่านั้น ใส่ชื่อผู้ใช้และรหัสผ่านสำหรับการยืนยันตัวตนของพร็อกซีไว้ใน URL โดยตรง", + "add_cert_file": "เพิ่มไฟล์ใบรับรอง", + "add_client_cert": "เพิ่มใบรับรองไคลเอนต์", + "add_key_file": "เพิ่มไฟล์คีย์", + "domain": "โดเมน", + "cert": "ใบรับรอง", + "key": "คีย์", + "pfx_or_pkcs": "PFX/PKCS12", + "pfx_or_pkcs_file": "ไฟล์ PFX/PKCS12", + "add_pfx_or_pkcs_file": "เพิ่มไฟล์ PFX/PKCS12" + }, + "app": { + "additional_links": { + "macOS": "macOS", + "windows": "Windows", + "linux": "Linux", + "web_app": "เว็บแอป", + "cli": "CLI" + }, + "downloads": "ดาวน์โหลด", + "chat_with_us": "แชทกับเรา", + "contact_us": "ติดต่อเรา", + "cookies": "คุกกี้", + "copy": "คัดลอก", + "copy_interface_type": "คัดลอกประเภทอินเทอร์เฟซ", + "copy_user_id": "คัดลอกโทเค็นการให้สิทธิ์ของผู้ใช้", + "developer_option": "ตัวเลือกสำหรับนักพัฒนา", + "developer_option_description": "เครื่องมือสำหรับนักพัฒนาที่ช่วยในการพัฒนาและบำรุงรักษา Hoppscotch", + "discord": "Discord", + "documentation": "เอกสารประกอบ", + "github": "GitHub", + "help": "ความช่วยเหลือและข้อเสนอแนะ", + "home": "หน้าแรก", + "invite": "เชิญ", + "invite_description": "Hoppscotch เป็นระบบนิเวศการพัฒนา API แบบโอเพนซอร์ส เราออกแบบอินเทอร์เฟซที่เรียบง่ายและใช้งานง่ายสำหรับการสร้างและจัดการ API ของคุณ Hoppscotch เป็นเครื่องมือที่ช่วยให้คุณสร้าง ทดสอบ จัดทำเอกสาร และแชร์ API ของคุณ", + "invite_your_friends": "เชิญเพื่อนของคุณ", + "join_discord_community": "เข้าร่วมชุมชน Discord ของเรา", + "keyboard_shortcuts": "ทางลัดแป้นพิมพ์", + "name": "Hoppscotch", + "new_version_found": "พบเวอร์ชันใหม่ รีเฟรชเพื่ออัปเดต", + "open_in_hoppscotch": "เปิดใน Hoppscotch", + "options": "ตัวเลือก", + "powered_by": "ขับเคลื่อนโดย Hoppscotch", + "proxy_privacy_policy": "นโยบายความเป็นส่วนตัวของพร็อกซี", + "reload": "โหลดใหม่", + "search": "ค้นหาและคำสั่ง", + "share": "แชร์", + "shortcuts": "ทางลัด", + "social_description": "ติดตามเราบนโซเชียลมีเดียเพื่อรับข่าวสาร อัปเดต และการเปิดตัวล่าสุด", + "social_links": "ลิงก์โซเชียล", + "spotlight": "Spotlight", + "status": "สถานะ", + "status_description": "ตรวจสอบสถานะของเว็บไซต์", + "terms_and_privacy": "ข้อกำหนดและความเป็นส่วนตัว", + "twitter": "Twitter", + "type_a_command_search": "พิมพ์คำสั่งหรือค้นหา…", + "we_use_cookies": "เราใช้คุกกี้", + "updated_text": "Hoppscotch ได้รับการอัปเดตเป็น v{version} 🎉", + "whats_new": "มีอะไรใหม่?", + "see_whats_new": "ดูสิ่งที่มีใหม่", + "wiki": "Wiki", + "collapse_sidebar": "ยุบแถบด้านข้าง", + "continue_to_dashboard": "ไปยังแดชบอร์ด", + "expand_sidebar": "ขยายแถบด้านข้าง", + "no_name": "ไม่มีชื่อ", + "open_navigation": "เปิดการนำทาง", + "read_documentation": "อ่านเอกสารประกอบ", + "default": "ค่าเริ่มต้น: {value}" + }, + "auth": { + "account_deactivated": "บัญชีของคุณถูกปิดใช้งาน ติดต่อผู้ดูแลระบบเพื่อขอสิทธิ์การเข้าถึง", + "account_exists": "มีบัญชีอยู่แล้วด้วยข้อมูลรับรองอื่น - เข้าสู่ระบบเพื่อเชื่อมโยงทั้งสองบัญชี", + "all_sign_in_options": "ตัวเลือกการลงชื่อเข้าใช้ทั้งหมด", + "continue_with_auth_provider": "ดำเนินการต่อด้วย {provider}", + "continue_with_email": "ดำเนินการต่อด้วยอีเมล", + "continue_with_github": "ดำเนินการต่อด้วย GitHub", + "continue_with_github_enterprise": "ดำเนินการต่อด้วย GitHub Enterprise", + "continue_with_google": "ดำเนินการต่อด้วย Google", + "continue_with_microsoft": "ดำเนินการต่อด้วย Microsoft", + "email": "อีเมล", + "logged_out": "ออกจากระบบแล้ว", + "login": "เข้าสู่ระบบ", + "login_success": "เข้าสู่ระบบสำเร็จ", + "login_to_hoppscotch": "เข้าสู่ระบบ Hoppscotch", + "logout": "ออกจากระบบ", + "re_enter_email": "ป้อนอีเมลอีกครั้ง", + "send_magic_link": "ส่ง magic link", + "sync": "ซิงค์", + "we_sent_magic_link": "เราได้ส่ง magic link ให้คุณแล้ว!", + "we_sent_magic_link_description": "ตรวจสอบกล่องจดหมายของคุณ - เราได้ส่งอีเมลไปยัง {email} ซึ่งมี magic link ที่จะเข้าสู่ระบบให้คุณ" + }, + "authorization": { + "generate_token": "สร้างโทเค็น", + "refresh_token": "รีเฟรชโทเค็น", + "graphql_headers": "ส่วนหัวการให้สิทธิ์จะถูกส่งเป็นส่วนหนึ่งของ payload ไปยัง connection_init", + "include_in_url": "รวมไว้ใน URL", + "inherited_from": "สืบทอด {auth} จากคอลเลกชันหลัก {collection} ", + "learn": "เรียนรู้วิธีการ", + "oauth": { + "redirect_auth_server_returned_error": "เซิร์ฟเวอร์การให้สิทธิ์ส่งคืนสถานะข้อผิดพลาด", + "redirect_auth_token_request_failed": "คำขอเพื่อรับโทเค็นการให้สิทธิ์ล้มเหลว", + "redirect_auth_token_request_invalid_response": "การตอบกลับจาก Token Endpoint ไม่ถูกต้องเมื่อขอโทเค็นการให้สิทธิ์", + "redirect_invalid_state": "ค่า State ในการเปลี่ยนเส้นทางไม่ถูกต้อง", + "redirect_no_auth_code": "ไม่มี Authorization Code ในการเปลี่ยนเส้นทาง", + "redirect_no_client_id": "ไม่ได้กำหนด Client ID", + "redirect_no_client_secret": "ไม่ได้กำหนด Client Secret", + "redirect_no_code_verifier": "ไม่ได้กำหนด Code Verifier", + "redirect_no_token_endpoint": "ไม่ได้กำหนด Token Endpoint", + "something_went_wrong_on_oauth_redirect": "เกิดข้อผิดพลาดบางอย่างระหว่างการเปลี่ยนเส้นทาง OAuth", + "something_went_wrong_on_token_generation": "เกิดข้อผิดพลาดบางอย่างในการสร้างโทเค็น", + "token_generation_oidc_discovery_failed": "การสร้างโทเค็นล้มเหลว: OpenID Connect Discovery ล้มเหลว", + "grant_type": "Grant Type", + "grant_type_auth_code": "Authorization Code", + "token_fetched_successfully": "ดึงโทเค็นสำเร็จ", + "token_fetch_failed": "ดึงโทเค็นไม่สำเร็จ", + "validation_failed": "การตรวจสอบล้มเหลว โปรดตรวจสอบฟิลด์ในแบบฟอร์ม", + "no_refresh_token_present": "ไม่มี Refresh Token โปรดเรียกใช้ขั้นตอนการสร้างโทเค็นอีกครั้ง", + "refresh_token_request_failed": "คำขอรีเฟรชโทเค็นล้มเหลว", + "token_refreshed_successfully": "รีเฟรชโทเค็นสำเร็จ", + "label_authorization_endpoint": "Authorization Endpoint", + "label_client_id": "Client ID", + "label_client_secret": "Client Secret", + "label_code_challenge": "Code Challenge", + "label_code_challenge_method": "Code Challenge Method", + "label_code_verifier": "Code Verifier", + "label_scopes": "Scopes", + "label_token_endpoint": "Token Endpoint", + "label_use_pkce": "ใช้ PKCE", + "label_implicit": "Implicit", + "label_password": "รหัสผ่าน", + "label_username": "ชื่อผู้ใช้", + "label_auth_code": "Authorization Code", + "label_client_credentials": "Client Credentials", + "label_send_as": "การยืนยันตัวตนของไคลเอนต์", + "label_send_in_body": "ส่งข้อมูลรับรองในเนื้อหา", + "label_send_as_basic_auth": "ส่งข้อมูลรับรองเป็น Basic Auth", + "enter_value": "ป้อนค่า", + "auth_request": "คำขอการให้สิทธิ์", + "token_request": "คำขอโทเค็น", + "refresh_request": "คำขอรีเฟรช", + "send_in": "ส่งใน" + }, + "pass_key_by": "ส่งผ่านโดย", + "pass_by_query_params_label": "พารามิเตอร์เคียวรี", + "pass_by_headers_label": "ส่วนหัว", + "password": "รหัสผ่าน", + "save_to_inherit": "โปรดบันทึกคำขอนี้ในคอลเลกชันใดก็ได้เพื่อสืบทอดการให้สิทธิ์", + "token": "โทเค็น", + "access_token": "Access Token", + "client_token": "Client Token", + "client_secret": "Client Secret", + "timestamp": "Timestamp", + "host": "Host", + "type": "ประเภทการให้สิทธิ์", + "username": "ชื่อผู้ใช้", + "advance_config": "การกำหนดค่าขั้นสูง", + "advance_config_description": "Hoppscotch จะกำหนดค่าเริ่มต้นให้กับบางฟิลด์โดยอัตโนมัติหากไม่ได้ระบุค่าไว้อย่างชัดเจน", + "algorithm": "อัลกอริทึม", + "payload": "Payload", + "secret": "Secret", + "aws_signature": { + "access_key": "Access Key", + "secret_key": "Secret Key", + "service_name": "ชื่อบริการ", + "aws_region": "AWS Region", + "service_token": "Service Token" + }, + "digest": { + "realm": "Realm", + "nonce": "Nonce", + "algorithm": "อัลกอริทึม", + "qop": "qop", + "nonce_count": "Nonce Count", + "client_nonce": "Client Nonce", + "opaque": "Opaque", + "disable_retry": "ปิดการลองส่งคำขอใหม่" + }, + "akamai": { + "headers_to_sign": "ส่วนหัวที่จะเซ็น", + "max_body_size": "ขนาดเนื้อหาสูงสุด" + }, + "hawk": { + "id": "HAWK Auth ID", + "key": "HAWK Auth Key", + "ext": "ext", + "app": "app", + "dlg": "dlg", + "include": "รวม Payload Hash" + }, + "jwt": { + "params_name": "ชื่อพารามิเตอร์", + "param_name": "ชื่อพารามิเตอร์", + "header_prefix": "คำนำหน้าส่วนหัว", + "placeholder_request_header": "คำนำหน้าส่วนหัวของคำขอ", + "placeholder_request_param": "ชื่อพารามิเตอร์ของคำขอ", + "secret_base64_encoded": "Secret ที่เข้ารหัสแบบ Base64", + "headers": "JWT Headers", + "private_key": "Private Key", + "placeholder_headers": "JWT Headers" + }, + "ntlm": { + "domain": "โดเมน", + "workstation": "เวิร์กสเตชัน", + "disable_retrying_request": "ปิดการลองส่งคำขอใหม่" + }, + "asap": { + "issuer": "ผู้ออก", + "audience": "ผู้รับ", + "expires_in": "หมดอายุใน", + "key_id": "Key ID", + "optional_config": "การกำหนดค่าเสริม", + "subject": "หัวเรื่อง", + "additional_claims": "Claims เพิ่มเติม" + } + }, + "collection": { + "title": "คอลเลกชัน", + "run": "รันคอลเลกชัน", + "created": "สร้างคอลเลกชันแล้ว", + "different_parent": "ไม่สามารถจัดเรียงคอลเลกชันที่มีพาเรนต์ต่างกันได้", + "edit": "แก้ไขคอลเลกชัน", + "import_or_create": "นำเข้าหรือสร้างคอลเลกชัน", + "import_collection": "นำเข้าคอลเลกชัน", + "invalid_name": "โปรดระบุชื่อสำหรับคอลเลกชัน", + "invalid_root_move": "คอลเลกชันอยู่ในรากอยู่แล้ว", + "moved": "ย้ายสำเร็จ", + "my_collections": "คอลเลกชันส่วนตัว", + "name": "คอลเลกชันใหม่ของฉัน", + "name_length_insufficient": "ชื่อคอลเลกชันควรมีความยาวอย่างน้อย 3 อักขระ", + "new": "คอลเลกชันใหม่", + "order_changed": "อัปเดตลำดับคอลเลกชันแล้ว", + "properties": "คุณสมบัติคอลเลกชัน", + "properties_updated": "อัปเดตคุณสมบัติคอลเลกชันแล้ว", + "renamed": "เปลี่ยนชื่อคอลเลกชันแล้ว", + "request_in_use": "คำขอกำลังถูกใช้งาน", + "save_as": "บันทึกเป็น", + "save_to_collection": "บันทึกไปยังคอลเลกชัน", + "select": "เลือกคอลเลกชัน", + "select_location": "เลือกตำแหน่ง", + "sorted": "จัดเรียงคอลเลกชันแล้ว", + "details": "รายละเอียด", + "duplicated": "ทำสำเนาคอลเลกชันแล้ว" + }, + "confirm": { + "close_unsaved_tab": "คุณแน่ใจหรือไม่ว่าต้องการปิดแท็บนี้?", + "close_unsaved_tabs": "คุณแน่ใจหรือไม่ว่าต้องการปิดแท็บทั้งหมด? แท็บที่ยังไม่ได้บันทึก {count} แท็บจะสูญหาย", + "delete_all_activity_logs": "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกกิจกรรมทั้งหมด?", + "exit_team": "คุณแน่ใจหรือไม่ว่าต้องการออกจากพื้นที่ทำงานนี้?", + "logout": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", + "remove_collection": "คุณแน่ใจหรือไม่ว่าต้องการลบคอลเลกชันนี้อย่างถาวร?", + "remove_environment": "คุณแน่ใจหรือไม่ว่าต้องการลบสภาพแวดล้อมนี้อย่างถาวร?", + "remove_folder": "คุณแน่ใจหรือไม่ว่าต้องการลบโฟลเดอร์นี้อย่างถาวร?", + "remove_history": "คุณแน่ใจหรือไม่ว่าต้องการลบประวัติทั้งหมดอย่างถาวร?", + "remove_request": "คุณแน่ใจหรือไม่ว่าต้องการลบคำขอนี้อย่างถาวร?", + "remove_response": "คุณแน่ใจหรือไม่ว่าต้องการลบการตอบกลับนี้อย่างถาวร?", + "remove_shared_request": "คุณแน่ใจหรือไม่ว่าต้องการลบคำขอที่แชร์นี้อย่างถาวร?", + "remove_team": "คุณแน่ใจหรือไม่ว่าต้องการลบพื้นที่ทำงานนี้?", + "remove_telemetry": "คุณแน่ใจหรือไม่ว่าต้องการเลือกไม่ใช้ Telemetry?", + "request_change": "คุณแน่ใจหรือไม่ว่าต้องการละทิ้งคำขอปัจจุบัน การเปลี่ยนแปลงที่ยังไม่ได้บันทึกจะสูญหาย", + "save_unsaved_tab": "คุณต้องการบันทึกการเปลี่ยนแปลงที่ทำในแท็บนี้หรือไม่?", + "sync": "คุณต้องการกู้คืนพื้นที่ทำงานของคุณจากคลาวด์หรือไม่? การดำเนินการนี้จะละทิ้งความคืบหน้าในเครื่องของคุณ", + "delete_access_token": "คุณแน่ใจหรือไม่ว่าต้องการลบโทเค็นการเข้าถึง {tokenLabel}?", + "delete_mock_server": "คุณแน่ใจหรือไม่ว่าต้องการลบ mock server นี้?" + }, + "context_menu": { + "add_parameters": "เพิ่มไปยังพารามิเตอร์", + "open_request_in_new_tab": "เปิดคำขอในแท็บใหม่", + "set_environment_variable": "ตั้งเป็นตัวแปร", + "encode_uri_component": "เข้ารหัสคอมโพเนนต์ URL", + "decode_uri_component": "ถอดรหัสคอมโพเนนต์ URL" + }, + "cookies": { + "modal": { + "cookie_expires": "หมดอายุ", + "cookie_name": "ชื่อ", + "cookie_path": "เส้นทาง", + "cookie_string": "สตริงคุกกี้", + "cookie_value": "ค่า", + "empty_domain": "โดเมนว่างเปล่า", + "empty_domains": "รายการโดเมนว่างเปล่า", + "enter_cookie_string": "ป้อนสตริงคุกกี้", + "interceptor_no_support": "ตัวสกัดกั้นที่คุณเลือกอยู่ในปัจจุบันไม่รองรับคุกกี้ เลือกตัวสกัดกั้นอื่นแล้วลองอีกครั้ง", + "managed_tab": "จัดการแล้ว", + "new_domain_name": "ชื่อโดเมนใหม่", + "no_cookies_in_domain": "ไม่มีการตั้งค่าคุกกี้สำหรับโดเมนนี้", + "raw_tab": "ดิบ", + "set": "ตั้งค่าคุกกี้" + } + }, + "count": { + "currentValue": "ค่าปัจจุบัน {count}", + "description": "คำอธิบาย {count}", + "header": "ส่วนหัว {count}", + "initialValue": "ค่าเริ่มต้น {count}", + "key": "คีย์ {count}", + "message": "ข้อความ {count}", + "parameter": "พารามิเตอร์ {count}", + "protocol": "โปรโตคอล {count}", + "value": "ค่า {count}", + "variable": "ตัวแปร {count}" + }, + "documentation": { + "add_description": "เพิ่มคำอธิบายสำหรับคอลเลกชันนี้ที่นี่...", + "add_description_placeholder": "เพิ่มคำอธิบายที่นี่...", + "add_request_description": "เพิ่มคำอธิบายสำหรับคำขอที่นี่...", + "auth": { + "access_key": "Access Key", + "access_token": "Access Token", + "add_to": "เพิ่มไปยัง", + "akamai_edgegrid": "Akamai EdgeGrid", + "algorithm": "อัลกอริทึม", + "api_key": "API Key", + "app_id": "App ID", + "auth_id": "Auth ID", + "auth_key": "Auth Key", + "auth_url": "Auth URL", + "aws_signature": "AWS Signature", + "basic_auth": "Basic Auth", + "bearer_token": "Bearer Token", + "client_id": "Client ID", + "client_nonce": "Client Nonce", + "client_secret": "Client Secret", + "client_token": "Client Token", + "delegation": "การมอบสิทธิ์", + "digest_auth": "Digest Auth", + "extra_data": "ข้อมูลเพิ่มเติม", + "grant_type": "Grant Type", + "hawk_auth": "HAWK Auth", + "headers_to_sign": "ส่วนหัวที่จะลงนาม", + "host": "Host", + "include_payload_hash": "รวม Payload Hash", + "jwt_auth": "JWT Auth", + "max_body_size": "ขนาดเนื้อหาสูงสุด", + "no_auth": "ไม่มีการยืนยันตัวตน", + "nonce": "Nonce", + "oauth_2": "OAuth 2.0", + "opaque": "Opaque", + "password": "รหัสผ่าน", + "payload": "Payload", + "qop": "QOP", + "realm": "Realm", + "region": "ภูมิภาค", + "scope": "Scope", + "secret_key": "Secret Key", + "service_name": "ชื่อบริการ", + "timestamp": "Timestamp", + "title": "การยืนยันตัวตน", + "token_url": "Token URL", + "user": "ผู้ใช้", + "username": "ชื่อผู้ใช้" + }, + "body": { + "content_type": "Content Type", + "no_body": "ไม่ได้กำหนดเนื้อหา", + "title": "เนื้อหา" + }, + "copied_to_clipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว!", + "curl": { + "click_to_load": "คลิกเพื่อโหลดคำสั่ง cURL", + "copied": "คัดลอกคำสั่ง cURL ไปยังคลิปบอร์ดแล้ว!", + "copy_to_clipboard": "คัดลอกไปยังคลิปบอร์ด", + "generating": "กำลังสร้างคำสั่ง cURL...", + "load": "โหลด cURL", + "title": "cURL" + }, + "description": "คำอธิบาย", + "error_rendering_markdown": "เกิดข้อผิดพลาดในการแสดงผล markdown:", + "fetching_documentation": "กำลังดึงเอกสาร...", + "generate": "สร้างเอกสาร", + "generate_message": "นำเข้าคอลเลกชัน Hoppscotch ใดก็ได้เพื่อสร้างเอกสาร API ได้ทันที", + "headers": { + "no_headers": "ไม่ได้กำหนดส่วนหัว", + "title": "ส่วนหัว" + }, + "hide_all_documentation": "ซ่อนเอกสารทั้งหมด", + "inherited_from": "สืบทอดมาจาก {name}", + "inherited_with_type": "สืบทอด {type} มาจาก {name}", + "key": "คีย์", + "loading": "กำลังโหลด...", + "loading_collection_data": "กำลังโหลดข้อมูลคอลเลกชัน...", + "no": "ไม่", + "no_collection_data": "ไม่มีข้อมูลคอลเลกชัน", + "no_documentation_found": "ไม่พบเอกสารสำหรับโฟลเดอร์หรือคำขอ", + "no_request_data": "ไม่มีข้อมูลคำขอ", + "no_requests_or_folders": "ไม่มีคำขอหรือโฟลเดอร์", + "not_set": "ยังไม่ได้ตั้งค่า", + "open_request_in_new_tab": "เปิดคำขอในแท็บใหม่", + "parameters": { + "no_params": "ไม่ได้กำหนดพารามิเตอร์", + "title": "พารามิเตอร์" + }, + "percent_complete": "% เสร็จสมบูรณ์", + "processing_documentation": "กำลังประมวลผลเอกสาร", + "publish": { + "already_published": "คอลเลกชันนี้เผยแพร่แล้ว", + "auto_sync": "ซิงค์อัตโนมัติกับคอลเลกชัน", + "auto_sync_description": "อัปเดตเอกสารที่เผยแพร่โดยอัตโนมัติเมื่อคอลเลกชันเปลี่ยนแปลง", + "button": "เผยแพร่", + "copy_url": "คัดลอก URL", + "delete": "ลบเอกสาร", + "unpublish_doc": "คุณแน่ใจหรือไม่ว่าต้องการยกเลิกการเผยแพร่เอกสารนี้?", + "delete_success": "ลบเอกสารที่เผยแพร่เรียบร้อยแล้ว", + "doc_title": "ชื่อ", + "doc_version": "เวอร์ชัน", + "edit_published_doc": "แก้ไขเอกสารที่เผยแพร่", + "last_updated": "อัปเดตล่าสุด", + "metadata": "ข้อมูลเมตา (JSON)", + "open_published_doc": "เปิดเอกสารที่เผยแพร่ในแท็บใหม่", + "publish_error": "เผยแพร่เอกสารไม่สำเร็จ", + "publish_success": "เผยแพร่เอกสารเรียบร้อยแล้ว!", + "published": "เผยแพร่แล้ว", + "published_url": "URL ที่เผยแพร่", + "title": "เผยแพร่เอกสาร", + "update_button": "อัปเดต", + "update_error": "อัปเดตเอกสารไม่สำเร็จ", + "update_published_docs": "อัปเดตเอกสารที่เผยแพร่", + "update_success": "อัปเดตเอกสารเรียบร้อยแล้ว!", + "unpublish": "ยกเลิกการเผยแพร่", + "update_title": "อัปเดตเอกสารที่เผยแพร่", + "url_copied": "คัดลอก URL ไปยังคลิปบอร์ดแล้ว!", + "view_published": "ดูเอกสารที่เผยแพร่", + "view_title": "ภาพรวมเอกสารที่เผยแพร่", + "versions": "เวอร์ชัน", + "create_new_version": "สร้างเวอร์ชันใหม่", + "invalid_version": "เวอร์ชันต้องประกอบด้วยอักขระตัวอักษรและตัวเลข จุด และยัติภังค์เท่านั้น", + "live": "สด", + "snapshot": "สแนปช็อต", + "version_immutable": "เวอร์ชันที่เผยแพร่เป็นสแนปช็อตแบบอ่านอย่างเดียว", + "view_snapshot": "ดูสแนปช็อต", + "current_version": "ปัจจุบัน", + "not_found": "ไม่พบเอกสารที่เผยแพร่", + "no_doc_id": "ไม่ได้ระบุ ID ของเอกสาร", + "version_label": "v{version}", + "unpublish_version": "ยกเลิกการเผยแพร่เวอร์ชันนี้", + "loading_snapshot": "กำลังโหลดสแนปช็อต...", + "retry_snapshot": "ลองใหม่", + "sensitive_data_warning": "โปรดตรวจสอบให้แน่ใจว่าไม่มีข้อมูลที่ละเอียดอ่อนถูกเปิดเผยในเอกสารที่เผยแพร่", + "snapshot_preview": "ตัวอย่างสแนปช็อต", + "snapshot_load_error": "โหลดตัวอย่างสแนปช็อตไม่สำเร็จ", + "snapshot_empty": "ไม่มีคำขอหรือโฟลเดอร์ในสแนปช็อตนี้", + "snapshot_item_count": "{count} รายการ", + "auto_sync_live_notice": "เวอร์ชันนี้ซิงค์อัตโนมัติกับคอลเลกชันสด", + "snapshot_promote_warning": "การเปิดใช้งานการซิงค์อัตโนมัติจะแทนที่สแนปช็อตที่ตรึงไว้นี้ด้วยโครงสร้างคอลเลกชันสด การดำเนินการนี้ไม่สามารถยกเลิกได้", + "live_freeze_notice": "การซิงค์อัตโนมัติจะถูกปิด และเวอร์ชันนี้จะถูกตรึงไว้ที่สถานะคอลเลกชันปัจจุบัน", + "untitled_project": "โปรเจกต์ที่ไม่มีชื่อ", + "environment": "สภาพแวดล้อม", + "no_environment": "ไม่มีสภาพแวดล้อม", + "environment_description": "แนบสภาพแวดล้อมเพื่อแก้ค่าตัวแปรในเอกสารที่เผยแพร่" + }, + "request_opened_in_new_tab": "เปิดคำขอในแท็บใหม่แล้ว!", + "response": { + "body": "เนื้อหาการตอบกลับ", + "copy": "คัดลอกการตอบกลับ", + "example_copied": "คัดลอกตัวอย่างการตอบกลับไปยังคลิปบอร์ดแล้ว!", + "example_copy_failed": "คัดลอกตัวอย่างการตอบกลับไม่สำเร็จ", + "headers": "ส่วนหัวการตอบกลับ", + "no_examples": "ไม่มีตัวอย่างการตอบกลับ", + "title": "ตัวอย่างการตอบกลับ" + }, + "save_error": "เกิดข้อผิดพลาดในการบันทึกเอกสาร", + "save_success": "บันทึกเอกสารเรียบร้อยแล้ว", + "saved_items_status": "บันทึก {success} รายการ บันทึก {failure} รายการไม่สำเร็จ", + "show_all_documentation": "แสดงเอกสารทั้งหมด", + "source": "แหล่งที่มา", + "title": "เอกสาร", + "unsaved_changes": "คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก {count} รายการ โปรดบันทึกก่อนปิด", + "untitled_collection": "คอลเลกชันที่ไม่มีชื่อ", + "untitled_request": "คำขอที่ไม่มีชื่อ", + "value": "ค่า", + "variables": { + "no_vars": "ไม่ได้กำหนดตัวแปร", + "title": "ตัวแปร" + }, + "yes": "ใช่" + }, + "empty": { + "activity_logs": "ไม่พบบันทึกกิจกรรม", + "authorization": "คำขอนี้ไม่ได้ใช้การให้สิทธิ์ใด ๆ", + "body": "คำขอนี้ไม่มีเนื้อหา", + "collection": "คอลเลกชันว่างเปล่า", + "collections": "คอลเลกชันว่างเปล่า", + "documentation": "เชื่อมต่อกับเอนด์พอยต์ GraphQL เพื่อดูเอกสารประกอบ", + "empty_schema": "ไม่พบสคีมา", + "endpoint": "เอนด์พอยต์ต้องไม่ว่างเปล่า", + "environments": "สภาพแวดล้อมว่างเปล่า", + "collection_variables": "ตัวแปรของคอลเลกชันว่างเปล่า", + "folder": "โฟลเดอร์ว่างเปล่า", + "headers": "คำขอนี้ไม่มีส่วนหัวใด ๆ", + "history": "ประวัติว่างเปล่า", + "invites": "รายการคำเชิญว่างเปล่า", + "members": "พื้นที่ทำงานว่างเปล่า", + "parameters": "คำขอนี้ไม่มีพารามิเตอร์ใด ๆ", + "pending_invites": "ไม่มีคำเชิญที่รอดำเนินการสำหรับพื้นที่ทำงานนี้", + "profile": "เข้าสู่ระบบเพื่อดูโปรไฟล์ของคุณ", + "protocols": "โปรโตคอลว่างเปล่า", + "request_variables": "คำขอนี้ไม่มีตัวแปรของคำขอใด ๆ", + "schema": "เชื่อมต่อกับเอนด์พอยต์ GraphQL เพื่อดูสคีมา", + "search_environment": "ไม่พบสภาพแวดล้อมที่ตรงกันสำหรับ", + "secret_environments": "ความลับไม่ได้ซิงค์ไปยัง Hoppscotch", + "shared_requests": "คำขอที่แชร์ว่างเปล่า", + "shared_requests_logout": "เข้าสู่ระบบเพื่อดูคำขอที่แชร์ของคุณ หรือสร้างใหม่", + "subscription": "การสมัครสมาชิกว่างเปล่า", + "team_name": "ชื่อพื้นที่ทำงานว่างเปล่า", + "teams": "คุณไม่ได้อยู่ในพื้นที่ทำงานใด ๆ", + "tests": "ไม่มีการทดสอบสำหรับคำขอนี้", + "access_tokens": "โทเค็นการเข้าถึงว่างเปล่า", + "response": "ไม่ได้รับการตอบกลับ", + "mock_servers": "ไม่พบ Mock Server" + }, + "environment": { + "heading": "สภาพแวดล้อม", + "add_to_global": "เพิ่มไปยัง Global", + "added": "เพิ่มตัวแปรสภาพแวดล้อมแล้ว", + "create_new": "สร้างสภาพแวดล้อมใหม่", + "created": "สร้างสภาพแวดล้อมแล้ว", + "current_value": "ค่าปัจจุบัน", + "deleted": "ลบตัวแปรสภาพแวดล้อมแล้ว", + "duplicated": "ทำสำเนาสภาพแวดล้อมแล้ว", + "edit": "แก้ไขสภาพแวดล้อม", + "empty_variables": "ไม่มีตัวแปร", + "global": "Global", + "global_variables": "ตัวแปร Global", + "import_or_create": "นำเข้าหรือสร้างสภาพแวดล้อม", + "initial_value": "ค่าเริ่มต้น", + "invalid_name": "โปรดระบุชื่อสำหรับสภาพแวดล้อม", + "list": "ตัวแปรสภาพแวดล้อม", + "my_environments": "สภาพแวดล้อมส่วนตัว", + "name": "ชื่อ", + "nested_overflow": "ตัวแปรสภาพแวดล้อมแบบซ้อนจำกัดอยู่ที่ 10 ระดับ", + "new": "สภาพแวดล้อมใหม่", + "no_active_environment": "ไม่มีสภาพแวดล้อมที่ใช้งานอยู่", + "no_environment": "ไม่มีสภาพแวดล้อม", + "no_environment_description": "ไม่ได้เลือกสภาพแวดล้อม เลือกว่าจะทำอย่างไรกับตัวแปรต่อไปนี้", + "quick_peek": "ดูสภาพแวดล้อมอย่างรวดเร็ว", + "replace_all_current_with_initial": "แทนที่ค่าปัจจุบันทั้งหมดด้วยค่าเริ่มต้น", + "replace_all_initial_with_current": "แทนที่ค่าเริ่มต้นทั้งหมดด้วยค่าปัจจุบัน", + "replace_current_with_initial": "แทนที่ด้วยค่าเริ่มต้น", + "replace_initial_with_current": "แทนที่ด้วยค่าปัจจุบัน", + "replace_with_variable": "แทนที่ด้วยตัวแปร", + "scope": "ขอบเขต", + "secrets": "Secrets", + "secret_value": "ค่า Secret", + "select": "เลือกสภาพแวดล้อม", + "set": "ตั้งค่าสภาพแวดล้อม", + "set_as_environment": "ตั้งเป็นสภาพแวดล้อม", + "short_name": "ชื่อสภาพแวดล้อมต้องมีอย่างน้อย 1 ตัวอักษร", + "team_environments": "สภาพแวดล้อมของพื้นที่ทำงาน", + "title": "สภาพแวดล้อม", + "updated": "อัปเดตสภาพแวดล้อมแล้ว", + "value": "ค่า", + "variable": "ตัวแปร", + "variables": "ตัวแปร", + "variable_list": "รายการตัวแปร", + "properties": "คุณสมบัติสภาพแวดล้อม", + "details": "รายละเอียด" + }, + "error": { + "network": { + "heading": "ข้อผิดพลาดเครือข่าย", + "description": "การเชื่อมต่อเครือข่ายล้มเหลว {message}: {cause}" + }, + "timeout": { + "heading": "ข้อผิดพลาดหมดเวลา", + "description": "คำขอหมดเวลาในระหว่าง {phase} {message}" + }, + "certificate": { + "heading": "ข้อผิดพลาดใบรับรอง", + "description": "ใบรับรองไม่ถูกต้อง {message}: {cause}" + }, + "auth": { + "heading": "ข้อผิดพลาดการตรวจสอบสิทธิ์", + "description": "การเข้าถึงถูกปฏิเสธ {message}: {cause}" + }, + "proxy": { + "heading": "ข้อผิดพลาด Proxy", + "description": "การเชื่อมต่อ Proxy ล้มเหลว {message}: {cause}" + }, + "parse": { + "heading": "ข้อผิดพลาดการแยกวิเคราะห์", + "description": "ไม่สามารถแยกวิเคราะห์การตอบกลับได้ {message}: {cause}" + }, + "version": { + "heading": "ข้อผิดพลาดเวอร์ชัน", + "description": "เวอร์ชันไม่เข้ากัน {message}: {cause}" + }, + "abort": { + "heading": "คำขอถูกยกเลิก", + "description": "การดำเนินการถูกยกเลิก {message}: {cause}" + }, + "unknown": { + "heading": "ข้อผิดพลาดที่ไม่รู้จัก", + "description": "เกิดข้อผิดพลาดที่ไม่รู้จัก", + "cause": "สาเหตุที่ไม่รู้จัก" + }, + "extension": { + "heading": "ข้อผิดพลาดส่วนขยาย", + "description": "การเรียกใช้คำขอบนส่วนขยายล้มเหลว" + }, + "authproviders_load_error": "ไม่สามารถโหลดผู้ให้บริการการตรวจสอบสิทธิ์ได้", + "browser_support_sse": "เบราว์เซอร์นี้ดูเหมือนจะไม่รองรับ Server Sent Events", + "check_console_details": "ตรวจสอบบันทึกคอนโซลเพื่อดูรายละเอียด", + "check_how_to_add_origin": "ตรวจสอบวิธีการเพิ่ม origin", + "curl_invalid_format": "cURL มีรูปแบบไม่ถูกต้อง", + "danger_zone": "โซนอันตราย", + "delete_account": "ปัจจุบันบัญชีของคุณเป็นเจ้าของเพียงผู้เดียวในพื้นที่ทำงานเหล่านี้:", + "delete_account_description": "คุณต้องนำตัวเองออก โอนความเป็นเจ้าของ หรือลบพื้นที่ทำงานเหล่านี้ก่อนจึงจะสามารถลบบัญชีของคุณได้", + "delete_activity_log": "ลบบันทึกกิจกรรมล้มเหลว", + "delete_all_activity_logs": "ลบบันทึกกิจกรรมทั้งหมดล้มเหลว", + "email_already_exists": "อีเมลนี้มีอยู่แล้วกับบัญชีอื่น โปรดตั้งค่าที่อยู่อีเมลอื่น", + "empty_email_address": "ที่อยู่อีเมลต้องไม่ว่างเปล่า", + "empty_profile_name": "ชื่อโปรไฟล์ต้องไม่ว่างเปล่า", + "empty_req_name": "ชื่อคำขอว่างเปล่า", + "fetch_activity_logs": "ดึงบันทึกกิจกรรมล้มเหลว", + "f12_details": "(กด F12 เพื่อดูรายละเอียด)", + "gql_prettify_invalid_query": "ไม่สามารถจัดรูปแบบเคียวรีที่ไม่ถูกต้องได้ โปรดแก้ไขข้อผิดพลาดไวยากรณ์ของเคียวรีแล้วลองอีกครั้ง", + "incomplete_config_urls": "URL การกำหนดค่าไม่สมบูรณ์", + "incorrect_email": "อีเมลไม่ถูกต้อง", + "invalid_file_type": "ชนิดไฟล์ไม่ถูกต้องสำหรับ `{filename}`", + "invalid_link": "ลิงก์ไม่ถูกต้อง", + "invalid_link_description": "ลิงก์ที่คุณคลิกไม่ถูกต้องหรือหมดอายุแล้ว", + "invalid_embed_link": "การฝังนี้ไม่มีอยู่หรือไม่ถูกต้อง", + "json_parsing_failed": "JSON ไม่ถูกต้อง", + "json_prettify_invalid_body": "ไม่สามารถจัดรูปแบบเนื้อหาที่ไม่ถูกต้องได้ โปรดแก้ไขข้อผิดพลาดไวยากรณ์ json แล้วลองอีกครั้ง", + "network_error": "ดูเหมือนจะมีข้อผิดพลาดเครือข่าย โปรดลองอีกครั้ง", + "network_fail": "ไม่สามารถส่งคำขอได้", + "no_collections_to_export": "ไม่มีคอลเลกชันให้ส่งออก โปรดสร้างคอลเลกชันเพื่อเริ่มต้น", + "no_duration": "ไม่มีระยะเวลา", + "no_environments_to_export": "ไม่มีสภาพแวดล้อมให้ส่งออก โปรดสร้างสภาพแวดล้อมเพื่อเริ่มต้น", + "no_results_found": "ไม่พบรายการที่ตรงกัน", + "page_not_found": "ไม่พบหน้านี้", + "please_install_extension": "โปรดติดตั้งส่วนขยายและเพิ่ม origin ลงในส่วนขยาย", + "proxy_error": "ข้อผิดพลาด Proxy", + "same_email_address": "ที่อยู่อีเมลที่อัปเดตเหมือนกับที่อยู่อีเมลปัจจุบัน", + "same_profile_name": "ชื่อโปรไฟล์ที่อัปเดตเหมือนกับชื่อโปรไฟล์ปัจจุบัน", + "script_fail": "ไม่สามารถเรียกใช้สคริปต์ก่อนคำขอได้", + "something_went_wrong": "เกิดข้อผิดพลาดบางอย่าง", + "subscription_error": "สมัครรับข้อมูลหัวข้อล้มเหลว: {error}", + "post_request_script_fail": "ไม่สามารถเรียกใช้สคริปต์หลังคำขอได้", + "reading_files": "เกิดข้อผิดพลาดขณะอ่านไฟล์หนึ่งไฟล์หรือมากกว่า", + "fetching_access_tokens_list": "เกิดข้อผิดพลาดบางอย่างขณะดึงรายการโทเค็น", + "generate_access_token": "เกิดข้อผิดพลาดบางอย่างขณะสร้างโทเค็นการเข้าถึง", + "delete_access_token": "เกิดข้อผิดพลาดบางอย่างขณะลบโทเค็นการเข้าถึง", + "extension_not_found": "ไม่พบส่วนขยาย", + "invalid_request": "ข้อมูลคำขอไม่ถูกต้อง" + }, + "export": { + "as_json": "ส่งออกเป็น JSON", + "as_openapi": "ส่งออกเป็น OpenAPI", + "as_yaml": "ส่งออกเป็น YAML", + "choose_format": "เลือกรูปแบบการส่งออก", + "collection": "ส่งออกคอลเลกชัน", + "collections": "ส่งออกคอลเลกชัน", + "format_hoppscotch": "ส่งออกเป็น Hoppscotch JSON", + "format_openapi_json": "ส่งออกเป็น OpenAPI 3.1 (JSON)", + "format_openapi_yaml": "ส่งออกเป็น OpenAPI 3.1 (YAML)", + "openapi_lossy_summary": "การส่งออก OpenAPI จะตัดสคริปต์ ข้อมูลรับรองการให้สิทธิ์ รายการที่ไม่ได้ใช้งาน เส้นทางที่ซ้ำกัน และรหัสสถานะการตอบกลับที่ซ้ำกันออก", + "create_secret_gist": "สร้าง Gist ลับ", + "create_secret_gist_tooltip_text": "ส่งออกเป็น Gist ลับ", + "failed": "เกิดข้อผิดพลาดบางอย่างขณะส่งออก", + "secret_gist_success": "ส่งออกเป็น Gist ลับสำเร็จ", + "require_github": "เข้าสู่ระบบด้วย GitHub เพื่อสร้าง Gist ลับ", + "title": "ส่งออก", + "success": "ส่งออกสำเร็จ" + }, + "file_upload": { + "choose_file": "เลือกไฟล์", + "max_size_format": "สูงสุด 5MB รองรับ JPEG, PNG, GIF, WebP", + "profile_photo_updated": "อัปเดตรูปโปรไฟล์สำเร็จ", + "profile_photo_removed": "นำรูปโปรไฟล์ออกสำเร็จ", + "org_logo_updated": "อัปเดตโลโก้องค์กรสำเร็จ", + "error_size_limit": "ขนาดไฟล์ต้องน้อยกว่า 5MB", + "error_invalid_format": "ไฟล์ต้องเป็นรูปภาพ (JPEG, PNG, GIF หรือ WebP)", + "error_invalid_upload_type": "ประเภทการอัปโหลดไม่ถูกต้อง", + "error_invalid_org_id": "รูปแบบ ID องค์กรไม่ถูกต้อง", + "error_upload_failed": "อัปโหลดล้มเหลว กรุณาลองใหม่อีกครั้ง", + "error_network_failed": "เกิดข้อผิดพลาดของเครือข่าย กรุณาตรวจสอบการเชื่อมต่อของคุณ", + "error_timeout": "การอัปโหลดหมดเวลาหลังจาก 30 วินาที กรุณาลองใหม่อีกครั้ง", + "error_missing_backend_url": "ยังไม่ได้กำหนดค่า URL ของแบ็กเอนด์ กรุณาตั้งค่าตัวแปรสภาพแวดล้อม VITE_BACKEND_API_URL ในการตั้งค่าสภาพแวดล้อมของคุณ", + "error_invalid_backend_url": "การกำหนดค่า URL ของแบ็กเอนด์ไม่ถูกต้อง" + }, + "filename": { + "cookie_key_value_pairs": "Cookie", + "codegen": "{request_name} - code", + "graphql_response": "GraphQL-Response", + "lens": "{request_name} - response", + "realtime_response": "Realtime-Response", + "response_interface": "Response-Interface" + }, + "filter": { + "all": "ทั้งหมด", + "none": "ไม่มี", + "starred": "ติดดาว" + }, + "folder": { + "created": "สร้างโฟลเดอร์แล้ว", + "edit": "แก้ไขโฟลเดอร์", + "invalid_name": "โปรดระบุชื่อสำหรับโฟลเดอร์", + "name_length_insufficient": "ชื่อโฟลเดอร์ควรมีความยาวอย่างน้อย 3 ตัวอักษร", + "new": "โฟลเดอร์ใหม่", + "run": "เรียกใช้โฟลเดอร์", + "renamed": "เปลี่ยนชื่อโฟลเดอร์แล้ว", + "sorted": "จัดเรียงโฟลเดอร์แล้ว" + }, + "graphql": { + "arguments": "อาร์กิวเมนต์", + "connection_switch_confirm": "คุณต้องการเชื่อมต่อกับปลายทาง GraphQL ล่าสุดหรือไม่?", + "connection_error_http": "ไม่สามารถดึง GraphQL Schema ได้เนื่องจากข้อผิดพลาดของเครือข่าย", + "connection_switch_new_url": "การสลับไปยังแท็บจะตัดการเชื่อมต่อคุณจากการเชื่อมต่อ GraphQL ที่ใช้งานอยู่ URL การเชื่อมต่อใหม่คือ", + "connection_switch_url": "คุณเชื่อมต่อกับปลายทาง GraphQL แล้ว URL การเชื่อมต่อคือ", + "deprecated": "เลิกใช้แล้ว", + "fields": "ฟิลด์", + "mutation": "Mutation", + "mutations": "Mutations", + "schema": "Schema", + "show_depricated_values": "แสดงค่าที่เลิกใช้แล้ว", + "subscription": "Subscription", + "subscriptions": "Subscriptions", + "switch_connection": "สลับการเชื่อมต่อ", + "url_placeholder": "ป้อน URL ปลายทาง GraphQL", + "query": "เคียวรี" + }, + "graphql_collections": { + "title": "GraphQL Collections" + }, + "group": { + "time": "เวลา", + "url": "URL" + }, + "header": { + "install_pwa": "ติดตั้งแอป", + "login": "เข้าสู่ระบบ", + "save_workspace": "บันทึกพื้นที่ทำงานของฉัน" + }, + "helpers": { + "authorization": "ส่วนหัวการให้สิทธิ์จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณส่งคำขอ", + "collection_properties_authorization": " การให้สิทธิ์นี้จะถูกตั้งค่าสำหรับทุกคำขอในคอลเลกชันนี้", + "collection_properties_header": "ส่วนหัวนี้จะถูกตั้งค่าสำหรับทุกคำขอในคอลเลกชันนี้", + "collection_properties_scripts": "สคริปต์เหล่านี้จะทำงานสำหรับทุกคำขอในคอลเลกชันนี้ สคริปต์ก่อนคำขอจะทำงานก่อนคำขอ ส่วนสคริปต์ทดสอบจะทำงานหลังการตอบกลับ", + "generate_documentation_first": "สร้างเอกสารก่อน", + "network_fail": "ไม่สามารถเข้าถึงปลายทาง API ได้ ตรวจสอบการเชื่อมต่อเครือข่ายของคุณหรือเลือก Interceptor อื่นแล้วลองอีกครั้ง", + "offline": "คุณกำลังใช้ Hoppscotch แบบออฟไลน์ การอัปเดตจะซิงค์เมื่อคุณออนไลน์ ตามการตั้งค่าพื้นที่ทำงาน", + "offline_short": "คุณกำลังใช้ Hoppscotch แบบออฟไลน์", + "post_request_tests": "สคริปต์หลังคำขอเขียนด้วย JavaScript และจะทำงานหลังจากได้รับการตอบกลับ", + "pre_request_script": "สคริปต์ก่อนคำขอเขียนด้วย JavaScript และจะทำงานก่อนที่จะส่งคำขอ", + "script_fail": "ดูเหมือนว่าจะมีข้อผิดพลาดในสคริปต์ก่อนคำขอ ตรวจสอบข้อผิดพลาดด้านล่างและแก้ไขสคริปต์ให้ถูกต้อง", + "post_request_script_fail": "ดูเหมือนว่าจะมีข้อผิดพลาดในสคริปต์หลังคำขอ โปรดแก้ไขข้อผิดพลาดและรันการทดสอบอีกครั้ง", + "post_request_script": "เขียนสคริปต์หลังคำขอเพื่อทำการดีบักอัตโนมัติ" + }, + "hide": { + "collection": "ยุบแผงคอลเลกชัน", + "more": "ซ่อนเพิ่มเติม", + "preview": "ซ่อนตัวอย่าง", + "sidebar": "ยุบแถบด้านข้าง", + "password": "ซ่อนรหัสผ่าน" + }, + "import": { + "collections": "นำเข้าคอลเลกชัน", + "curl": "นำเข้า cURL", + "environments_from_gist": "นำเข้าจาก Gist", + "environments_from_gist_description": "นำเข้าสภาพแวดล้อมของ Hoppscotch จาก Gist", + "failed": "เกิดข้อผิดพลาดขณะนำเข้า: ไม่รู้จักรูปแบบ", + "from_file": "นำเข้าจากไฟล์", + "from_gist": "นำเข้าจาก Gist", + "from_gist_description": "นำเข้าจาก URL ของ Gist", + "from_gist_import_summary": "นำเข้าฟีเจอร์ทั้งหมดของ hoppscotch แล้ว", + "from_hoppscotch_importer_summary": "นำเข้าฟีเจอร์ทั้งหมดของ hoppscotch แล้ว", + "from_insomnia": "นำเข้าจาก Insomnia", + "from_insomnia_description": "นำเข้าจากคอลเลกชัน Insomnia", + "from_insomnia_import_summary": "คอลเลกชันและคำขอจะถูกนำเข้า", + "from_json": "นำเข้าจาก Hoppscotch", + "from_json_description": "นำเข้าจากไฟล์คอลเลกชัน Hoppscotch", + "from_my_collections": "นำเข้าจากคอลเลกชันส่วนตัว", + "from_my_collections_description": "นำเข้าจากไฟล์คอลเลกชันส่วนตัว", + "from_all_collections": "นำเข้าจากพื้นที่ทำงานอื่น", + "from_all_collections_description": "นำเข้าคอลเลกชันใด ๆ จากพื้นที่ทำงานอื่นมายังพื้นที่ทำงานปัจจุบัน", + "from_openapi": "นำเข้าจาก OpenAPI", + "from_openapi_description": "นำเข้าจากไฟล์ข้อกำหนด OpenAPI (YML/JSON)", + "from_openapi_import_summary": "คอลเลกชัน ( จะถูกสร้างจากแท็ก ), คำขอ และตัวอย่างการตอบกลับจะถูกนำเข้า", + "from_postman": "นำเข้าจาก Postman", + "from_postman_description": "นำเข้าจากคอลเลกชัน Postman", + "from_postman_import_summary": "คอลเลกชัน คำขอ และตัวอย่างการตอบกลับจะถูกนำเข้า", + "import_scripts": "นำเข้าสคริปต์", + "import_scripts_description": "รองรับ Postman Collection v2.0/v2.1", + "from_url": "นำเข้าจาก URL", + "gist_url": "ป้อน URL ของ Gist", + "from_har": "นำเข้าจาก HAR", + "from_har_description": "นำเข้าจากไฟล์ HAR", + "from_har_import_summary": "คำขอจะถูกนำเข้าไปยังคอลเลกชันเริ่มต้น", + "gql_collections_from_gist_description": "นำเข้าคอลเลกชัน GraphQL จาก Gist", + "hoppscotch_environment": "สภาพแวดล้อม Hoppscotch", + "hoppscotch_environment_description": "นำเข้าไฟล์ JSON สภาพแวดล้อมของ Hoppscotch", + "import_from_url_invalid_fetch": "ไม่สามารถดึงข้อมูลจาก URL ได้", + "import_from_url_invalid_file_format": "เกิดข้อผิดพลาดขณะนำเข้าคอลเลกชัน", + "import_from_url_invalid_type": "ประเภทที่ไม่รองรับ ค่าที่ยอมรับได้คือ 'hoppscotch', 'openapi', 'postman', 'insomnia'", + "import_from_url_success": "นำเข้าคอลเลกชันแล้ว", + "insomnia_environment_description": "นำเข้าสภาพแวดล้อม Insomnia จากไฟล์ JSON/YAML", + "json_description": "นำเข้าคอลเลกชันจากไฟล์ JSON คอลเลกชันของ Hoppscotch", + "postman_environment": "สภาพแวดล้อม Postman", + "postman_environment_description": "นำเข้าสภาพแวดล้อม Postman จากไฟล์ JSON", + "title": "นำเข้า", + "file_size_limit_exceeded_warning_multiple_files": "ไฟล์ที่เลือกเกินขีดจำกัดที่แนะนำ {sizeLimit}MB จะนำเข้าเฉพาะ {files} ไฟล์แรกที่เลือกเท่านั้น", + "file_size_limit_exceeded_warning_single_file": "ไฟล์ที่เลือกในขณะนี้เกินขีดจำกัดที่แนะนำ {sizeLimit}MB กรุณาเลือกไฟล์อื่น", + "success": "นำเข้าสำเร็จ", + "import_summary_collections_title": "คอลเลกชัน", + "import_summary_requests_title": "คำขอ", + "import_summary_responses_title": "การตอบกลับ", + "import_summary_pre_request_scripts_title": "สคริปต์ก่อนคำขอ", + "import_summary_post_request_scripts_title": "สคริปต์หลังคำขอ", + "import_summary_not_supported_by_hoppscotch_import": "ขณะนี้เรายังไม่รองรับการนำเข้า {featureLabel} จากแหล่งนี้", + "import_summary_script_found": "พบสคริปต์แต่ไม่ได้นำเข้า", + "import_summary_scripts_found": "พบสคริปต์แต่ไม่ได้นำเข้า", + "import_summary_enable_experimental_sandbox": "หากต้องการนำเข้าสคริปต์ Postman ให้เปิดใช้งาน 'Experimental scripting sandbox' ในการตั้งค่า หมายเหตุ: ฟีเจอร์นี้อยู่ในขั้นทดลอง", + "cors_error_modal": { + "title": "ตรวจพบข้อผิดพลาด CORS", + "description": "การนำเข้าล้มเหลวเนื่องจากข้อจำกัด CORS (Cross-Origin Resource Sharing) ที่กำหนดโดยเซิร์ฟเวอร์", + "explanation": "นี่เป็นฟีเจอร์ด้านความปลอดภัยที่ป้องกันไม่ให้หน้าเว็บส่งคำขอไปยังโดเมนอื่น คุณสามารถลองใหม่โดยใช้บริการพร็อกซีของเราเพื่อหลีกเลี่ยงข้อจำกัดนี้ได้", + "url_label": "URL ที่พยายามเข้าถึง", + "retry_with_proxy": "ลองใหม่ด้วยพร็อกซี" + } + }, + "instances": { + "switch": "สลับอินสแตนซ์ Hoppscotch", + "enter_server_url": "เชื่อมต่อกับอินสแตนซ์ที่โฮสต์เอง", + "already_connected": "คุณเชื่อมต่อกับอินสแตนซ์นี้อยู่แล้ว", + "recent_connections": "การเชื่อมต่อล่าสุด", + "add_instance": "เพิ่มอินสแตนซ์", + "add_new": "เพิ่มอินสแตนซ์ใหม่", + "confirm_remove": "ยืนยันการนำออก", + "remove_warning": "คุณแน่ใจหรือไม่ว่าต้องการนำอินสแตนซ์นี้ออก?", + "clear_cached_bundles": "ล้างบันเดิลที่แคชไว้", + "opening_add_modal": "กำลังเปิดกล่องโต้ตอบเพิ่มอินสแตนซ์", + "closed_add_modal": "ปิดกล่องโต้ตอบเพิ่มอินสแตนซ์แล้ว", + "cancelled_removal": "ยกเลิกการนำอินสแตนซ์ออกแล้ว", + "connection_cancelled": "การเชื่อมต่อถูกยกเลิกโดยการตรวจสอบก่อนเชื่อมต่อ", + "post_connect_completed": "การตั้งค่าหลังการเชื่อมต่อเสร็จสมบูรณ์", + "connecting": "กำลังเชื่อมต่อกับอินสแตนซ์...", + "confirm_removal": "ยืนยันการนำอินสแตนซ์ออก", + "removal_cancelled": "การนำอินสแตนซ์ออกถูกยกเลิกโดยการตรวจสอบก่อนนำออก", + "post_remove_completed": "การล้างข้อมูลหลังการนำออกเสร็จสมบูรณ์", + "removing": "กำลังนำอินสแตนซ์ออก...", + "clearing_cache": "กำลังล้างแคช...", + "initialized": "เริ่มต้นตัวสลับอินสแตนซ์แล้ว", + "connecting_state": "กำลังสร้างการเชื่อมต่อ...", + "connected_state": "เชื่อมต่อกับอินสแตนซ์สำเร็จ", + "disconnected_state": "ตัดการเชื่อมต่อจากอินสแตนซ์แล้ว", + "stream_error": "การตรวจสอบสถานะการเชื่อมต่อล้มเหลว", + "recent_instances_error": "ไม่สามารถโหลดอินสแตนซ์ล่าสุดได้", + "instance_changed": "สลับไปยังอินสแตนซ์แล้ว", + "current_instance_error": "ไม่สามารถติดตามอินสแตนซ์ปัจจุบันได้", + "not_available": "ไม่สามารถใช้การสลับอินสแตนซ์ได้", + "cleanup_completed": "การล้างข้อมูลตัวสลับอินสแตนซ์เสร็จสมบูรณ์", + "self_hosted": "อินสแตนซ์ที่โฮสต์เอง" + }, + "inspections": { + "description": "ตรวจสอบข้อผิดพลาดที่อาจเกิดขึ้น", + "environment": { + "add_environment": "เพิ่มลงในสภาพแวดล้อม", + "add_environment_value": "เพิ่มค่า", + "empty_value": "ค่าสภาพแวดล้อมว่างเปล่าสำหรับตัวแปร '{variable}' ", + "not_found": "ไม่พบตัวแปรสภาพแวดล้อม '{environment}'" + }, + "header": { + "cookie": "เบราว์เซอร์ไม่อนุญาตให้ Hoppscotch ตั้งค่าส่วนหัว Cookie โปรดใช้ส่วนหัวการให้สิทธิ์แทน อย่างไรก็ตาม แอป Hoppscotch Desktop ของเราเปิดให้ใช้งานแล้วและรองรับ Cookies" + }, + "response": { + "401_error": "โปรดตรวจสอบข้อมูลรับรองการตรวจสอบสิทธิ์ของคุณ", + "404_error": "โปรดตรวจสอบ URL ของคำขอและชนิดเมธอด", + "cors_error": "โปรดตรวจสอบการกำหนดค่า Cross-Origin Resource Sharing ของคุณ", + "default_error": "โปรดตรวจสอบคำขอของคุณ", + "network_error": "โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณ" + }, + "title": "ตัวตรวจสอบ", + "url": { + "extension_not_installed": "ไม่ได้ติดตั้งส่วนขยาย", + "extension_unknown_origin": "ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม origin ของจุดสิ้นสุด API ลงในรายการ Hoppscotch Browser Extension แล้ว", + "extention_enable_action": "เปิดใช้งาน Browser Extension", + "extention_not_enabled": "ไม่ได้เปิดใช้งานส่วนขยาย", + "localaccess_unsupported": "ตัวสกัดกั้นปัจจุบันไม่รองรับการเข้าถึงภายในเครื่อง โปรดพิจารณาใช้ตัวสกัดกั้น Agent, Extension หรือแอป Desktop" + }, + "auth": { + "digest": "แนะนำให้ใช้ตัวสกัดกั้น Agent บนเว็บแอปหรือตัวสกัดกั้น Native บนแอป Desktop เมื่อใช้การให้สิทธิ์ Digest", + "hawk": "แนะนำให้ใช้ตัวสกัดกั้น Agent บนเว็บแอปหรือตัวสกัดกั้น Native บนแอป Desktop เมื่อใช้การให้สิทธิ์ Hawk" + }, + "body": { + "binary": "ยังไม่รองรับการส่งข้อมูลไบนารีผ่านตัวสกัดกั้นปัจจุบัน" + }, + "scripting_interceptor": { + "pre_request": "สคริปต์ก่อนคำขอ", + "post_request": "สคริปต์หลังคำขอ", + "both_scripts": "สคริปต์ก่อนคำขอและหลังคำขอ", + "unsupported_interceptor": "{scriptType} ของคุณใช้ {apiUsed} เพื่อการเรียกใช้สคริปต์ที่เชื่อถือได้ โปรดเปลี่ยนไปใช้ตัวสกัดกั้น Agent (เว็บแอป) หรือตัวสกัดกั้น Native (แอป Desktop) ตัวสกัดกั้น {interceptor} รองรับการเรียกใช้สคริปต์คำขอได้จำกัดและอาจทำงานไม่เป็นไปตามที่คาดไว้", + "same_origin_csrf_warning": "คำเตือนความปลอดภัย: {scriptType} ของคุณส่งคำขอแบบ same-origin โดยใช้ {apiUsed} เนื่องจากแพลตฟอร์มนี้ใช้การตรวจสอบสิทธิ์แบบคุกกี้ คำขอเหล่านี้จะรวมคุกกี้เซสชันของคุณโดยอัตโนมัติ ซึ่งอาจทำให้สคริปต์ที่เป็นอันตรายดำเนินการที่ไม่ได้รับอนุญาตได้ โปรดใช้ตัวสกัดกั้น Agent สำหรับคำขอแบบ same-origin หรือเรียกใช้เฉพาะสคริปต์ที่คุณเชื่อถือเท่านั้น" + } + }, + "interceptor": { + "native": { + "name": "เนทีฟ", + "settings_title": "เนทีฟ" + }, + "agent": { + "name": "Agent", + "settings_title": "Agent" + }, + "proxy": { + "name": "Proxy", + "settings_title": "Proxy" + }, + "browser": { + "name": "เบราว์เซอร์", + "settings_title": "เบราว์เซอร์" + }, + "extension": { + "name": "ส่วนขยาย", + "settings_title": "ส่วนขยาย" + } + }, + "layout": { + "collapse_collection": "ยุบหรือขยายคอลเลกชัน", + "collapse_sidebar": "ยุบหรือขยายแถบด้านข้าง", + "column": "เลย์เอาต์แนวตั้ง", + "name": "เลย์เอาต์", + "row": "เลย์เอาต์แนวนอน" + }, + "modal": { + "close_unsaved_tab": "คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก", + "collections": "คอลเลกชัน", + "confirm": "ยืนยัน", + "customize_request": "ปรับแต่งคำขอ", + "edit_request": "แก้ไขคำขอ", + "edit_response": "แก้ไขการตอบกลับ", + "import_export": "นำเข้า / ส่งออก", + "response_name": "ชื่อการตอบกลับ", + "share_request": "แชร์คำขอ" + }, + "mqtt": { + "already_subscribed": "คุณได้สมัครรับข้อมูลหัวข้อนี้แล้ว", + "clean_session": "Clean Session", + "clear_input": "ล้างอินพุต", + "clear_input_on_send": "ล้างอินพุตเมื่อส่ง", + "client_id": "Client ID", + "color": "เลือกสี", + "communication": "การสื่อสาร", + "connection_config": "การกำหนดค่าการเชื่อมต่อ", + "connection_not_authorized": "การเชื่อมต่อ MQTT นี้ไม่ได้ใช้การตรวจสอบสิทธิ์ใดๆ", + "invalid_topic": "โปรดระบุหัวข้อสำหรับการสมัครรับข้อมูล", + "keep_alive": "Keep Alive", + "log": "บันทึก", + "lw_message": "ข้อความ Last-Will", + "lw_qos": "Last-Will QoS", + "lw_retain": "Last-Will Retain", + "lw_topic": "หัวข้อ Last-Will", + "message": "ข้อความ", + "new": "การสมัครรับข้อมูลใหม่", + "not_connected": "โปรดเริ่มการเชื่อมต่อ MQTT ก่อน", + "publish": "เผยแพร่", + "qos": "QoS", + "ssl": "SSL", + "subscribe": "สมัครรับข้อมูล", + "topic": "หัวข้อ", + "topic_name": "ชื่อหัวข้อ", + "topic_title": "เผยแพร่ / สมัครรับข้อมูลหัวข้อ", + "unsubscribe": "ยกเลิกการสมัครรับข้อมูล", + "url": "URL" + }, + "navigation": { + "admin_dashboard": "แดชบอร์ด", + "doc": "เอกสาร", + "graphql": "GraphQL", + "profile": "โปรไฟล์", + "realtime": "เรียลไทม์", + "rest": "REST", + "mock_servers": "Mock Server", + "settings": "การตั้งค่า", + "goto_app": "ไปที่แอป", + "authentication": "การยืนยันตัวตน" + }, + "mock_server": { + "confirm_delete_log": "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกนี้?", + "create_mock_server": "กำหนดค่า Mock Server", + "mock_server_configuration": "การกำหนดค่า Mock Server", + "mock_server_name": "ชื่อ Mock Server", + "mock_server_name_placeholder": "กรอกชื่อ mock server", + "base_url": "Base URL", + "start_server": "เริ่มเซิร์ฟเวอร์", + "stop_server": "หยุดเซิร์ฟเวอร์", + "mock_server_created": "สร้าง mock server สำเร็จแล้ว", + "mock_server_started": "เริ่ม mock server สำเร็จแล้ว", + "mock_server_stopped": "หยุด mock server สำเร็จแล้ว", + "active": "Mock server กำลังทำงาน", + "inactive": "Mock server ไม่ได้ทำงาน", + "edit_mock_server": "แก้ไข Mock Server", + "path_based_url": "URL แบบอิงพาธ", + "subdomain_based_url": "URL แบบอิงซับโดเมน", + "mock_server_updated": "อัปเดต mock server สำเร็จแล้ว", + "no_collection": "ไม่มีคอลเลกชัน", + "collection_deleted": "คอลเลกชันที่เชื่อมโยงถูกลบแล้ว", + "private_access_hint": "สำหรับ mock server แบบส่วนตัว ให้ใส่ส่วนหัว 'x-api-key' พร้อม Personal Access Token ของคุณ (สร้างได้จากโปรไฟล์ของคุณ)", + "private_access_instruction": "หากต้องการเข้าถึง mock server ส่วนตัวนี้ ให้ใส่ส่วนหัว 'x-api-key' พร้อม Personal Access Token ของคุณ", + "create_token_here": "สร้างที่นี่", + "status": "สถานะ", + "server_running": "เซิร์ฟเวอร์กำลังทำงาน", + "server_stopped": "เซิร์ฟเวอร์หยุดทำงาน", + "delay_ms": "การหน่วงเวลาการตอบกลับ (มิลลิวินาที)", + "delay_placeholder": "กรอกการหน่วงเวลาเป็นมิลลิวินาที", + "delay_description": "เพิ่มการหน่วงเวลาเทียมให้กับการตอบกลับจำลอง", + "public_access": "การเข้าถึงสาธารณะ", + "public": "สาธารณะ", + "private": "ส่วนตัว", + "public_description": "ใครก็ตามที่มี URL สามารถเข้าถึง mock server นี้ได้", + "private_description": "เฉพาะผู้ใช้ที่ยืนยันตัวตนแล้วเท่านั้นที่สามารถเข้าถึง mock server นี้ได้", + "select_collection": "เลือกคอลเลกชัน", + "select_collection_error": "โปรดเลือกคอลเลกชัน", + "invalid_collection_error": "ไม่สามารถสร้าง mock server สำหรับคอลเลกชันได้", + "url_copied": "คัดลอก URL ไปยังคลิปบอร์ดแล้ว", + "make_public": "ทำให้เป็นสาธารณะ", + "view_logs": "ดูบันทึก", + "logs_title": "บันทึกของ Mock Server", + "no_logs": "ไม่มีบันทึก", + "request_headers": "ส่วนหัวของคำขอ", + "request_body": "เนื้อหาของคำขอ", + "response_status": "สถานะการตอบกลับ", + "response_headers": "ส่วนหัวของการตอบกลับ", + "response_body": "เนื้อหาของการตอบกลับ", + "log_deleted": "ลบบันทึกสำเร็จแล้ว", + "description": "Mock server ช่วยให้คุณจำลองการตอบกลับของ API โดยอิงจากตัวอย่างการตอบกลับในคอลเลกชันของคุณ", + "set_in_environment": "ตั้งค่าในสภาพแวดล้อม", + "set_in_environment_hint": "URL ของ mock server จะถูกเพิ่มเป็นตัวแปร 'mockUrl' ในสภาพแวดล้อมของคอลเลกชันโดยอัตโนมัติ", + "environment_variable_added": "เพิ่ม Mock URL ไปยังสภาพแวดล้อมแล้ว", + "environment_variable_updated": "อัปเดต Mock URL ในสภาพแวดล้อมแล้ว", + "environment_created_with_variable": "สร้างสภาพแวดล้อมพร้อม Mock URL แล้ว", + "add_example_request": "เพิ่มคำขอตัวอย่าง", + "add_example_request_hint": "คอลเลกชันจะถูกสร้างพร้อมคำขอตัวอย่างที่สาธิตวิธีใช้ mock server", + "create_example_collection": "สร้างคอลเลกชันตัวอย่าง", + "create_example_collection_hint": "สร้างคอลเลกชันตัวอย่างร้านขายสัตว์เลี้ยงพร้อมคำขอตัวอย่าง (GET, POST, PUT, DELETE)", + "creating_example_collection": "กำลังสร้างคอลเลกชันตัวอย่าง...", + "failed_to_create_collection": "ไม่สามารถสร้างคอลเลกชันตัวอย่างได้", + "enable_example_collection_hint": "โปรดเปิดใช้งานสวิตช์ 'สร้างคอลเลกชันตัวอย่าง' สำหรับโหมดคอลเลกชันใหม่", + "new_collection_name_hint": "คอลเลกชันจะถูกสร้างโดยใช้ชื่อเดียวกับ mock server ของคุณ", + "existing_collection": "คอลเลกชันที่มีอยู่", + "new_collection": "คอลเลกชันใหม่" + }, + "preRequest": { + "javascript_code": "โค้ด JavaScript", + "learn": "อ่านเอกสารประกอบ", + "script": "สคริปต์ก่อนคำขอ", + "snippets": "ตัวอย่างโค้ด" + }, + "profile": { + "app_settings": "การตั้งค่าแอป", + "default_hopp_displayname": "ผู้ใช้ที่ไม่มีชื่อ", + "editor": "ผู้แก้ไข", + "editor_description": "ผู้แก้ไขสามารถเพิ่ม แก้ไข และลบคำขอได้", + "email_verification_mail": "ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้ว โปรดคลิกที่ลิงก์เพื่อยืนยันที่อยู่อีเมลของคุณ", + "no_permission": "คุณไม่มีสิทธิ์ในการดำเนินการนี้", + "owner": "เจ้าของ", + "owner_description": "เจ้าของสามารถเพิ่ม แก้ไข และลบคำขอ คอลเลกชัน และสมาชิกพื้นที่ทำงานได้", + "roles": "บทบาท", + "roles_description": "บทบาทใช้เพื่อควบคุมการเข้าถึงคอลเลกชันที่แชร์", + "updated": "อัปเดตโปรไฟล์แล้ว", + "viewer": "ผู้ดู", + "viewer_description": "ผู้ดูสามารถดูและใช้คำขอได้เท่านั้น", + "verified_email_sent": "ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้ว โปรดรีเฟรชหน้าหลังจากยืนยันที่อยู่อีเมลของคุณ คุณจะได้รับอีเมลหากอีเมลนี้ไม่ได้เชื่อมโยงกับบัญชีอื่นใด" + }, + "remove": { + "star": "นำดาวออก" + }, + "request": { + "added": "เพิ่มคำขอแล้ว", + "add": "เพิ่มคำขอ", + "authorization": "การให้สิทธิ์", + "body": "เนื้อหาของคำขอ", + "choose_language": "เลือกภาษา", + "content_type": "Content Type", + "content_type_titles": { + "others": "อื่นๆ", + "structured": "แบบมีโครงสร้าง", + "text": "ข้อความ", + "binary": "ไบนารี" + }, + "show_content_type": "แสดง Content Type", + "different_collection": "ไม่สามารถจัดเรียงคำขอจากคอลเลกชันต่างกันได้", + "duplicated": "ทำสำเนาคำขอแล้ว", + "duration": "ระยะเวลา", + "enter_curl": "กรอกคำสั่ง cURL", + "generate_code": "สร้างโค้ด", + "generated_code": "โค้ดที่สร้างขึ้น", + "go_to_authorization_tab": "ไปที่แท็บการให้สิทธิ์", + "go_to_body_tab": "ไปที่แท็บเนื้อหา", + "header_list": "รายการส่วนหัว", + "invalid_name": "โปรดระบุชื่อสำหรับคำขอ", + "method": "เมธอด", + "moved": "ย้ายคำขอแล้ว", + "name": "ชื่อคำขอ", + "new": "คำขอใหม่", + "order_changed": "อัปเดตลำดับคำขอแล้ว", + "override": "แทนที่", + "override_help": "ตั้งค่า Content-Type ในส่วนหัว", + "overriden": "แทนที่แล้ว", + "parameter_list": "พารามิเตอร์เคียวรี", + "parameters": "พารามิเตอร์", + "path": "พาธ", + "payload": "เพย์โหลด", + "query": "เคียวรี", + "raw_body": "เนื้อหาของคำขอแบบดิบ", + "rename": "เปลี่ยนชื่อคำขอ", + "renamed": "เปลี่ยนชื่อคำขอแล้ว", + "request_variables": "ตัวแปรของคำขอ", + "response_name_exists": "ชื่อการตอบกลับมีอยู่แล้ว", + "run": "เรียกใช้", + "save": "บันทึก", + "save_as": "บันทึกเป็น", + "saved": "บันทึกคำขอแล้ว", + "share": "แชร์", + "share_description": "แชร์ Hoppscotch กับเพื่อนของคุณ", + "share_request": "แชร์คำขอ", + "stop": "หยุด", + "title": "คำขอ", + "type": "ประเภทคำขอ", + "url": "URL", + "url_placeholder": "กรอก URL หรือวางคำสั่ง cURL", + "variables": "ตัวแปร", + "view_my_links": "ดูลิงก์ของฉัน", + "generate_name_error": "ไม่สามารถสร้างชื่อคำขอได้" + }, + "response": { + "audio": "เสียง", + "body": "เนื้อหาการตอบกลับ", + "duplicated": "ทำสำเนาการตอบกลับแล้ว", + "duplicate_name_error": "มีการตอบกลับชื่อเดียวกันอยู่แล้ว", + "filter_response_body": "กรองเนื้อหาการตอบกลับ JSON (ใช้ไวยากรณ์ jq)", + "headers": "ส่วนหัว", + "request_headers": "ส่วนหัวคำขอ", + "html": "HTML", + "image": "รูปภาพ", + "json": "JSON", + "pdf": "PDF", + "please_save_request": "บันทึกคำขอเพื่อสร้างตัวอย่าง", + "preview_html": "ดูตัวอย่าง HTML", + "raw": "ดิบ", + "renamed": "เปลี่ยนชื่อการตอบกลับแล้ว", + "same_name_inspector_warning": "มีชื่อการตอบกลับนี้อยู่แล้วสำหรับคำขอนี้ หากบันทึกจะเขียนทับการตอบกลับที่มีอยู่", + "size": "ขนาด", + "status": "สถานะ", + "time": "เวลา", + "title": "การตอบกลับ", + "video": "วิดีโอ", + "waiting_for_connection": "กำลังรอการเชื่อมต่อ", + "xml": "XML", + "generate_data_schema": "สร้างสคีมาข้อมูล", + "data_schema": "สคีมาข้อมูล", + "saved": "บันทึกการตอบกลับแล้ว", + "invalid_name": "โปรดระบุชื่อสำหรับการตอบกลับ" + }, + "script": { + "inheriting": "กำลังสืบทอดสคริปต์จาก", + "inheriting_from_count": "สืบทอดจาก {count} คอลเลกชัน | สืบทอดจาก {count} คอลเลกชัน", + "inherited_scripts": "สคริปต์ที่สืบทอด", + "view_inherited": "ดูสคริปต์ที่สืบทอด" + }, + "settings": { + "accent_color": "สีเน้น", + "account": "บัญชี", + "account_deleted": "บัญชีของคุณถูกลบแล้ว", + "account_description": "ปรับแต่งการตั้งค่าบัญชีของคุณ", + "account_email_description": "ที่อยู่อีเมลหลักของคุณ", + "account_name_description": "นี่คือชื่อที่แสดงของคุณ", + "additional": "การตั้งค่าเพิ่มเติม", + "agent_not_running": "ไม่พบ Hoppscotch Agent โปรดตรวจสอบว่า Agent กำลังทำงานอยู่หรือไม่", + "agent_not_running_short": "ตรวจสอบสถานะของ Agent", + "agent_running": "Hoppscotch Agent กำลังทำงานอยู่", + "agent_running_short": "Hoppscotch Agent กำลังทำงานอยู่", + "agent_discard_registration": "ยกเลิกการลงทะเบียน Agent", + "agent_registered": "ลงทะเบียน Agent แล้ว", + "agent_registration_successful": "ลงทะเบียน Agent สำเร็จ", + "agent_registration_fetch_failed": "ไม่สามารถดึงข้อมูลการลงทะเบียน Agent ได้ โปรดลงทะเบียน Agent ใหม่อีกครั้ง", + "agent_registration_already_in_progress": "การลงทะเบียน Agent กำลังดำเนินการอยู่ โปรดทำให้เสร็จหรือยกเลิกการลงทะเบียนปัจจุบันแล้วลองอีกครั้ง", + "auto_encode_mode": "อัตโนมัติ", + "auto_encode_mode_tooltip": "เข้ารหัสพารามิเตอร์ในคำขอเฉพาะเมื่อมีอักขระพิเศษบางตัวอยู่เท่านั้น", + "background": "พื้นหลัง", + "black_mode": "ดำ", + "choose_language": "เลือกภาษา", + "dark_mode": "มืด", + "delete_account": "ลบบัญชี", + "delete_account_description": "เมื่อคุณลบบัญชี ข้อมูลทั้งหมดของคุณจะถูกลบอย่างถาวร การกระทำนี้ไม่สามารถยกเลิกได้", + "desktop": "เดสก์ท็อป", + "desktop_description": "อัปเดตพฤติกรรม การจัดการคีย์บอร์ด และการตั้งค่าการแสดงผลสำหรับแอป Hoppscotch บนเดสก์ท็อป", + "desktop_display": "การแสดงผล", + "desktop_keyboard": "คีย์บอร์ด", + "desktop_keyboard_strategy_label": "จับคู่ทางลัดตามตัวอักษรที่พิมพ์หรือตำแหน่งทางกายภาพ", + "desktop_keyboard_strategy_description": "บนเลย์เอาต์ที่ไม่ใช่ QWERTY ตัวอักษรเดียวกันอาจมาจากปุ่มทางกายภาพที่ต่างกัน ค่าเริ่มต้นใช้ได้กับเลย์เอาต์ส่วนใหญ่ ให้สลับตัวเลือกหากทางลัดไม่ทำงานตามที่คาดหวังบนเลย์เอาต์ของคุณ", + "desktop_keyboard_strategy_hybrid": "อัจฉริยะ (แนะนำ)", + "desktop_keyboard_strategy_hybrid_description": "ใช้ตัวอักษรที่พิมพ์สำหรับอักขระละติน และย้อนกลับไปใช้ตำแหน่งปุ่มทางกายภาพสำหรับเลย์เอาต์ที่ไม่ใช่ละติน (ซีริลลิก, CJK)", + "desktop_keyboard_strategy_key": "ตัวอักษรที่พิมพ์", + "desktop_keyboard_strategy_key_description": "ใช้ตัวอักษรที่พิมพ์เสมอ เลือกตัวเลือกนี้หากทางลัดไม่ทำงานตามที่คาดหวังบนเลย์เอาต์ของคุณ", + "desktop_keyboard_strategy_code": "ตำแหน่งปุ่มทางกายภาพ", + "desktop_keyboard_strategy_code_description": "ใช้ตำแหน่งทางกายภาพแบบ US-QWERTY เสมอ เลือกตัวเลือกนี้หากคุณคุ้นเคยกับ QWERTY บนเลย์เอาต์ที่ไม่ใช่ละติน", + "desktop_updates": "การอัปเดต", + "disable_encode_mode_tooltip": "ไม่เข้ารหัสพารามิเตอร์ในคำขอเลย", + "disable_update_checks": "ปิดการตรวจสอบการอัปเดตอัตโนมัติ", + "disable_update_checks_description": "ข้ามการตรวจสอบการอัปเดตเมื่อเริ่มแอป ใช้ปุ่มด้านบนเพื่อตรวจสอบตามต้องการ", + "zoom_level": "ระดับการซูม", + "zoom_level_description": "ปรับขนาดอินเทอร์เฟซทั้งหมด ค่าที่สูงขึ้นจะทำให้ข้อความและการควบคุมใหญ่ขึ้นบนหน้าจอความละเอียดสูง", + "zoom_level_100": "100%", + "zoom_level_110": "110%", + "zoom_level_125": "125%", + "zoom_level_150": "150%", + "enable_encode_mode_tooltip": "เข้ารหัสพารามิเตอร์ในคำขอเสมอ", + "enter_otp": "ป้อนรหัสของ Agent", + "expand_navigation": "ขยายการนำทาง", + "experiments": "การทดลอง", + "experiments_notice": "นี่คือชุดการทดลองที่เรากำลังพัฒนาอยู่ ซึ่งอาจกลายเป็นสิ่งที่มีประโยชน์ สนุก ทั้งสองอย่าง หรือไม่เลยก็ได้ สิ่งเหล่านี้ยังไม่เป็นที่สิ้นสุดและอาจไม่เสถียร ดังนั้นหากมีอะไรแปลก ๆ เกิดขึ้น อย่าตกใจ แค่ปิดมันเสีย พูดเล่นนะ ", + "extension_ver_not_reported": "ไม่ได้รายงาน", + "extension_version": "เวอร์ชันส่วนขยาย", + "extensions": "ส่วนขยายเบราว์เซอร์", + "extensions_use_toggle": "ใช้ส่วนขยายเบราว์เซอร์เพื่อส่งคำขอ (หากมี)", + "follow": "ติดตามเรา", + "general": "ทั่วไป", + "general_description": " การตั้งค่าทั่วไปที่ใช้ในแอปพลิเคชัน", + "interceptor": "Interceptor", + "interceptor_description": "มิดเดิลแวร์ระหว่างแอปพลิเคชันและ API", + "kernel_interceptor": "Interceptor", + "kernel_interceptor_description": "มิดเดิลแวร์ระหว่างแอปพลิเคชันและ API", + "language": "ภาษา", + "light_mode": "สว่าง", + "official_proxy_hosting": "Official Proxy โฮสต์โดย Hoppscotch", + "query_parameters_encoding": "การเข้ารหัสพารามิเตอร์เคียวรี", + "query_parameters_encoding_description": "กำหนดค่าการเข้ารหัสสำหรับพารามิเตอร์เคียวรีในคำขอ", + "profile": "โปรไฟล์", + "profile_description": "อัปเดตรายละเอียดโปรไฟล์ของคุณ", + "profile_email": "ที่อยู่อีเมล", + "profile_name": "ชื่อโปรไฟล์", + "profile_photo": "รูปโปรไฟล์", + "proxy": "Proxy", + "proxy_url": "Proxy URL", + "proxy_url_invalid": "Proxy URL ต้องขึ้นต้นด้วย http(s):// และไม่มีช่องว่าง", + "proxy_use_toggle": "ใช้มิดเดิลแวร์ proxy เพื่อส่งคำขอ", + "read_the": "อ่าน", + "register_agent": "ลงทะเบียน Agent", + "reset_default": "ใช้ Proxy เริ่มต้น", + "short_codes": "รหัสย่อ", + "short_codes_description": "รหัสย่อที่คุณสร้างขึ้น", + "sidebar_on_left": "แถบด้านข้างทางซ้าย", + "ai_experiments": "การทดลอง AI", + "ai_request_naming_style": "รูปแบบการตั้งชื่อคำขอ", + "ai_request_naming_style_descriptive_with_spaces": "อธิบายพร้อมเว้นวรรค", + "ai_request_naming_style_camel_case": "Camel Case ( camelCase )", + "ai_request_naming_style_snake_case": "Snake Case ( snake_case )", + "ai_request_naming_style_pascal_case": "Pascal Case ( PascalCase )", + "ai_request_naming_style_custom": "กำหนดเอง", + "ai_request_naming_style_custom_placeholder": "ป้อนเทมเพลตรูปแบบการตั้งชื่อที่กำหนดเองของคุณ...", + "experimental_scripting_sandbox": "แซนด์บ็อกซ์สำหรับเขียนสคริปต์ (ทดลอง)", + "enable_experimental_mock_servers": "เปิดใช้งาน Mock Servers", + "enable_experimental_documentation": "เปิดใช้งานเอกสารประกอบ", + "sync": "ซิงโครไนซ์", + "sync_collections": "คอลเลกชัน", + "sync_description": "การตั้งค่าเหล่านี้จะถูกซิงค์ไปยังคลาวด์", + "sync_environments": "สภาพแวดล้อม", + "sync_history": "ประวัติ", + "history_disabled": "ประวัติถูกปิดใช้งาน โปรดติดต่อผู้ดูแลระบบขององค์กรเพื่อเปิดใช้งานประวัติ", + "system_mode": "ระบบ", + "telemetry": "เทเลเมทรี", + "telemetry_helps_us": "เทเลเมทรีช่วยให้เราปรับแต่งการดำเนินงานและมอบประสบการณ์ที่ดีที่สุดให้กับคุณ", + "theme": "ธีม", + "theme_description": "ปรับแต่งธีมของแอปพลิเคชันของคุณ", + "update_check_description": "ตรวจสอบเวอร์ชันใหม่และติดตั้งด้วยตนเอง ทำงานได้ไม่ว่าจะตั้งค่าสวิตช์ด้านล่างไว้อย่างไร", + "update_check_now": "ตรวจสอบการอัปเดต", + "update_checking": "กำลังตรวจสอบ…", + "update_download_version": "ดาวน์โหลด v{version}", + "update_downloading": "กำลังดาวน์โหลด…", + "update_downloading_percent": "กำลังดาวน์โหลด {percent}%", + "update_installing": "กำลังติดตั้ง…", + "update_restart_now": "รีสตาร์ทเพื่อใช้การอัปเดต", + "update_up_to_date": "เป็นเวอร์ชันล่าสุดแล้ว", + "use_experimental_url_bar": "ใช้แถบ URL แบบทดลองพร้อมการเน้นสภาพแวดล้อม", + "user": "ผู้ใช้", + "verified_email": "อีเมลที่ยืนยันแล้ว", + "verify_email": "ยืนยันอีเมล", + "validate_certificates": "ตรวจสอบใบรับรอง SSL/TLS", + "verify_host": "ยืนยันโฮสต์", + "verify_peer": "ยืนยันเพียร์", + "follow_redirects": "ติดตามการเปลี่ยนเส้นทาง", + "client_certificates": "ใบรับรองไคลเอนต์", + "certificate_settings": "การตั้งค่าใบรับรอง", + "certificate": "ใบรับรอง", + "key": "คีย์ส่วนตัว", + "pfx_or_p12": "PFX/PKCS#12", + "password": "รหัสผ่าน", + "select_file": "เลือกไฟล์", + "domain": "โดเมน", + "add_certificate": "เพิ่มใบรับรอง", + "add_cert_file": "เพิ่มไฟล์ใบรับรอง", + "add_key_file": "เพิ่มไฟล์คีย์", + "add_pfx_file": "เพิ่มไฟล์ PFX", + "global_defaults": "ค่าเริ่มต้นส่วนกลาง", + "add_domain_override": "เพิ่มการแทนที่โดเมน", + "domain_override": "การแทนที่โดเมน", + "manage_domains_overrides": "จัดการการแทนที่โดเมน", + "add_domain": "เพิ่มโดเมน", + "remove_domain": "นำโดเมนออก", + "ca_certificate": "ใบรับรอง CA", + "ca_certificates": "ใบรับรอง CA", + "ca_certificates_support": "Hoppscotch รองรับไฟล์ .crt, .cer หรือ .pem ที่มีใบรับรองหนึ่งรายการหรือมากกว่า", + "proxy_capabilities": "Hoppscotch Agent และแอปเดสก์ท็อปรองรับ proxy แบบ HTTP/HTTPS/SOCKS พร้อมการรองรับ NTLM และ Basic Auth", + "proxy_auth": "คุณยังสามารถใส่ชื่อผู้ใช้และรหัสผ่านใน URL ได้ด้วย" + }, + "shared_requests": { + "button": "ปุ่ม", + "button_info": "สร้างปุ่ม 'Run in Hoppscotch' สำหรับเว็บไซต์ บล็อก หรือ README ของคุณ", + "copy_html": "คัดลอก HTML", + "copy_link": "คัดลอกลิงก์", + "copy_markdown": "คัดลอก Markdown", + "creating_widget": "กำลังสร้างวิดเจ็ต", + "customize": "ปรับแต่ง", + "deleted": "ลบคำขอที่แชร์แล้ว", + "description": "เลือกวิดเจ็ต คุณสามารถเปลี่ยนและปรับแต่งได้ในภายหลัง", + "embed": "ฝัง", + "embed_info": "เพิ่ม 'Hoppscotch API Playground' ขนาดเล็กลงในเว็บไซต์ บล็อก หรือเอกสารของคุณ", + "link": "ลิงก์", + "link_info": "สร้างลิงก์ที่แชร์ได้เพื่อแชร์กับใครก็ตามบนอินเทอร์เน็ตด้วยสิทธิ์การดู", + "modified": "แก้ไขคำขอที่แชร์แล้ว", + "not_found": "ไม่พบคำขอที่แชร์", + "open_new_tab": "เปิดในแท็บใหม่", + "preview": "ดูตัวอย่าง", + "run_in_hoppscotch": "Run in Hoppscotch", + "theme": { + "dark": "มืด", + "light": "สว่าง", + "system": "ระบบ", + "title": "ธีม" + }, + "action": "การกระทำ", + "clear_filter": "ล้างตัวกรอง", + "confirm_request_deletion": "ยืนยันการลบคำขอที่แชร์ที่เลือก?", + "copy": "คัดลอก", + "created_on": "สร้างเมื่อ", + "delete": "ลบ", + "email": "อีเมล", + "filter": "ตัวกรอง", + "filter_by_email": "กรองตามอีเมล", + "id": "ID", + "load_list_error": "ไม่สามารถโหลดรายการคำขอที่แชร์ได้", + "no_requests": "ไม่พบคำขอที่แชร์", + "open_request": "เปิดคำขอ", + "properties": "คุณสมบัติ", + "request": "คำขอ", + "show_more": "แสดงเพิ่มเติม", + "title": "คำขอที่แชร์", + "url": "URL" + }, + "shortcut": { + "general": { + "close_current_menu": "ปิดเมนูปัจจุบัน", + "command_menu": "เมนูค้นหาและคำสั่ง", + "help_menu": "เมนูช่วยเหลือ", + "show_all": "แป้นพิมพ์ลัด", + "title": "ทั่วไป", + "comment_uncomment": "ใส่/ยกเลิกคอมเมนต์", + "close_tab": "ปิดแท็บ", + "undo": "เลิกทำ", + "redo": "ทำซ้ำ" + }, + "miscellaneous": { + "invite": "เชิญผู้คนเข้าสู่ Hoppscotch", + "title": "อื่น ๆ" + }, + "navigation": { + "back": "กลับไปยังหน้าก่อนหน้า", + "documentation": "ไปยังหน้าเอกสารประกอบ", + "forward": "ไปยังหน้าถัดไป", + "graphql": "ไปยังหน้า GraphQL", + "profile": "ไปยังหน้าโปรไฟล์", + "realtime": "ไปยังหน้า Realtime", + "rest": "ไปยังหน้า REST", + "settings": "ไปยังหน้าการตั้งค่า", + "title": "การนำทาง" + }, + "others": { + "prettify": "จัดรูปแบบเนื้อหาของเอดิเตอร์", + "title": "อื่น ๆ" + }, + "request": { + "delete_method": "เลือกเมธอด DELETE", + "get_method": "เลือกเมธอด GET", + "head_method": "เลือกเมธอด HEAD", + "import_curl": "นำเข้า cURL", + "method": "เมธอด", + "next_method": "เลือกเมธอดถัดไป", + "post_method": "เลือกเมธอด POST", + "previous_method": "เลือกเมธอดก่อนหน้า", + "put_method": "เลือกเมธอด PUT", + "rename": "เปลี่ยนชื่อคำขอ", + "reset_request": "รีเซ็ตคำขอ", + "save_request": "บันทึกคำขอ", + "save_to_collections": "บันทึกไปยังคอลเลกชัน", + "send_request": "ส่งคำขอ", + "share_request": "แชร์คำขอ", + "show_code": "สร้างสไนปเป็ตโค้ด", + "title": "คำขอ", + "focus_url": "โฟกัสที่แถบ URL" + }, + "response": { + "copy": "คัดลอกการตอบกลับไปยังคลิปบอร์ด", + "download": "ดาวน์โหลดการตอบกลับเป็นไฟล์", + "title": "การตอบกลับ" + }, + "tabs": { + "title": "แท็บ", + "new_tab": "แท็บใหม่", + "close_tab": "ปิดแท็บ", + "reopen_tab": "เปิดแท็บที่ปิดไปใหม่", + "next_tab": "แท็บถัดไป", + "previous_tab": "แท็บก่อนหน้า", + "first_tab": "สลับไปยังแท็บแรก", + "last_tab": "สลับไปยังแท็บสุดท้าย", + "mru_switch": "สลับไปยังแท็บที่ใช้ล่าสุด (MRU)", + "mru_switch_reverse": "สลับไปยังแท็บที่ใช้ล่าสุดก่อนหน้า (MRU)" + }, + "theme": { + "black": "สลับธีมเป็นโหมดดำ", + "dark": "สลับธีมเป็นโหมดมืด", + "light": "สลับธีมเป็นโหมดสว่าง", + "system": "สลับธีมเป็นโหมดตามระบบ", + "title": "ธีม" + } + }, + "show": { + "code": "แสดงโค้ด", + "collection": "ขยายแผงคอลเลกชัน", + "more": "แสดงเพิ่มเติม", + "sidebar": "ขยายแถบด้านข้าง", + "password": "แสดงรหัสผ่าน" + }, + "socketio": { + "communication": "การสื่อสาร", + "connection_not_authorized": "การเชื่อมต่อ SocketIO นี้ไม่ได้ใช้การยืนยันตัวตนใด ๆ", + "event_name": "ชื่ออีเวนต์/หัวข้อ", + "events": "อีเวนต์", + "log": "บันทึก", + "url": "URL" + }, + "spotlight": { + "change_language": "เปลี่ยนภาษา", + "environments": { + "delete": "ลบสภาพแวดล้อมปัจจุบัน", + "duplicate": "ทำสำเนาสภาพแวดล้อมปัจจุบัน", + "duplicate_global": "ทำสำเนาสภาพแวดล้อมส่วนกลาง", + "edit": "แก้ไขสภาพแวดล้อมปัจจุบัน", + "edit_global": "แก้ไขสภาพแวดล้อมส่วนกลาง", + "new": "สร้างสภาพแวดล้อมใหม่", + "new_variable": "สร้างตัวแปรสภาพแวดล้อมใหม่", + "title": "สภาพแวดล้อม" + }, + "general": { + "chat": "แชทกับฝ่ายสนับสนุน", + "help_menu": "ความช่วยเหลือและการสนับสนุน", + "open_docs": "อ่านเอกสาร", + "open_github": "เปิดที่เก็บข้อมูล GitHub", + "open_keybindings": "แป้นพิมพ์ลัด", + "social": "โซเชียล", + "title": "ทั่วไป" + }, + "graphql": { + "connect": "เชื่อมต่อกับเซิร์ฟเวอร์", + "disconnect": "ตัดการเชื่อมต่อจากเซิร์ฟเวอร์" + }, + "miscellaneous": { + "invite": "เชิญเพื่อนของคุณมาใช้ Hoppscotch", + "title": "เบ็ดเตล็ด" + }, + "request": { + "save_as_new": "บันทึกเป็นคำขอใหม่", + "select_method": "เลือกเมธอด", + "switch_to": "สลับไปยัง", + "tab_authorization": "แท็บการให้สิทธิ์", + "tab_body": "แท็บเนื้อหา", + "tab_headers": "แท็บส่วนหัว", + "tab_parameters": "แท็บพารามิเตอร์", + "tab_pre_request_script": "แท็บสคริปต์ก่อนคำขอ", + "tab_query": "แท็บเคียวรี", + "tab_tests": "แท็บการทดสอบ", + "tab_variables": "แท็บตัวแปร" + }, + "response": { + "copy": "คัดลอกการตอบกลับ", + "download": "ดาวน์โหลดการตอบกลับเป็นไฟล์", + "title": "การตอบกลับ" + }, + "section": { + "interceptor": "Interceptor", + "interface": "อินเทอร์เฟซ", + "theme": "ธีม", + "user": "ผู้ใช้" + }, + "settings": { + "change_interceptor": "เปลี่ยน Interceptor", + "change_language": "เปลี่ยนภาษา", + "theme": { + "black": "ดำ", + "dark": "มืด", + "light": "สว่าง", + "system": "ตามการตั้งค่าระบบ" + } + }, + "tab": { + "close_current": "ปิดแท็บปัจจุบัน", + "close_others": "ปิดแท็บอื่นทั้งหมด", + "duplicate": "ทำสำเนาแท็บปัจจุบัน", + "new_tab": "เปิดแท็บใหม่", + "next": "สลับไปยังแท็บถัดไป", + "previous": "สลับไปยังแท็บก่อนหน้า", + "switch_to_first": "สลับไปยังแท็บแรก", + "switch_to_last": "สลับไปยังแท็บสุดท้าย", + "mru_switch": "สลับไปยังแท็บล่าสุด", + "mru_switch_reverse": "สลับไปยังแท็บล่าสุดก่อนหน้า", + "title": "แท็บ" + }, + "workspace": { + "delete": "ลบพื้นที่ทำงานปัจจุบัน", + "edit": "แก้ไขพื้นที่ทำงานปัจจุบัน", + "invite": "เชิญผู้คนเข้าสู่พื้นที่ทำงาน", + "new": "สร้างพื้นที่ทำงานใหม่", + "switch_to_personal": "สลับไปยังพื้นที่ทำงานส่วนตัวของคุณ", + "title": "พื้นที่ทำงาน" + }, + "phrases": { + "try": "ลอง", + "import_collections": "นำเข้าคอลเลกชัน", + "create_environment": "สร้างสภาพแวดล้อม", + "create_workspace": "สร้างพื้นที่ทำงาน", + "share_request": "แชร์คำขอ" + } + }, + "sse": { + "event_type": "ชนิดเหตุการณ์", + "log": "บันทึก", + "url": "URL" + }, + "state": { + "bulk_mode": "แก้ไขแบบกลุ่ม", + "bulk_mode_placeholder": "แต่ละรายการคั่นด้วยการขึ้นบรรทัดใหม่\nคีย์และค่าคั่นด้วย :\nใส่ # นำหน้าแถวที่ต้องการเพิ่มแต่ปิดใช้งานไว้", + "cleared": "ล้างแล้ว", + "connected": "เชื่อมต่อแล้ว", + "connected_to": "เชื่อมต่อกับ {name} แล้ว", + "connecting_to": "กำลังเชื่อมต่อกับ {name}...", + "connection_error": "เชื่อมต่อไม่สำเร็จ", + "connection_failed": "การเชื่อมต่อล้มเหลว", + "connection_lost": "การเชื่อมต่อขาดหาย", + "copied_interface_to_clipboard": "คัดลอกชนิดอินเทอร์เฟซ {language} ไปยังคลิปบอร์ดแล้ว", + "copied_to_clipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว", + "deleted": "ลบแล้ว", + "deprecated": "เลิกใช้แล้ว", + "disabled": "ปิดใช้งานแล้ว", + "disconnected": "ตัดการเชื่อมต่อแล้ว", + "disconnected_from": "ตัดการเชื่อมต่อจาก {name} แล้ว", + "docs_generated": "สร้างเอกสารแล้ว", + "download_failed": "ดาวน์โหลดไม่สำเร็จ", + "download_started": "เริ่มดาวน์โหลดแล้ว", + "enabled": "เปิดใช้งานแล้ว", + "experimental": "ทดลอง", + "file_imported": "นำเข้าไฟล์แล้ว", + "finished_in": "เสร็จสิ้นใน {duration} มิลลิวินาที", + "hide": "ซ่อน", + "history_deleted": "ลบประวัติแล้ว", + "linewrap": "ตัดบรรทัด", + "loading": "กำลังโหลด...", + "message_received": "ข้อความ: {message} มาถึงในหัวข้อ: {topic}", + "mqtt_subscription_failed": "เกิดข้อผิดพลาดขณะสมัครรับข้อมูลหัวข้อ: {topic}", + "no_content_found": "ไม่พบเนื้อหา", + "none": "ไม่มี", + "nothing_found": "ไม่พบสิ่งใดสำหรับ", + "published_error": "เกิดข้อผิดพลาดขณะเผยแพร่ข้อความ: {topic} ไปยังหัวข้อ: {message}", + "published_message": "เผยแพร่ข้อความ: {message} ไปยังหัวข้อ: {topic} แล้ว", + "reconnection_error": "เชื่อมต่อใหม่ไม่สำเร็จ", + "saved": "บันทึกแล้ว", + "show": "แสดง", + "subscribed_failed": "สมัครรับข้อมูลหัวข้อ: {topic} ไม่สำเร็จ", + "subscribed_success": "สมัครรับข้อมูลหัวข้อ: {topic} สำเร็จ", + "unsubscribed_failed": "ยกเลิกการสมัครรับข้อมูลหัวข้อ: {topic} ไม่สำเร็จ", + "unsubscribed_success": "ยกเลิกการสมัครรับข้อมูลหัวข้อ: {topic} สำเร็จ", + "waiting_send_request": "กำลังรอส่งคำขอ", + "user_deactivated": "บัญชีของคุณถูกปิดใช้งาน โปรดติดต่อผู้ดูแลระบบเพื่อเปิดใช้งานบัญชีของคุณอีกครั้ง", + "add_user_failure": "เพิ่มผู้ใช้เข้าพื้นที่ทำงานไม่สำเร็จ!!", + "add_user_success": "ผู้ใช้เป็นสมาชิกของพื้นที่ทำงานแล้ว!!", + "admin_failure": "ตั้งผู้ใช้เป็นผู้ดูแลระบบไม่สำเร็จ!!", + "admin_success": "ผู้ใช้เป็นผู้ดูแลระบบแล้ว!!", + "and": "และ", + "clear_selection": "ล้างการเลือก", + "configure_auth": "โปรดตั้งค่าผู้ให้บริการการตรวจสอบสิทธิ์จากการตั้งค่าผู้ดูแลระบบ หรือดูเอกสารเพื่อกำหนดค่าผู้ให้บริการการตรวจสอบสิทธิ์", + "confirm_admin_to_user": "คุณต้องการนำสถานะผู้ดูแลระบบออกจากผู้ใช้รายนี้หรือไม่?", + "confirm_admins_to_users": "คุณต้องการนำสถานะผู้ดูแลระบบออกจากผู้ใช้ที่เลือกหรือไม่?", + "confirm_delete_infra_token": "คุณแน่ใจหรือไม่ว่าต้องการลบโทเค็นโครงสร้างพื้นฐาน {tokenLabel}?", + "confirm_delete_invite": "คุณต้องการเพิกถอนคำเชิญที่เลือกหรือไม่?", + "confirm_delete_invites": "คุณต้องการเพิกถอนคำเชิญที่เลือกหรือไม่?", + "confirm_user_deletion": "ยืนยันการลบผู้ใช้?", + "confirm_users_deletion": "คุณต้องการลบผู้ใช้ที่เลือกหรือไม่?", + "confirm_user_to_admin": "คุณต้องการตั้งผู้ใช้รายนี้เป็นผู้ดูแลระบบหรือไม่?", + "confirm_users_to_admin": "คุณต้องการตั้งผู้ใช้ที่เลือกเป็นผู้ดูแลระบบหรือไม่?", + "confirm_user_deactivation": "ยืนยันการปิดใช้งานผู้ใช้?", + "confirm_logout": "ยืนยันการออกจากระบบ", + "created_on": "สร้างเมื่อ", + "continue_email": "ดำเนินการต่อด้วยอีเมล", + "continue_github": "ดำเนินการต่อด้วย Github", + "continue_google": "ดำเนินการต่อด้วย Google", + "continue_microsoft": "ดำเนินการต่อด้วย Microsoft", + "create_team_failure": "สร้างพื้นที่ทำงานไม่สำเร็จ!!", + "create_team_success": "สร้างพื้นที่ทำงานสำเร็จ!!", + "data_sharing_failure": "อัปเดตการตั้งค่าการแชร์ข้อมูลไม่สำเร็จ", + "delete_infra_token_failure": "เกิดข้อผิดพลาดขณะลบโทเค็นโครงสร้างพื้นฐาน", + "delete_invite_failure": "ลบคำเชิญไม่สำเร็จ!!", + "delete_invites_failure": "ลบคำเชิญที่เลือกไม่สำเร็จ!!", + "delete_invite_success": "ลบคำเชิญสำเร็จ!!", + "delete_invites_success": "ลบคำเชิญที่เลือกสำเร็จ!!", + "delete_request_failure": "ลบคำขอที่แชร์ไม่สำเร็จ!!", + "delete_request_success": "ลบคำขอที่แชร์สำเร็จ!!", + "delete_team_failure": "ลบพื้นที่ทำงานไม่สำเร็จ!!", + "delete_team_success": "ลบพื้นที่ทำงานสำเร็จ!!", + "delete_some_users_failure": "จำนวนผู้ใช้ที่ไม่ได้ลบ: {count}", + "delete_some_users_success": "จำนวนผู้ใช้ที่ลบแล้ว: {count}", + "delete_user_failed_only_one_admin": "ลบผู้ใช้ไม่สำเร็จ ต้องมีผู้ดูแลระบบอย่างน้อยหนึ่งคน!!", + "delete_user_failure": "ลบผู้ใช้ไม่สำเร็จ!!", + "delete_users_failure": "ลบผู้ใช้ที่เลือกไม่สำเร็จ!!", + "delete_user_success": "ลบผู้ใช้สำเร็จ!!", + "delete_users_success": "ลบผู้ใช้ที่เลือกสำเร็จ!!", + "email": "อีเมล", + "email_failure": "ส่งคำเชิญไม่สำเร็จ", + "email_signin_failure": "เข้าสู่ระบบด้วยอีเมลไม่สำเร็จ", + "email_success": "ส่งคำเชิญทางอีเมลสำเร็จ", + "emails_cannot_be_same": "คุณไม่สามารถเชิญตัวเองได้ โปรดเลือกที่อยู่อีเมลอื่น!!", + "enter_team_email": "โปรดป้อนอีเมลของเจ้าของพื้นที่ทำงาน!!", + "error": "เกิดข้อผิดพลาดบางอย่าง", + "error_auth_providers": "ไม่สามารถโหลดผู้ให้บริการการตรวจสอบสิทธิ์ได้", + "generate_infra_token_failure": "เกิดข้อผิดพลาดขณะสร้างโทเค็นโครงสร้างพื้นฐาน", + "github_signin_failure": "เข้าสู่ระบบด้วย Github ไม่สำเร็จ", + "google_signin_failure": "เข้าสู่ระบบด้วย Google ไม่สำเร็จ", + "infra_token_label_short": "ความยาวของป้ายชื่อโทเค็นโครงสร้างพื้นฐานสั้นเกินไป!!", + "invalid_email": "โปรดป้อนที่อยู่อีเมลที่ถูกต้อง", + "link_copied_to_clipboard": "คัดลอกลิงก์ไปยังคลิปบอร์ดแล้ว", + "logged_out": "ออกจากระบบแล้ว", + "login_as_admin": "และเข้าสู่ระบบด้วยบัญชีผู้ดูแลระบบ", + "login_using_email": "โปรดขอให้ผู้ใช้ตรวจสอบอีเมลหรือแชร์ลิงก์ด้านล่าง", + "login_using_link": "โปรดขอให้ผู้ใช้เข้าสู่ระบบโดยใช้ลิงก์ด้านล่าง", + "logout": "ออกจากระบบ", + "magic_link_sign_in": "คลิกที่ลิงก์เพื่อเข้าสู่ระบบ", + "magic_link_success": "เราได้ส่งลิงก์เวทมนตร์ไปยัง", + "microsoft_signin_failure": "เข้าสู่ระบบด้วย Microsoft ไม่สำเร็จ", + "newsletter_failure": "ไม่สามารถอัปเดตการตั้งค่าจดหมายข่าวได้", + "non_admin_logged_in": "เข้าสู่ระบบในฐานะผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ", + "non_admin_login": "คุณเข้าสู่ระบบแล้ว แต่คุณไม่ใช่ผู้ดูแลระบบ", + "owner_not_present": "ทีมต้องมีเจ้าของอย่างน้อยหนึ่งคน!!", + "privacy_policy": "นโยบายความเป็นส่วนตัว", + "reenter_email": "ป้อนอีเมลอีกครั้ง", + "remove_admin_failure": "นำสถานะผู้ดูแลระบบออกไม่สำเร็จ!!", + "remove_admin_failure_only_one_admin": "นำสถานะผู้ดูแลระบบออกไม่สำเร็จ ต้องมีผู้ดูแลระบบอย่างน้อยหนึ่งคน!!", + "remove_admin_success": "นำสถานะผู้ดูแลระบบออกแล้ว!!", + "remove_admin_from_users_failure": "นำสถานะผู้ดูแลระบบออกจากผู้ใช้ที่เลือกไม่สำเร็จ!!", + "remove_admin_from_users_success": "นำสถานะผู้ดูแลระบบออกจากผู้ใช้ที่เลือกแล้ว!!", + "remove_admin_to_delete_user": "นำสิทธิ์ผู้ดูแลระบบออกเพื่อลบผู้ใช้!!", + "remove_owner_to_delete_user": "นำสถานะเจ้าของทีมออกเพื่อลบผู้ใช้!!", + "remove_owner_failure_only_one_owner": "นำสมาชิกออกไม่สำเร็จ ทีมต้องมีเจ้าของอย่างน้อยหนึ่งคน!!", + "remove_admin_for_deletion": "นำสถานะผู้ดูแลระบบออกก่อนพยายามลบ!!", + "remove_owner_for_deletion": "ผู้ใช้หนึ่งคนหรือมากกว่าเป็นเจ้าของทีม อัปเดตความเป็นเจ้าของก่อนลบ!!", + "remove_invitee_failure": "นำผู้ได้รับเชิญออกไม่สำเร็จ!!", + "remove_invitee_success": "นำผู้ได้รับเชิญออกสำเร็จ!!", + "remove_member_failure": "ไม่สามารถนำสมาชิกออกได้!!", + "remove_member_success": "นำสมาชิกออกสำเร็จ!!", + "rename_team_failure": "เปลี่ยนชื่อพื้นที่ทำงานไม่สำเร็จ!!", + "rename_team_success": "เปลี่ยนชื่อพื้นที่ทำงานสำเร็จ!", + "rename_user_failure": "เปลี่ยนชื่อผู้ใช้ไม่สำเร็จ!!", + "rename_user_success": "เปลี่ยนชื่อผู้ใช้สำเร็จ!!", + "require_auth_provider": "คุณต้องตั้งค่าผู้ให้บริการการตรวจสอบสิทธิ์อย่างน้อยหนึ่งรายเพื่อเข้าสู่ระบบ", + "role_update_failed": "อัปเดตบทบาทไม่สำเร็จ!!", + "role_update_success": "อัปเดตบทบาทสำเร็จ!!", + "selected": "เลือกแล้ว {count} รายการ", + "self_host_docs": "เอกสารการโฮสต์ด้วยตนเอง", + "send_magic_link": "ส่งลิงก์เวทมนตร์", + "setup_failure": "การตั้งค่าล้มเหลว!!", + "setup_success": "ตั้งค่าเสร็จสมบูรณ์!!", + "sign_in_agreement": "การเข้าสู่ระบบถือว่าคุณยอมรับ", + "sign_in_options": "ตัวเลือกการเข้าสู่ระบบทั้งหมด", + "sign_out": "ออกจากระบบ", + "something_went_wrong": "เกิดข้อผิดพลาดบางอย่าง", + "team_name_too_short": "ชื่อพื้นที่ทำงานต้องมีความยาวอย่างน้อย 6 อักขระ!!", + "user_already_invited": "ส่งคำเชิญไม่สำเร็จ ผู้ใช้ได้รับเชิญแล้ว!!", + "user_not_found": "ไม่พบผู้ใช้ในโครงสร้างพื้นฐาน!!", + "users_to_admin_success": "ยกระดับผู้ใช้ที่เลือกเป็นสถานะผู้ดูแลระบบแล้ว!!", + "users_to_admin_failure": "ยกระดับผู้ใช้ที่เลือกเป็นสถานะผู้ดูแลระบบไม่สำเร็จ!!", + "loading_workspaces": "กำลังโหลดพื้นที่ทำงาน", + "loading_collections_in_workspace": "กำลังโหลดคอลเลกชันในพื้นที่ทำงาน" + }, + "support": { + "changelog": "อ่านเพิ่มเติมเกี่ยวกับรุ่นล่าสุด", + "chat": "มีคำถามใช่ไหม? แชทกับเรา!", + "community": "ถามคำถามและช่วยเหลือผู้อื่น", + "documentation": "อ่านเพิ่มเติมเกี่ยวกับ Hoppscotch", + "forum": "ถามคำถามและรับคำตอบ", + "github": "ติดตามเราบน Github", + "shortcuts": "เรียกดูแอปได้เร็วขึ้น", + "title": "การสนับสนุน", + "twitter": "ติดตามเราบน Twitter" + }, + "tab": { + "authorization": "การให้สิทธิ์", + "body": "เนื้อหา", + "close": "ปิดแท็บ", + "close_others": "ปิดแท็บอื่น", + "collections": "คอลเลกชัน", + "documentation": "เอกสาร", + "duplicate": "ทำสำเนาแท็บ", + "environments": "สภาพแวดล้อม", + "headers": "ส่วนหัว", + "history": "ประวัติ", + "mqtt": "MQTT", + "parameters": "พารามิเตอร์", + "post_request_script": "สคริปต์หลังคำขอ", + "pre_request_script": "สคริปต์ก่อนคำขอ", + "scripts": "สคริปต์", + "queries": "เคียวรี", + "query": "เคียวรี", + "schema": "สคีมา", + "shared_requests": "คำขอที่แชร์", + "codegen": "สร้างโค้ด", + "code_snippet": "ตัวอย่างโค้ด", + "mock_servers": "เซิร์ฟเวอร์จำลอง", + "share_tab_request": "แชร์คำขอในแท็บ", + "socketio": "Socket.IO", + "sse": "SSE", + "types": "ชนิด", + "variables": "ตัวแปร", + "websocket": "WebSocket", + "all_tests": "การทดสอบทั้งหมด", + "passed": "ผ่าน", + "failed": "ไม่ผ่าน" + }, + "team": { + "activity_logs": "บันทึกกิจกรรม", + "already_member": "อีเมลนี้เชื่อมโยงกับผู้ใช้ที่มีอยู่แล้ว", + "create_new": "สร้างพื้นที่ทำงานใหม่", + "deleted": "ลบพื้นที่ทำงานแล้ว", + "delete_all_activity_logs": "ลบบันทึกกิจกรรมทั้งหมด", + "successfully_deleted_all_activity_logs": "ลบบันทึกกิจกรรมทั้งหมดสำเร็จแล้ว", + "delete_activity_log": "ลบบันทึกกิจกรรม", + "deleted_activity_log": "ลบบันทึกกิจกรรมที่เลือกแล้ว", + "deleted_all_activity_logs": "ลบบันทึกกิจกรรมทั้งหมดแล้ว", + "edit": "แก้ไขพื้นที่ทำงาน", + "email": "อีเมล", + "email_do_not_match": "อีเมลไม่ตรงกับรายละเอียดบัญชีของคุณ โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "exit": "ออกจากพื้นที่ทำงาน", + "exit_disabled": "เฉพาะเจ้าของเท่านั้นที่ไม่สามารถออกจากพื้นที่ทำงานได้", + "failed_invites": "การเชิญที่ล้มเหลว", + "invalid_coll_id": "รหัสคอลเลกชันไม่ถูกต้อง", + "invalid_email_format": "รูปแบบอีเมลไม่ถูกต้อง", + "invalid_id": "รหัสพื้นที่ทำงานไม่ถูกต้อง โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "invalid_invite_link": "ลิงก์เชิญไม่ถูกต้อง", + "invalid_invite_link_description": "ลิงก์ที่คุณตามไปไม่ถูกต้อง โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "invalid_member_permission": "โปรดระบุสิทธิ์ที่ถูกต้องให้กับสมาชิกของพื้นที่ทำงาน", + "invite": "เชิญ", + "invite_more": "เชิญเพิ่มเติม", + "invite_tooltip": "เชิญผู้คนเข้าสู่พื้นที่ทำงานนี้", + "invited_to_team": "{owner} เชิญคุณเข้าร่วม {workspace}", + "join": "ยอมรับคำเชิญแล้ว", + "join_team": "เข้าร่วม {workspace}", + "joined_team": "คุณได้เข้าร่วม {workspace} แล้ว", + "joined_team_description": "ตอนนี้คุณเป็นสมาชิกของพื้นที่ทำงานนี้แล้ว", + "left": "คุณออกจากพื้นที่ทำงานแล้ว", + "login_to_continue": "เข้าสู่ระบบเพื่อดำเนินการต่อ", + "login_to_continue_description": "คุณต้องเข้าสู่ระบบเพื่อเข้าร่วมพื้นที่ทำงาน", + "logout_and_try_again": "ออกจากระบบและเข้าสู่ระบบด้วยบัญชีอื่น", + "member_has_invite": "ผู้ใช้มีคำเชิญอยู่แล้ว โปรดขอให้พวกเขาตรวจสอบกล่องจดหมายหรือเพิกถอนและส่งคำเชิญใหม่", + "member_not_found": "ไม่พบสมาชิก โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "member_removed": "นำผู้ใช้ออกแล้ว", + "member_role_updated": "อัปเดตบทบาทของผู้ใช้แล้ว", + "members": "สมาชิก", + "more_members": "+{count} เพิ่มเติม", + "name_length_insufficient": "ชื่อพื้นที่ทำงานต้องไม่ว่างเปล่า", + "name_updated": "อัปเดตชื่อพื้นที่ทำงานแล้ว", + "new": "พื้นที่ทำงานใหม่", + "new_created": "สร้างพื้นที่ทำงานใหม่แล้ว", + "new_name": "พื้นที่ทำงานใหม่ของฉัน", + "no_access": "คุณไม่มีสิทธิ์แก้ไขพื้นที่ทำงานนี้", + "no_invite_found": "ไม่พบคำเชิญ โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "no_request_found": "ไม่พบคำขอ", + "not_found": "ไม่พบพื้นที่ทำงาน โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "not_valid_viewer": "คุณไม่ใช่ผู้ดูที่ถูกต้อง โปรดติดต่อเจ้าของพื้นที่ทำงาน", + "parent_coll_move": "ไม่สามารถย้ายคอลเลกชันไปยังคอลเลกชันลูกได้", + "pending_invites": "คำเชิญที่รอดำเนินการ", + "permissions": "สิทธิ์", + "same_target_destination": "เป้าหมายและปลายทางเดียวกัน", + "saved": "บันทึกพื้นที่ทำงานแล้ว", + "select_a_team": "เลือกพื้นที่ทำงาน", + "success_invites": "การเชิญที่สำเร็จ", + "title": "พื้นที่ทำงาน", + "we_sent_invite_link": "กำลังส่งคำเชิญ", + "invite_sent_smtp_disabled": "สร้างลิงก์เชิญแล้ว", + "we_sent_invite_link_description": " ผู้รับเชิญใหม่จะได้รับลิงก์เพื่อเข้าร่วมพื้นที่ทำงาน สมาชิกที่มีอยู่และผู้รับเชิญที่รอดำเนินการจะไม่ได้รับลิงก์ใหม่", + "invite_sent_smtp_disabled_description": "การส่งอีเมลเชิญถูกปิดใช้งานสำหรับอินสแตนซ์นี้ของ Hoppscotch โปรดใช้ปุ่มคัดลอกลิงก์เพื่อคัดลอกและแชร์ลิงก์เชิญด้วยตนเอง", + "copy_invite_link": "คัดลอกลิงก์เชิญ", + "search_title": "คำขอของทีม", + "user_not_found": "ไม่พบผู้ใช้ในอินสแตนซ์นี้", + "invite_members": "เชิญสมาชิก" + }, + "team_environment": { + "deleted": "ลบสภาพแวดล้อมแล้ว", + "duplicate": "ทำซ้ำสภาพแวดล้อมแล้ว", + "not_found": "ไม่พบสภาพแวดล้อม" + }, + "test": { + "requests": "คำขอ", + "selection": "การเลือก", + "failed": "การทดสอบล้มเหลว", + "javascript_code": "โค้ด JavaScript", + "learn": "อ่านเอกสาร", + "passed": "การทดสอบผ่าน", + "report": "รายงานการทดสอบ", + "results": "ผลการทดสอบ", + "script": "สคริปต์", + "snippets": "ตัวอย่างโค้ด", + "run": "เรียกใช้", + "run_again": "เรียกใช้อีกครั้ง", + "stop": "หยุด", + "new_run": "การเรียกใช้ใหม่", + "iterations": "จำนวนรอบ", + "duration": "ระยะเวลา", + "avg_resp": "เวลาตอบกลับเฉลี่ย" + }, + "websocket": { + "communication": "การสื่อสาร", + "log": "บันทึก", + "message": "ข้อความ", + "protocols": "โปรโตคอล", + "url": "URL" + }, + "workspace": { + "change": "เปลี่ยนพื้นที่ทำงาน", + "personal": "พื้นที่ทำงานส่วนตัว", + "other_workspaces": "พื้นที่ทำงานของฉัน", + "team": "พื้นที่ทำงาน", + "title": "พื้นที่ทำงาน" + }, + "site_protection": { + "login_to_continue": "เข้าสู่ระบบเพื่อดำเนินการต่อ", + "login_to_continue_description": "คุณต้องเข้าสู่ระบบเพื่อเข้าถึง Hoppscotch Enterprise Instance นี้", + "error_fetching_site_protection_status": "เกิดข้อผิดพลาดขณะดึงสถานะการป้องกันไซต์" + }, + "access_tokens": { + "tab_title": "โทเค็น", + "section_title": "โทเค็นการเข้าถึงส่วนบุคคล", + "section_description": "โทเค็นการเข้าถึงส่วนบุคคลช่วยให้คุณเชื่อมต่อ CLI เข้ากับบัญชี Hoppscotch ของคุณ", + "last_used_on": "ใช้งานล่าสุดเมื่อ", + "expires_on": "หมดอายุเมื่อ", + "no_expiration": "ไม่มีวันหมดอายุ", + "expired": "หมดอายุแล้ว", + "copy_token_warning": "อย่าลืมคัดลอกโทเค็นการเข้าถึงส่วนบุคคลของคุณตอนนี้ คุณจะไม่สามารถดูได้อีก!", + "token_purpose": "โทเค็นนี้ใช้สำหรับอะไร?", + "expiration_label": "การหมดอายุ", + "scope_label": "ขอบเขต", + "workspace_read_only_access": "การเข้าถึงข้อมูลพื้นที่ทำงานแบบอ่านอย่างเดียว", + "personal_workspace_access_limitation": "โทเค็นการเข้าถึงส่วนบุคคลไม่สามารถเข้าถึงพื้นที่ทำงานส่วนตัวของคุณได้", + "generate_token": "สร้างโทเค็น", + "invalid_label": "โปรดระบุป้ายกำกับสำหรับโทเค็น", + "no_expiration_verbose": "โทเค็นนี้จะไม่มีวันหมดอายุ!", + "token_expires_on": "โทเค็นนี้จะหมดอายุในวันที่", + "generate_new_token": "สร้างโทเค็นใหม่", + "generate_modal_title": "โทเค็นการเข้าถึงส่วนบุคคลใหม่", + "deletion_success": "ลบโทเค็นการเข้าถึง {label} แล้ว" + }, + "collection_runner": { + "collection_id": "Collection ID", + "environment_id": "Environment ID", + "cli_collection_id_description": "Collection ID นี้จะถูกใช้โดยตัวเรียกใช้คอลเลกชัน CLI สำหรับ Hoppscotch", + "cli_environment_id_description": "Environment ID นี้จะถูกใช้โดยตัวเรียกใช้คอลเลกชัน CLI สำหรับ Hoppscotch", + "include_active_environment": "รวมสภาพแวดล้อมที่ใช้งานอยู่:", + "cli": "CLI", + "cli_comming_soon_for_personal_collection": "ตัวเรียกใช้คอลเลกชันสำหรับคอลเลกชันส่วนตัวใน CLI กำลังจะมาเร็วๆ นี้", + "delay": "หน่วงเวลา", + "negative_delay": "การหน่วงเวลาต้องไม่เป็นค่าลบ", + "ui": "ตัวเรียกใช้", + "running_collection": "กำลังเรียกใช้คอลเลกชัน", + "run_config": "การกำหนดค่าการเรียกใช้", + "advanced_settings": "การตั้งค่าขั้นสูง", + "stop_on_error": "หยุดการเรียกใช้หากเกิดข้อผิดพลาด", + "persist_responses": "เก็บการตอบกลับไว้", + "keep_variable_values": "เก็บค่าตัวแปรไว้", + "collection_not_found": "ไม่พบคอลเลกชัน อาจถูกลบหรือย้าย", + "empty_collection": "คอลเลกชันว่างเปล่า เพิ่มคำขอเพื่อเรียกใช้", + "no_response_persist": "ปัจจุบันตัวเรียกใช้คอลเลกชันถูกกำหนดค่าให้ไม่เก็บการตอบกลับไว้ การตั้งค่านี้จะป้องกันไม่ให้แสดงข้อมูลการตอบกลับ หากต้องการแก้ไขลักษณะการทำงานนี้ โปรดเริ่มการกำหนดค่าการเรียกใช้ใหม่", + "select_request": "เลือกคำขอเพื่อดูการตอบกลับและผลการทดสอบ", + "response_body_lost_rerun": "เนื้อหาการตอบกลับสูญหาย เรียกใช้คอลเลกชันอีกครั้งเพื่อรับเนื้อหาการตอบกลับ", + "cli_command_generation_description_cloud": "คัดลอกคำสั่งด้านล่างและเรียกใช้จาก CLI โปรดระบุโทเค็นการเข้าถึงส่วนตัว", + "cli_command_generation_description_sh": "คัดลอกคำสั่งด้านล่างและเรียกใช้จาก CLI โปรดระบุโทเค็นการเข้าถึงส่วนตัวและตรวจสอบ URL เซิร์ฟเวอร์อินสแตนซ์ SH ที่สร้างขึ้น", + "cli_command_generation_description_sh_with_server_url_placeholder": "คัดลอกคำสั่งด้านล่างและเรียกใช้จาก CLI โปรดระบุโทเค็นการเข้าถึงส่วนตัวและ URL เซิร์ฟเวอร์อินสแตนซ์ SH", + "run_collection": "เรียกใช้คอลเลกชัน", + "no_passed_tests": "ไม่มีการทดสอบที่ผ่าน", + "no_failed_tests": "ไม่มีการทดสอบที่ล้มเหลว" + }, + "ai_experiments": { + "generate_request_name": "สร้างชื่อคำขอโดยใช้ AI", + "generate_or_modify_request_body": "สร้างหรือแก้ไขเนื้อหาของคำขอ", + "modify_with_ai": "แก้ไขด้วย AI", + "generate": "สร้าง", + "generate_or_modify_request_body_input_placeholder": "กรอกพรอมต์เพื่อแก้ไขเนื้อหาของคำขอ", + "accept_change": "ยอมรับการเปลี่ยนแปลง", + "feedback_success": "ส่งความคิดเห็นสำเร็จแล้ว", + "feedback_failure": "ไม่สามารถส่งความคิดเห็นได้", + "feedback_thank_you": "ขอบคุณสำหรับความคิดเห็นของคุณ!", + "feedback_cta_text_long": "ให้คะแนนการสร้าง ช่วยให้เราปรับปรุงได้", + "feedback_cta_request_name": "คุณชอบชื่อที่สร้างขึ้นหรือไม่?", + "modify_request_body_error": "ไม่สามารถแก้ไขเนื้อหาของคำขอได้", + "generate_or_modify_prerequest_input_placeholder": "กรอกพรอมต์เพื่อสร้างหรือแก้ไขสคริปต์ก่อนคำขอ", + "generate_or_modify_post_request_script_input_placeholder": "กรอกพรอมต์เพื่อสร้างหรือแก้ไขสคริปต์หลังคำขอ", + "modify_post_request_script_error": "ไม่สามารถแก้ไขสคริปต์หลังคำขอได้", + "modify_prerequest_error": "ไม่สามารถแก้ไขสคริปต์ก่อนคำขอได้" + }, + "configs": { + "auth_providers": { + "callback_url": "CALLBACK URL", + "client_id": "CLIENT ID", + "client_secret": "CLIENT SECRET", + "description": "กำหนดค่าผู้ให้บริการการยืนยันตัวตนสำหรับเซิร์ฟเวอร์ของคุณ", + "provider_not_specified": "โปรดเปิดใช้งานผู้ให้บริการการยืนยันตัวตนอย่างน้อยหนึ่งราย", + "scope": "SCOPE", + "tenant": "TENANT", + "title": "ผู้ให้บริการการยืนยันตัวตน", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่าผู้ให้บริการการยืนยันตัวตนได้!!" + }, + "confirm_changes": "เซิร์ฟเวอร์ Hoppscotch ต้องรีสตาร์ทเพื่อให้การเปลี่ยนแปลงใหม่มีผล ยืนยันการเปลี่ยนแปลงที่ทำกับการกำหนดค่าเซิร์ฟเวอร์หรือไม่?", + "input_empty": "โปรดกรอกข้อมูลทุกช่องก่อนอัปเดตการกำหนดค่า", + "data_sharing": { + "title": "การแชร์ข้อมูล", + "description": "ช่วยปรับปรุง Hoppscotch โดยการแชร์ข้อมูลแบบไม่ระบุตัวตน", + "enable": "เปิดใช้งานการแชร์ข้อมูล", + "secondary_title": "การกำหนดค่าการแชร์ข้อมูล", + "see_shared": "ดูว่ามีการแชร์อะไรบ้าง", + "toggle_description": "แชร์ข้อมูลแบบไม่ระบุตัวตน", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่าการแชร์ข้อมูลได้!!" + }, + "load_error": "ไม่สามารถโหลดการกำหนดค่าเซิร์ฟเวอร์ได้", + "mail_configs": { + "address_from": "MAILER FROM ADDRESS", + "custom_smtp_configs": "ใช้การกำหนดค่า SMTP แบบกำหนดเอง", + "description": " กำหนดค่า smtp", + "enable_email_auth": "เปิดใช้งานการยืนยันตัวตนผ่านอีเมล", + "enable_smtp": "เปิดใช้งาน SMTP", + "host": "MAILER HOST", + "password": "MAILER PASSWORD", + "port": "MAILER PORT", + "secure": "MAILER SECURE", + "smtp_url": "MAILER SMTP URL", + "tls_reject_unauthorized": "TLS REJECT UNAUTHORIZED", + "title": "การกำหนดค่า SMTP", + "toggle_failure": "ไม่สามารถสลับสถานะ smtp ได้!!", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่า smtp ได้!!", + "user": "MAILER USER" + }, + "reset": { + "confirm_reset": "เซิร์ฟเวอร์ Hoppscotch ต้องรีสตาร์ทเพื่อให้การเปลี่ยนแปลงใหม่มีผล ยืนยันการรีเซ็ตการกำหนดค่าเซิร์ฟเวอร์หรือไม่?", + "description": "การกำหนดค่าเริ่มต้นจะถูกโหลดตามที่ระบุไว้ในไฟล์สภาพแวดล้อม", + "failure": "ไม่สามารถรีเซ็ตการกำหนดค่าได้!!", + "title": "รีเซ็ตการกำหนดค่า", + "info": "รีเซ็ตการกำหนดค่าเซิร์ฟเวอร์" + }, + "restart": { + "description": "เหลืออีก {duration} วินาทีก่อนที่หน้านี้จะโหลดใหม่โดยอัตโนมัติ", + "initiate": "กำลังเริ่มรีสตาร์ทเซิร์ฟเวอร์...", + "title": "เซิร์ฟเวอร์กำลังรีสตาร์ท" + }, + "save_changes": "บันทึกการเปลี่ยนแปลง", + "title": "การกำหนดค่า", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่าเซิร์ฟเวอร์ได้", + "restrict_access": "จำกัดการเข้าถึง", + "site_protection": { + "control_access": "ควบคุมว่าใครสามารถเข้าถึงแอป Hoppscotch ได้", + "description": "ปรับแต่งวิธีที่ผู้เยี่ยมชมเข้าถึงแอป Hoppscotch ของคุณโดยใช้การตั้งค่าการป้องกันไซต์", + "enable": "เปิดใช้งานการป้องกันไซต์", + "note": "ผู้ใช้ที่เยี่ยมชมแอป Hoppscotch จะเห็นหน้าเข้าสู่ระบบ จำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงแอป ยังคงต้องได้รับการอนุมัติจากผู้ดูแลระบบเพื่อการให้สิทธิ์", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่าการป้องกันไซต์ได้!!" + }, + "domain_whitelisting": { + "add_domain": "เพิ่มโดเมนใหม่", + "description": "ผู้ใช้ที่มี ID อีเมลลงทะเบียนในโดเมนที่อยู่ในบัญชีขาว ไม่จำเป็นต้องได้รับการอนุมัติอย่างชัดเจนจากผู้ดูแลระบบเพื่อเข้าถึงแอป Hoppscotch", + "enable": "เปิดใช้งานการกำหนดบัญชีขาวโดเมน", + "enter_domain": "ป้อนโดเมน", + "title": "โดเมนในบัญชีขาว", + "toggle_failure": "ไม่สามารถสลับสถานะการกำหนดบัญชีขาวโดเมนได้", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่าการกำหนดบัญชีขาวโดเมนได้!!" + }, + "oidc_configs": { + "auth_url": "Auth URL", + "callback_url": "Callback URL", + "client_id": "Client ID", + "client_secret": "Client Secret", + "description": "กำหนดค่า OIDC", + "enable": "เปิดใช้งานการยืนยันตัวตนผ่าน OIDC", + "issuer": "Issuer", + "provider_name": "ชื่อผู้ให้บริการ", + "scope": "Scope", + "title": "การกำหนดค่า OIDC", + "token_url": "Token URL", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่า OIDC ได้!!", + "user_info_url": "User Info URL" + }, + "saml": { + "audience": "Audience", + "callback_url": "Callback URL", + "certificate": "Certificate", + "description": "กำหนดค่า SAML", + "enable": "เปิดใช้งานการยืนยันตัวตนผ่าน SAML", + "entry_point": "Entry Point", + "issuer": "Issuer", + "title": "การกำหนดค่า SAML", + "update_failure": "ไม่สามารถอัปเดตการกำหนดค่า SAML SSO ได้!!", + "want_assertions_signed": "ลงนาม Assertions", + "want_response_signed": "ลงนาม Response" + } + }, + "data_sharing": { + "description": "แชร์ข้อมูลการใช้งานแบบไม่ระบุตัวตนเพื่อปรับปรุง Hoppscotch", + "enable": "เปิดใช้งานการแชร์ข้อมูล", + "see_shared": "ดูสิ่งที่แชร์", + "toggle_description": "แชร์ข้อมูลและทำให้ Hoppscotch ดีขึ้น", + "title": "ทำให้ Hoppscotch ดีขึ้น", + "welcome": "ยินดีต้อนรับสู่" + }, + "infra_tokens": { + "copy_token_warning": "อย่าลืมคัดลอก infra token ของคุณตอนนี้ คุณจะไม่สามารถดูได้อีก!", + "deletion_success": "ลบ infra token {label} แล้ว", + "empty": "ไม่มี infra token", + "expired": "หมดอายุแล้ว", + "expiration_label": "การหมดอายุ", + "expires_on": "หมดอายุในวันที่", + "generate_modal_title": "Infra Token ใหม่", + "generate_new_token": "สร้างโทเค็นใหม่", + "generate_token": "สร้างโทเค็น", + "invalid_label": "โปรดระบุป้ายกำกับสำหรับโทเค็น", + "last_used_on": "ใช้งานล่าสุดเมื่อ", + "no_expiration": "ไม่มีการหมดอายุ", + "no_expiration_verbose": "โทเค็นนี้จะไม่มีวันหมดอายุ!", + "section_description": "จัดการผู้ใช้ Hoppscotch ของคุณผ่าน API ด้วย Infra token", + "section_title": "Infra Tokens", + "tab_title": "Infra Tokens", + "token_expires_on": "โทเค็นนี้จะหมดอายุในวันที่", + "token_purpose": "กรอกป้ายกำกับเพื่อระบุโทเค็นนี้" + }, + "metrics": { + "dashboard": "แดชบอร์ด", + "no_metrics": "ไม่พบเมตริก", + "total_collections": "คอลเลกชันทั้งหมด", + "total_requests": "คำขอทั้งหมด", + "total_teams": "พื้นที่ทำงานทั้งหมด", + "total_users": "ผู้ใช้ทั้งหมด" + }, + "newsletter": { + "description": "รับข่าวสารล่าสุดของเรา", + "subscribe": "สมัครรับข้อมูล", + "title": "ติดต่อกับเรา", + "toggle_description": "รับข่าวสารล่าสุดเกี่ยวกับ Hoppscotch", + "unsubscribe": "ยกเลิกการสมัครรับข้อมูล" + }, + "teams": { + "add_member": "เพิ่มสมาชิก", + "add_members": "เพิ่มสมาชิก", + "add_new": "เพิ่มใหม่", + "admin": "ผู้ดูแลระบบ", + "admin_Email": "อีเมลผู้ดูแลระบบ", + "admin_id": "ID ผู้ดูแลระบบ", + "cancel": "ยกเลิก", + "confirm_team_deletion": "ยืนยันการลบพื้นที่ทำงานหรือไม่?", + "copy": "คัดลอก", + "create_team": "สร้างพื้นที่ทำงาน", + "date": "วันที่", + "delete_team": "ลบพื้นที่ทำงาน", + "details": "รายละเอียด", + "edit": "แก้ไข", + "editor": "ผู้แก้ไข", + "editor_description": "ผู้แก้ไขสามารถเพิ่ม แก้ไข และลบคำขอและคอลเลกชันได้", + "email": "อีเมลเจ้าของพื้นที่ทำงาน", + "email_address": "ที่อยู่อีเมล", + "email_title": "อีเมล", + "empty_name": "ชื่อทีมต้องไม่ว่างเปล่า!!", + "error": "เกิดข้อผิดพลาดบางอย่าง โปรดลองใหม่อีกครั้งในภายหลัง", + "id": "ID พื้นที่ทำงาน", + "invited_email": "อีเมลผู้ได้รับเชิญ", + "invited_on": "เชิญเมื่อ", + "invites": "คำเชิญ", + "load_info_error": "ไม่สามารถโหลดข้อมูลพื้นที่ทำงานได้", + "load_list_error": "ไม่สามารถโหลดรายการพื้นที่ทำงานได้", + "members": "จำนวนสมาชิก", + "no_invite": "ไม่มีคำเชิญ", + "no_invite_description": "เชิญทีมของคุณเพื่อเริ่มทำงานร่วมกัน", + "owner": "เจ้าของ", + "owner_description": " เจ้าของสามารถเพิ่ม แก้ไข และลบคำขอ คอลเลกชัน และสมาชิกพื้นที่ทำงานได้", + "permissions": "สิทธิ์", + "name": "ชื่อพื้นที่ทำงาน", + "no_members": "ไม่มีสมาชิกในพื้นที่ทำงานนี้ เพิ่มสมาชิกเข้าพื้นที่ทำงานนี้เพื่อทำงานร่วมกัน", + "no_pending_invites": "ไม่มีคำเชิญที่รอดำเนินการ", + "no_teams": "ไม่พบพื้นที่ทำงาน..", + "no_teams_description": "สร้างพื้นที่ทำงานเพื่อทำงานร่วมกับทีมของคุณ", + "pending_invites": "คำเชิญที่รอดำเนินการ", + "roles": "บทบาท", + "roles_description": "บทบาทใช้เพื่อควบคุมการเข้าถึงคอลเลกชันที่แชร์", + "remove": "นำออก", + "rename": "เปลี่ยนชื่อ", + "save": "บันทึก", + "save_changes": "บันทึกการเปลี่ยนแปลง", + "send_invite": "ส่งคำเชิญ", + "show_more": "แสดงเพิ่มเติม", + "team_details": "รายละเอียดพื้นที่ทำงาน", + "team_members": "สมาชิก", + "team_members_tab": "สมาชิกพื้นที่ทำงาน", + "teams": "พื้นที่ทำงาน", + "uid": "UID", + "unnamed": "(พื้นที่ทำงานที่ไม่มีชื่อ)", + "viewer": "ผู้ดู", + "viewer_description": "ผู้ดูสามารถดูและใช้คำขอได้เท่านั้น", + "valid_name": "โปรดป้อนชื่อพื้นที่ทำงานที่ถูกต้อง", + "valid_owner_email": "โปรดป้อนอีเมลเจ้าของที่ถูกต้อง" + }, + "users": { + "add_user": "เพิ่มผู้ใช้", + "admin": "ผู้ดูแลระบบ", + "admin_id": "รหัสผู้ดูแลระบบ", + "cancel": "ยกเลิก", + "created_on": "สร้างเมื่อ", + "copy_invite_link": "คัดลอกลิงก์คำเชิญ", + "copy_link": "คัดลอกลิงก์", + "date": "วันที่", + "delete": "ลบ", + "delete_user": "ลบผู้ใช้", + "delete_users": "ลบผู้ใช้", + "details": "รายละเอียด", + "edit": "แก้ไข", + "email": "อีเมล", + "email_address": "ที่อยู่อีเมล", + "empty_name": "ชื่อต้องไม่ว่างเปล่า!!", + "id": "รหัสผู้ใช้", + "invalid_user": "ผู้ใช้ไม่ถูกต้อง", + "invite_load_list_error": "ไม่สามารถโหลดรายการผู้ใช้ที่ได้รับเชิญได้", + "invite_user": "เชิญผู้ใช้", + "invited_by": "เชิญโดย", + "invited_on": "เชิญเมื่อ", + "invited_users": "ผู้ใช้ที่ได้รับเชิญ", + "invitee_email": "อีเมลผู้รับเชิญ", + "last_active_on": "ใช้งานล่าสุด", + "load_info_error": "ไม่สามารถโหลดข้อมูลผู้ใช้ได้", + "load_list_error": "ไม่สามารถโหลดรายการผู้ใช้ได้", + "make_admin": "ตั้งเป็นผู้ดูแลระบบ", + "name": "ชื่อ", + "new_user_added": "เพิ่มผู้ใช้ใหม่แล้ว", + "no_invite": "ไม่พบคำเชิญที่รอดำเนินการ", + "no_invite_description": "ไม่มีคำเชิญที่รอดำเนินการ! เริ่มเชิญเพื่อนร่วมทีมของคุณมาที่ Hoppscotch", + "no_shared_requests": "ไม่มีคำขอที่แชร์ซึ่งสร้างโดยผู้ใช้รายนี้", + "no_users": "ไม่พบผู้ใช้", + "not_available": "ไม่พร้อมใช้งาน", + "not_found": "ไม่พบผู้ใช้", + "pending_invites": "คำเชิญที่รอดำเนินการ", + "remove_admin_privilege": "นำสิทธิ์ผู้ดูแลระบบออก", + "remove_admin_status": "นำสถานะผู้ดูแลระบบออก", + "rename": "เปลี่ยนชื่อ", + "revoke_invitation": "เพิกถอนคำเชิญ", + "searchbar_placeholder": "ค้นหาตามชื่อหรืออีเมล..", + "send_invite": "ส่งคำเชิญ", + "show_more": "แสดงเพิ่มเติม", + "uid": "UID", + "unnamed": "(ผู้ใช้ไม่มีชื่อ)", + "user_not_found": "ไม่พบผู้ใช้ในระบบ!!", + "users": "ผู้ใช้", + "valid_email": "โปรดป้อนที่อยู่อีเมลที่ถูกต้อง", + "deactivate": "ปิดใช้งาน", + "deactivate_user": "ปิดใช้งานผู้ใช้" + }, + "organization": { + "login_to_continue_description": "คุณต้องเข้าสู่ระบบเพื่อเข้าร่วมอินสแตนซ์ขององค์กร", + "create_an_organization": "สร้างองค์กร", + "deactivate_user_failure": "ปิดใช้งานผู้ใช้ล้มเหลว!!", + "deactivate_user_success": "ปิดใช้งานผู้ใช้สำเร็จ!!", + "delete_account_description": "การดำเนินการนี้จะลบข้อมูลทั้งหมดที่เกี่ยวข้องกับบัญชี Hoppscotch ของคุณ รวมถึงองค์กรนี้และองค์กรอื่นๆ ที่คุณเป็นสมาชิก", + "delete_account": "ลบบัญชี Hoppscotch", + "user_deletion_failed_sole_admin": "ผู้ใช้เป็นผู้ดูแลระบบเพียงคนเดียวของอินสแตนซ์องค์กรอย่างน้อยหนึ่งแห่ง โปรดลดระดับผู้ใช้ก่อนพยายามลบ", + "user_deletion_failed_sole_team_owner": "ผู้ใช้เป็นเจ้าของทีมเพียงคนเดียวของอินสแตนซ์องค์กรอย่างน้อยหนึ่งแห่ง โปรดโอนความเป็นเจ้าของหรือลบพื้นที่ทำงานที่เกี่ยวข้องก่อนพยายามลบ", + "no_organizations": "คุณไม่ได้เป็นสมาชิกขององค์กรใดๆ", + "admin": "ผู้ดูแลระบบ" + }, + "organization_sidebar": { + "hoppscotch_cloud": "Hoppscotch Cloud", + "cloud_locked": "ไม่สามารถนำอินสแตนซ์เริ่มต้นออกได้", + "admin": "ผู้ดูแลระบบ", + "error_loading": "ไม่สามารถโหลดองค์กรได้", + "inactive_orgs": "องค์กรที่ไม่ใช้งาน", + "no_orgs_found": "ไม่พบองค์กร", + "no_active_orgs_found": "ไม่มีองค์กรที่ใช้งานอยู่", + "organizations_for": "องค์กรสำหรับ {email}", + "multi_account_notice": "แต่ละองค์กรจะเก็บการเข้าสู่ระบบของตนเอง โดยใช้บัญชีที่เข้าถึงล่าสุด", + "inactive_orgs_tooltip": "ติดต่อฝ่ายสนับสนุนเพื่อขอความช่วยเหลือ" + }, + "billing": { + "confirm": { + "update_seat_count": "คุณแน่ใจหรือไม่ว่าต้องการอัปเดตจำนวนที่นั่งเป็น {newSeatCount}?", + "update_billing_cycle": "คุณแน่ใจหรือไม่ว่าต้องการอัปเดตรอบการเรียกเก็บเงินเป็น {newBillingCycle}?" + }, + "cancel_subscription": "ยกเลิกการสมัครสมาชิก" + }, + "app_console": { + "entries": "รายการคอนโซล", + "no_entries": "ไม่มีรายการ" + }, + "mockServer": { + "create_modal": { + "title": "สร้าง Mock Server", + "name_label": "ชื่อ Mock Server", + "name_placeholder": "ป้อนชื่อ Mock Server", + "name_required": "ต้องระบุชื่อ Mock Server", + "collection_source_label": "แหล่งที่มาของคอลเลกชัน", + "existing_collection": "คอลเลกชันที่มีอยู่", + "new_collection": "คอลเลกชันใหม่", + "select_collection_label": "เลือกคอลเลกชัน", + "select_collection_placeholder": "เลือกคอลเลกชัน", + "collection_required": "กรุณาเลือกคอลเลกชัน", + "collection_name_label": "ชื่อคอลเลกชัน", + "collection_name_placeholder": "ป้อนชื่อคอลเลกชัน", + "collection_name_required": "ต้องระบุชื่อคอลเลกชัน", + "request_config_label": "การกำหนดค่าคำขอ", + "add_request": "เพิ่มคำขอ", + "create_button": "สร้าง Mock Server", + "success": "สร้าง Mock Server สำเร็จ", + "error": "ไม่สามารถสร้าง Mock Server ได้", + "no_collections": "ไม่มีคอลเลกชันที่ใช้ได้" + }, + "edit_modal": { + "title": "แก้ไข Mock Server", + "name_label": "ชื่อ Mock Server", + "name_placeholder": "ป้อนชื่อ Mock Server", + "name_required": "ต้องระบุชื่อ Mock Server", + "active_label": "ใช้งานอยู่", + "url_label": "URL ของ Mock Server", + "collection_label": "คอลเลกชัน", + "update_button": "อัปเดต Mock Server", + "success": "อัปเดต Mock Server สำเร็จ", + "error": "ไม่สามารถอัปเดต Mock Server ได้", + "url_copied": "คัดลอก URL ไปยังคลิปบอร์ดแล้ว" + }, + "dashboard": { + "title": "Mock Server", + "subtitle": "สร้างและจัดการ Mock Server ของ API ของคุณ", + "create_button": "สร้าง Mock Server", + "create_first": "สร้าง Mock Server แรกของคุณ", + "empty_title": "ไม่พบ Mock Server", + "empty_description": "สร้าง Mock Server จากคอลเลกชัน API ของคุณ เพื่อให้สามารถพัฒนาฝั่งหน้าเว็บและมือถือได้โดยไม่ต้องพึ่งพาแบ็กเอนด์", + "collection": "คอลเลกชัน", + "active": "ใช้งานอยู่", + "inactive": "ไม่ใช้งาน", + "mock_url": "Mock URL", + "endpoints": "เอนด์พอยต์", + "created": "สร้างเมื่อ", + "view_collection": "ดูคอลเลกชัน", + "documentation": "เอกสารประกอบ", + "doc_description": "ใช้ URL นี้เป็น URL ฐานของ API ในแอปพลิเคชันของคุณ:", + "url_copied": "คัดลอก URL ของ Mock Server ไปยังคลิปบอร์ดแล้ว", + "delete_title": "ลบ Mock Server", + "delete_description": "คุณแน่ใจหรือไม่ว่าต้องการลบ Mock Server นี้?", + "delete_success": "ลบ Mock Server สำเร็จ", + "delete_error": "ไม่สามารถลบ Mock Server ได้" + } + } +} diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index ea33bc16cad..5955d76b93d 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/common", "private": true, - "version": "2026.5.0", + "version": "2026.6.0", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", "test": "vitest --run", @@ -41,7 +41,7 @@ "@hoppscotch/js-sandbox": "workspace:^", "@hoppscotch/kernel": "workspace:^", "@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#9d4528be4f385bccbe46859631d31aa2ee1ec0b6", - "@hoppscotch/ui": "0.2.5", + "@hoppscotch/ui": "0.2.6", "@hoppscotch/vue-toasted": "0.1.0", "@lezer/highlight": "1.2.1", "@noble/curves": "2.2.0", @@ -53,24 +53,24 @@ "@types/markdown-it": "14.1.2", "@types/node": "24.10.1", "@unhead/vue": "2.1.12", - "@urql/core": "6.0.1", + "@urql/core": "6.0.2", "@urql/devtools": "2.0.3", "@urql/exchange-auth": "3.0.0", - "@vueuse/core": "14.2.1", + "@vueuse/core": "14.3.0", "acorn-walk": "8.3.5", "aws4fetch": "1.0.20", - "axios": "1.15.2", + "axios": "1.18.0", "buffer": "6.0.3", "cookie-es": "2.0.0", "dioc": "3.0.2", - "dompurify": "3.4.3", + "dompurify": "3.4.11", "esprima": "4.0.1", "events": "3.3.0", "fp-ts": "2.16.11", "globalthis": "1.0.4", "graphql": "16.13.2", "graphql-language-service-interface": "2.10.2", - "graphql-tag": "2.12.6", + "graphql-tag": "2.12.7", "hawk": "9.0.2", "highlight.js": "11.11.1", "highlightjs-curl": "1.3.0", @@ -78,11 +78,11 @@ "io-ts": "2.2.22", "jq-wasm": "1.1.0-jq-1.8.1", "js-md5": "0.8.3", - "js-yaml": "4.1.1", + "js-yaml": "4.2.0", "jsonc-parser": "3.3.1", "lodash-es": "4.18.1", "lossless-json": "4.3.0", - "markdown-it": "14.1.1", + "markdown-it": "14.2.0", "minisearch": "7.2.0", "monaco-editor": "0.55.1", "nprogress": "0.2.0", @@ -90,7 +90,7 @@ "path": "0.12.7", "postman-collection": "5.3.0", "process": "0.11.10", - "qs": "6.15.1", + "qs": "6.15.2", "quicktype-core": "23.2.6", "rollup": "4.60.2", "rxjs": "7.8.2", @@ -111,15 +111,15 @@ "util": "0.12.5", "uuid": "13.0.0", "verzod": "0.4.0", - "vue": "3.5.34", - "vue-i18n": "11.4.0", + "vue": "3.5.38", + "vue-i18n": "11.4.6", "vue-json-pretty": "2.6.0", "vue-pdf-embed": "2.1.4", "vue-router": "4.6.4", "vue-tippy": "6.7.1", "vuedraggable-es": "4.1.1", "wonka": "6.3.6", - "workbox-window": "7.4.0", + "workbox-window": "7.4.1", "xml-formatter": "3.7.0", "yargs-parser": "22.0.0", "zod": "3.25.32" @@ -137,9 +137,9 @@ "@graphql-codegen/typescript-urql-graphcache": "3.1.1", "@graphql-codegen/urql-introspection": "3.0.1", "@graphql-typed-document-node/core": "3.2.0", - "@iconify-json/lucide": "1.2.107", + "@iconify-json/lucide": "1.2.114", "@import-meta-env/cli": "0.7.4", - "@intlify/unplugin-vue-i18n": "11.1.2", + "@intlify/unplugin-vue-i18n": "11.2.4", "@relmify/jest-fp-ts": "2.1.1", "@rushstack/eslint-patch": "1.16.1", "@types/har-format": "1.2.16", @@ -151,28 +151,28 @@ "@types/qs": "6.15.1", "@types/splitpanes": "2.2.6", "@types/yargs-parser": "21.0.3", - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@vitejs/plugin-vue": "6.0.6", - "@vue/compiler-sfc": "3.5.34", - "@vue/eslint-config-typescript": "14.7.0", - "@vue/runtime-core": "3.5.34", + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@vitejs/plugin-vue": "6.0.7", + "@vue/compiler-sfc": "3.5.38", + "@vue/eslint-config-typescript": "14.8.0", + "@vue/runtime-core": "3.5.38", "autoprefixer": "10.5.0", "cross-env": "10.1.0", "dotenv": "17.4.2", "eslint": "9.39.2", - "eslint-plugin-prettier": "5.5.5", - "eslint-plugin-vue": "10.9.0", + "eslint-plugin-prettier": "5.5.6", + "eslint-plugin-vue": "10.9.2", "glob": "13.0.6", "globals": "16.5.0", "jsdom": "27.4.0", "npm-run-all": "4.1.5", "openapi-types": "12.1.3", - "postcss": "8.5.10", - "prettier": "3.8.3", + "postcss": "8.5.15", + "prettier": "3.8.4", "prettier-plugin-tailwindcss": "0.7.2", "rollup-plugin-polyfill-node": "0.13.0", - "sass": "1.99.0", + "sass": "1.101.0", "tailwindcss": "3.4.16", "tsup": "8.5.1", "typescript": "5.9.3", @@ -187,7 +187,7 @@ "vite-plugin-pages-sitemap": "1.7.1", "vite-plugin-pwa": "1.2.0", "vite-plugin-vue-layouts": "0.11.0", - "vitest": "4.1.5", + "vitest": "4.1.9", "vue-tsc": "1.8.8" } } diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index 4572a7f2d44..051886f2f34 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -60,6 +60,7 @@ import IconUser from "~icons/lucide/user" import { getTeamCollectionJSON } from "~/helpers/backend/helpers" import { platform } from "~/platform" +import { sync } from "~/lib/sync/defs" import { initializeDownloadFile, @@ -142,12 +143,9 @@ const importToPersonalWorkspace = (collections: HoppCollection[]) => { sanitizedCollections.forEach(populateLocalStoresFromCollectionTree) - if ( - platform.sync.collections.importToPersonalWorkspace && - currentUser.value - ) { + if (sync.collections.importToPersonalWorkspace && currentUser.value) { // The SH adds the id to the collection and folders but for safety we remove it by sanitizeCollection - return platform.sync.collections.importToPersonalWorkspace( + return sync.collections.importToPersonalWorkspace( sanitizedCollections, ReqType.Rest ) diff --git a/packages/hoppscotch-common/src/components/collections/Properties.vue b/packages/hoppscotch-common/src/components/collections/Properties.vue index 5edb531c2d7..f97f94ad4e2 100644 --- a/packages/hoppscotch-common/src/components/collections/Properties.vue +++ b/packages/hoppscotch-common/src/components/collections/Properties.vue @@ -21,6 +21,7 @@
@@ -228,6 +231,12 @@ import preRequestLinter from "~/helpers/editor/linting/preRequest" import testScriptLinter from "~/helpers/editor/linting/testScript" import { copyToClipboard } from "~/helpers/utils/clipboard" import { useService } from "dioc/vue" +import { useReadonlyStream } from "@composables/stream" +import { + aggregateEnvsWithCurrentValue$, + getAggregateEnvsWithCurrentValue, +} from "~/newstore/environments" +import { transformInheritedCollectionVariablesToAggregateEnv } from "~/helpers/utils/inheritedCollectionVarTransformer" import { HoppCollection, @@ -255,6 +264,9 @@ export type EditingProperties = { isRootCollection: boolean path: string inheritedProperties?: HoppInheritedProperty + // Key the collection's secret/current values are stored under, computed + // authoritatively by `editProperties` (team → `id`, personal → `_ref_id`). + collectionStoreKey?: string } type HoppCollectionAuth = HoppRESTAuth | HoppGQLAuth type HoppCollectionHeaders = HoppRESTHeaders | GQLHeader[] @@ -307,6 +319,38 @@ const copyIcon = refAutoReset( const activeTab = useVModel(props, "modelValue", emit) const activeScriptsTab = ref<"pre-request" | "test-script">("pre-request") +const aggregateEnvs = useReadonlyStream( + aggregateEnvsWithCurrentValue$, + getAggregateEnvsWithCurrentValue() +) + +// Surfaces the prop's already-keyed store ID so `envs` can pass it as +// `sourceEnvID` — lets the env tooltip resolve the collection's own secrets. +const collectionStoreKey = computed( + () => props.editingProperties.collectionStoreKey ?? "" +) + +const envs = computed(() => { + const collectionVars = editableCollection.value.variables.map((v) => ({ + key: v.key, + currentValue: v.currentValue, + initialValue: v.initialValue, + sourceEnv: "CollectionVariable", + sourceEnvID: collectionStoreKey.value, + secret: v.secret, + })) + + const inheritedVars = transformInheritedCollectionVariablesToAggregateEnv( + props.editingProperties.inheritedProperties?.variables ?? [], + true + ) + + // Note: request-level variables are intentionally NOT merged here since + // there is no single active request in scope when editing collection-level + // properties. + return [...collectionVars, ...inheritedVars, ...aggregateEnvs.value] +}) + const activeTabIsDetails = computed(() => activeTab.value === "details") const EXPERIMENTAL_SCRIPTING_SANDBOX = useSetting( @@ -375,6 +419,7 @@ const persistUnsavedChanges = async ( isRootCollection: props.editingProperties.isRootCollection ?? false, path: props.editingProperties.path, inheritedProperties: props.editingProperties.inheritedProperties, + collectionStoreKey: props.editingProperties.collectionStoreKey, }) ) } diff --git a/packages/hoppscotch-common/src/components/collections/Variables.vue b/packages/hoppscotch-common/src/components/collections/Variables.vue index 9fe8a66c04d..07cabe10826 100644 --- a/packages/hoppscotch-common/src/components/collections/Variables.vue +++ b/packages/hoppscotch-common/src/components/collections/Variables.vue @@ -223,6 +223,9 @@ const props = defineProps<{ modelValue: HoppCollectionVariable[] inheritedProperties?: HoppInheritedProperty hasTeamWriteAccess: boolean + // Store key this collection's secret/current values are saved under; lets the + // env tooltip resolve own-collection secrets (set by Properties.vue). + collectionStoreKey?: string }>() type SelectedEnv = "variables" | "secret" @@ -290,6 +293,7 @@ const liveEnvs = computed(() => { A.map((env) => ({ ...env, sourceEnv: "CollectionVariable", + sourceEnvID: props.collectionStoreKey ?? "", })) ) const parentInheritedVariables = diff --git a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue index 77ebdf16c42..f1b72ccc904 100644 --- a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue @@ -25,6 +25,7 @@ import { initializeDownloadFile } from "~/helpers/import-export/export" import { useReadonlyStream } from "~/composables/stream" import { platform } from "~/platform" +import { sync } from "~/lib/sync/defs" import { appendGraphqlCollections, graphqlCollections$, @@ -239,11 +240,8 @@ const handleImportToStore = (gqlCollections: HoppCollection[]) => { const collectionsWithRefIds = gqlCollections.map(ensureRefIds) collectionsWithRefIds.forEach(populateLocalStoresFromCollectionTree) - if ( - platform.sync.collections.importToPersonalWorkspace && - currentUser.value - ) { - return platform.sync.collections.importToPersonalWorkspace( + if (sync.collections.importToPersonalWorkspace && currentUser.value) { + return sync.collections.importToPersonalWorkspace( collectionsWithRefIds, ReqType.Gql ) diff --git a/packages/hoppscotch-common/src/components/collections/index.vue b/packages/hoppscotch-common/src/components/collections/index.vue index 0c731018d9e..efa2785e95f 100644 --- a/packages/hoppscotch-common/src/components/collections/index.vue +++ b/packages/hoppscotch-common/src/components/collections/index.vue @@ -3442,10 +3442,11 @@ const editProperties = async (payload: { ) } + const storeID = (collection as HoppCollection)._ref_id ?? collectionId! + const collectionVariables = pipe( (collection as HoppCollection).variables ?? [], A.mapWithIndex((index, e) => { - const storeID = (collection as HoppCollection)._ref_id ?? collectionId! const stored = getSecretValues(e.secret, index, storeID) return { ...e, @@ -3466,6 +3467,10 @@ const editProperties = async (payload: { isRootCollection: isAlreadyInRoot(collectionIndex), path: collectionIndex, inheritedProperties, + // Persist the exact key secrets/current values were read under, so the + // properties modal resolves them without re-deriving (and diverging from) + // this keying. + collectionStoreKey: storeID, } } else { const parentIndex = collectionIndex.split("/").slice(0, -1).join("/") // remove last folder to get parent folder @@ -3539,6 +3544,8 @@ const editProperties = async (payload: { isRootCollection: isAlreadyInRoot(collectionIndex), path: collectionIndex, inheritedProperties, + // Team collections are keyed by `id` (mirrors the save-side keying). + collectionStoreKey: collectionId ?? "", } } diff --git a/packages/hoppscotch-common/src/components/cookies/AllModal.vue b/packages/hoppscotch-common/src/components/cookies/AllModal.vue index 6b9fa3b6f33..22de51691c7 100644 --- a/packages/hoppscotch-common/src/components/cookies/AllModal.vue +++ b/packages/hoppscotch-common/src/components/cookies/AllModal.vue @@ -89,6 +89,14 @@ :value="`${entry.name} => ${entry.value}`" readonly /> + + {{ t("cookies.modal.http_only") }} + { @@ -183,11 +197,37 @@ const currentInterceptorSupportsCookies = computed(() => { }) function addNewDomain() { - if (newDomainText.value.trim() === "") { + // Canonicalize through the service so the new row's key matches + // the form the eventual save uses. Without this the modal row + // and `cookieKey` would disagree (modal row keyed `Example.COM`, + // save key `example.com`), and two visually different + // entries that canonicalize to the same domain would add as + // separate rows then clobber each other at save time. + const trimmed = newDomainText.value.trim() + if (trimmed === "") { toast.error(`${t("cookies.modal.empty_domain")}`) return } - workingCookieJar.value.set(newDomainText.value, []) + const canon = cookieJarService.canonStoreDomain(trimmed) + // `upsertCookies` skips a domain that canonicalizes to empty or + // carries internal whitespace, so the modal would otherwise let + // the user create a row that vanishes silently on save. The + // validation mirrors the service contract and surfaces a + // localized error instead. + if (canon.length === 0 || /\s/.test(canon)) { + toast.error(`${t("cookies.modal.invalid_domain")}`) + return + } + // If the user types a domain that already has a row, `.set` with + // an empty array would wipe the existing cookies under that + // domain on save. The duplicate-add is treated as a no-op so an + // accidental re-type does not remove cookies the user can see in + // the same modal. + if (workingCookieJar.value.has(canon)) { + newDomainText.value = "" + return + } + workingCookieJar.value.set(canon, []) newDomainText.value = "" } @@ -206,8 +246,10 @@ function clearAllDomains() { watch( () => props.show, - (show) => { + async (show) => { if (show) { + await cookieJarService.whenReady() + baselineCookieJar.value = cloneDeep(cookieJarService.cookieJar.value) workingCookieJar.value = cloneDeep(cookieJarService.cookieJar.value) } } @@ -215,8 +257,88 @@ watch( const showEditModalFor = ref(null) -function saveCookieChanges() { - cookieJarService.cookieJar.value = workingCookieJar.value +function flatten(jar: Map): Cookie[] { + const out: Cookie[] = [] + for (const cookies of jar.values()) { + for (const c of cookies) { + out.push(c) + } + } + return out +} + +// NUL between fields, never a valid cookie character per RFC 6265, +// so the key cannot collide across different (domain, name, path) +// tuples the way a space separator can when a path contains +// whitespace. +const cookieKey = (c: Cookie) => + `${cookieJarService.canonStoreDomain(c.domain)}\u0000${c.name}\u0000${c.path && c.path.length > 0 ? c.path : "/"}` + +async function saveCookieChanges() { + const before = new Map() + for (const c of flatten(baselineCookieJar.value)) { + before.set(cookieKey(c), c) + } + const after = new Map() + for (const c of flatten(workingCookieJar.value)) { + after.set(cookieKey(c), c) + } + + const upserts: Cookie[] = [] + for (const [key, post] of after) { + const prior = before.get(key) + if (!prior || !isEqual(prior, post)) { + upserts.push(post) + } + } + + const removes: Array<{ domain: string; name: string; path?: string }> = [] + for (const [key, prior] of before) { + if (!after.has(key)) { + removes.push({ + domain: prior.domain, + name: prior.name, + path: prior.path, + }) + } + } + + // Domains the user removed from `workingCookieJar` may have + // gained new cookies in the live jar (response capture during + // the modal session). The delta against baseline would leave + // them alive even though the user clicked delete on the + // domain, so the removed-domain sweep walks baseline keys and + // catches any concurrent capture under those keys. + // + // The sweep is restricted to baseline keys deliberately. A + // domain that first appeared in the live jar during the modal + // session is in neither baseline nor working, and treating it + // as removed-by-the-user would delete cookies for a domain the + // user never saw and never decided about. Clear All has the + // same constraint, the at-open baseline is the only signal of + // what the user could have decided to remove. + const removedDomains = new Set() + for (const d of baselineCookieJar.value.keys()) { + if (!workingCookieJar.value.has(d)) { + removedDomains.add(d) + } + } + for (const domain of removedDomains) { + const liveCookies = cookieJarService.cookieJar.value.get(domain) ?? [] + for (const c of liveCookies) { + const key = cookieKey(c) + if (!before.has(key)) { + removes.push({ domain: c.domain, name: c.name, path: c.path }) + } + } + } + + if (upserts.length > 0) { + await cookieJarService.upsertCookies(upserts) + } + if (removes.length > 0) { + await cookieJarService.deleteCookies(removes) + } hideModal() } @@ -243,7 +365,20 @@ function saveCookie(value: string) { const { domain } = showEditModalFor.value const entry = workingCookieJar.value.get(domain)! - const name = `Cookie-${entry.length}` + // Auto-name uses one past the highest existing `Cookie-N` so + // a delete-then-create flow does not produce two rows with + // the same name (which `cookieKey`'s `(domain, name, path)` + // merge would collapse to one on save and silently drop the + // duplicate). + let next = 0 + for (const existing of entry) { + const m = /^Cookie-(\d+)$/.exec(existing.name) + if (m) { + const n = Number(m[1]) + if (n >= next) next = n + 1 + } + } + const name = `Cookie-${next}` entry.push(makeUICookie(domain, value, name)) showEditModalFor.value = null return diff --git a/packages/hoppscotch-common/src/components/embeds/Request.vue b/packages/hoppscotch-common/src/components/embeds/Request.vue index efa515a13e8..dea18bb7b43 100644 --- a/packages/hoppscotch-common/src/components/embeds/Request.vue +++ b/packages/hoppscotch-common/src/components/embeds/Request.vue @@ -65,6 +65,7 @@ import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse" import { runRESTRequest$ } from "~/helpers/RequestRunner" import { HoppTab } from "~/services/tab" import { HoppRequestDocument } from "~/helpers/rest/document" +import { transformRequestVariablesToAggregateEnv } from "~/helpers/utils/environments" const toast = useToast() const t = useI18n() @@ -80,14 +81,11 @@ const requestCancelFunc: Ref<(() => void) | null> = ref(null) const loading = ref(false) -const tabRequestVariables = computed(() => { - return tab.value.document.request.requestVariables.map(({ key, value }) => ({ - key, - value, - secret: false, - sourceEnv: "RequestVariable", - })) -}) +const tabRequestVariables = computed(() => + transformRequestVariablesToAggregateEnv( + tab.value.document.request.requestVariables + ) +) const { subscribeToStream } = useStreamSubscriber() diff --git a/packages/hoppscotch-common/src/components/embeds/index.vue b/packages/hoppscotch-common/src/components/embeds/index.vue index 30f6cc676a9..f1460ab6a6d 100644 --- a/packages/hoppscotch-common/src/components/embeds/index.vue +++ b/packages/hoppscotch-common/src/components/embeds/index.vue @@ -36,6 +36,7 @@ import { HoppTab } from "~/services/tab" import { HoppRequestDocument } from "~/helpers/rest/document" import { platform } from "~/platform" import { RESTOptionTabs } from "../http/RequestOptions.vue" +import { transformRequestVariablesToAggregateEnv } from "~/helpers/utils/environments" const props = defineProps<{ modelTab: HoppTab @@ -55,14 +56,11 @@ const sharedRequestURL = computed(() => { return `${shortcodeBaseURL.value}/r/${props.sharedRequestID}` }) -const tabRequestVariables = computed(() => { - return tab.value.document.request.requestVariables.map(({ key, value }) => ({ - key, - value, - secret: false, - sourceEnv: "RequestVariable", - })) -}) +const tabRequestVariables = computed(() => + transformRequestVariablesToAggregateEnv( + tab.value.document.request.requestVariables + ) +) const showCustomEmbedsView = computed(() => { const { organization, ui } = platform diff --git a/packages/hoppscotch-common/src/components/history/Personal.vue b/packages/hoppscotch-common/src/components/history/Personal.vue index e235a5c62e2..82600e87b6f 100644 --- a/packages/hoppscotch-common/src/components/history/Personal.vue +++ b/packages/hoppscotch-common/src/components/history/Personal.vue @@ -160,39 +160,39 @@ diff --git a/packages/hoppscotch-sh-admin/src/components/settings/RateLimit.vue b/packages/hoppscotch-sh-admin/src/components/settings/RateLimit.vue index 874f483e68e..d6afd29d7cf 100644 --- a/packages/hoppscotch-sh-admin/src/components/settings/RateLimit.vue +++ b/packages/hoppscotch-sh-admin/src/components/settings/RateLimit.vue @@ -33,6 +33,11 @@ placeholder="e.g., 60 (in seconds)" :autofocus="false" class="!my-2 !bg-primaryLight flex-1" + :input-styles=" + isConfigFieldErrored('rate_limit', 'rate_limit_ttl') + ? '!border-red-500' + : '' + " @update:model-value=" validateNumberValue(rateLimitConfig.fields.rate_limit_ttl) " @@ -45,6 +50,11 @@ placeholder="e.g., 100 (requests per TTL)" :autofocus="false" class="!my-2 !bg-primaryLight flex-1" + :input-styles=" + isConfigFieldErrored('rate_limit', 'rate_limit_max') + ? '!border-red-500' + : '' + " @update:model-value=" validateNumberValue(rateLimitConfig.fields.rate_limit_max) " @@ -63,12 +73,18 @@ import { useVModel } from '@vueuse/core'; import { computed } from 'vue'; import { useI18n } from '~/composables/i18n'; import { useToast } from '~/composables/toast'; -import { ServerConfigs } from '~/helpers/configs'; +import { + ServerConfigs, + isNotValidNumber, + useConfigValidation, +} from '~/helpers/configs'; import IconHelpCircle from '~icons/lucide/help-circle'; const t = useI18n(); const toast = useToast(); +const { isConfigFieldErrored } = useConfigValidation(); + const props = defineProps<{ config: ServerConfigs; }>(); @@ -85,9 +101,11 @@ const rateLimitConfig = computed({ set: (value) => (workingConfigs.value.rateLimitConfigs = value), }); +// Reuse the save-guard validator so the inline toast and the save block agree: +// rate-limit values must be positive integers (>= 1). parseInt would accept +// "1.5" (→ 1) and pass silently here, only for the save to be blocked later. const validateNumberValue = (value: string | number) => { - const num = typeof value === 'string' ? parseInt(value, 10) : value; - if (isNaN(num) || num <= 0) { + if (isNotValidNumber(value)) { toast.error(t('configs.invalid_number')); } }; diff --git a/packages/hoppscotch-sh-admin/src/components/settings/SmtpConfiguration.vue b/packages/hoppscotch-sh-admin/src/components/settings/SmtpConfiguration.vue index ad464844611..5a4a8a024a3 100644 --- a/packages/hoppscotch-sh-admin/src/components/settings/SmtpConfiguration.vue +++ b/packages/hoppscotch-sh-admin/src/components/settings/SmtpConfiguration.vue @@ -61,6 +61,12 @@ :type="isMasked(field.key) ? 'password' : 'text'" :autofocus="false" class="!my-2 !bg-primaryLight flex-1 border border-divider rounded" + :class="{ + '!border-red-500': isConfigFieldErrored( + 'email', + field.key, + ), + }" input-styles="!border-0" >